diff options
Diffstat (limited to 'net/main.c')
| -rw-r--r-- | net/main.c | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/net/main.c b/net/main.c new file mode 100644 index 0000000..339f037 --- /dev/null +++ b/net/main.c @@ -0,0 +1,90 @@ +//http://www.saminiir.com/lets-code-tcp-ip-stack-1-ethernet-arp/ +//https://openvpn.net/tuntap + +#ifdef PLATFORM_LINUX + +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/socket.h> +#include <sys/ioctl.h> + +#include <fcntl.h> +#include <unistd.h> +#include <stdlib.h> +#include <stdio.h> +#include <stdint.h> +#include <errno.h> +#include <string.h> +#include <linux/if_tun.h> +#include <linux/if.h> + +#include "netdev.h" + +int fd; + +int tap_transmit(const void * p_data, uint16_t p_len) +{ + write(fd,p_data,p_len); + return 0; +} + +int main(int argc, char **argv) +{ + int err; + char dev[]="tap0"; + struct ifreq ifr; + + if( (fd = open("/dev/net/tun", O_RDWR)) < 0 ) { + printf("Cannot open TUN/TAP dev\n"); + exit(1); + } + + + memset(&ifr, 0, sizeof(ifr)); + ifr.ifr_flags = IFF_TAP | IFF_NO_PI; + strncpy(ifr.ifr_name, dev,IFNAMSIZ); + + if( (err = ioctl(fd, TUNSETIFF, (void *) &ifr)) < 0 ){ + printf("ioctl failed for TAP\n"); + close(fd); + return err; + } + + + struct netdev net_dev; + + + uint8_t mac[6]; + mac[0]=0x7a; + mac[1]=0xa4; + mac[2]=0x7b; + mac[3]=0x72; + mac[4]=0x56; + mac[5]=0xa2; + + memcpy(net_dev.hwaddr,mac,6); // use mac obtained from device + net_dev.ip=(192<<0)+(168<<8)+(0<<16)+(20<<24); // 192.168.0.20 // TODO: not hardcode! + net_dev.transmit=tap_transmit; + + uint8_t buf[1024]; + + while(1) + { + uint32_t len=read(fd,buf,1024); + + if(len==-1) + { + printf("read error: %s \n",strerror(errno)); + } + + printf("read %i bytes\n",len); + net_incoming(&net_dev,buf); + } + + return 0; +} + + +#endif + + |
