00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #define UIP_DRIPADDR0 192
00038 #define UIP_DRIPADDR1 168
00039 #define UIP_DRIPADDR2 0
00040 #define UIP_DRIPADDR3 1
00041
00042 #include <fcntl.h>
00043 #include <stdlib.h>
00044 #include <stdio.h>
00045 #include <unistd.h>
00046 #include <string.h>
00047 #include <sys/ioctl.h>
00048 #include <sys/socket.h>
00049 #include <sys/types.h>
00050 #include <sys/time.h>
00051 #include <sys/uio.h>
00052 #include <sys/socket.h>
00053
00054 #ifdef linux
00055 #include <sys/ioctl.h>
00056 #include <linux/if.h>
00057 #include <linux/if_tun.h>
00058 #define DEVTAP "/dev/net/tun"
00059 #else
00060 #define DEVTAP "/dev/tap0"
00061 #endif
00062
00063 #include "uip.h"
00064
00065 static int drop = 0;
00066 static int fd;
00067
00068
00069
00070 void
00071 tapdev_init(void)
00072 {
00073 char buf[1024];
00074
00075 fd = open(DEVTAP, O_RDWR);
00076 if(fd == -1) {
00077 perror("tapdev: tapdev_init: open");
00078 exit(1);
00079 }
00080
00081 #ifdef linux
00082 {
00083 struct ifreq ifr;
00084 memset(&ifr, 0, sizeof(ifr));
00085 ifr.ifr_flags = IFF_TAP|IFF_NO_PI;
00086 if (ioctl(fd, TUNSETIFF, (void *) &ifr) < 0) {
00087 perror(buf);
00088 exit(1);
00089 }
00090 }
00091 #endif
00092
00093 snprintf(buf, sizeof(buf), "ifconfig tap0 inet %d.%d.%d.%d",
00094 UIP_DRIPADDR0, UIP_DRIPADDR1, UIP_DRIPADDR2, UIP_DRIPADDR3);
00095 system(buf);
00096
00097 }
00098
00099 unsigned int
00100 tapdev_read(void)
00101 {
00102 fd_set fdset;
00103 struct timeval tv, now;
00104 int ret;
00105
00106 tv.tv_sec = 0;
00107 tv.tv_usec = 1000;
00108
00109
00110 FD_ZERO(&fdset);
00111 FD_SET(fd, &fdset);
00112
00113 ret = select(fd + 1, &fdset, NULL, NULL, &tv);
00114 if(ret == 0) {
00115 return 0;
00116 }
00117 ret = read(fd, uip_buf, UIP_BUFSIZE);
00118 if(ret == -1) {
00119 perror("tap_dev: tapdev_read: read");
00120 }
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131 return ret;
00132 }
00133
00134 void
00135 tapdev_send(void)
00136 {
00137 int ret;
00138
00139
00140
00141
00142
00143
00144
00145
00146 ret = write(fd, uip_buf, uip_len);
00147 if(ret == -1) {
00148 perror("tap_dev: tapdev_send: writev");
00149 exit(1);
00150 }
00151 }
00152