46 #include <sys/ioctl.h>
47 #include <sys/socket.h>
48 #include <sys/types.h>
51 #include <sys/socket.h>
55 #include <sys/ioctl.h>
57 #include <linux/if_tun.h>
58 #define DEVTAP "/dev/net/tun"
60 #define DEVTAP "/dev/tap0"
65 #include <netinet/in.h>
66 #include <netinet6/in6_var.h>
67 #include <netinet6/nd6.h>
70 #include <sys/errno.h>
71 #include <net/if_dl.h>
72 #include <net/route.h>
76 #include "contiki-net.h"
86 static unsigned long lasttime;
88 #define BUF ((struct uip_eth_hdr *)&uip_buf[0])
89 #define IPBUF ((struct uip_tcpip_hdr *)&uip_buf[UIP_LLH_LEN])
93 #define PRINTF(...) printf(__VA_ARGS__)
94 #define PRINT6ADDR(addr) PRINTF("%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x", ((uint8_t *)addr)[0], ((uint8_t *)addr)[1], ((uint8_t *)addr)[2], ((uint8_t *)addr)[3], ((uint8_t *)addr)[4], ((uint8_t *)addr)[5], ((uint8_t *)addr)[6], ((uint8_t *)addr)[7], ((uint8_t *)addr)[8], ((uint8_t *)addr)[9], ((uint8_t *)addr)[10], ((uint8_t *)addr)[11], ((uint8_t *)addr)[12], ((uint8_t *)addr)[13], ((uint8_t *)addr)[14], ((uint8_t *)addr)[15])
97 #define PRINT6ADDR(addr)
100 static void do_send(
void);
126 ret = select(fd + 1, &fdset,
NULL,
NULL, &tv);
133 PRINTF(
"tapdev6: read %d bytes (max %d)\n", ret,
UIP_BUFSIZE);
136 perror(
"tapdev_poll: read");
141 #if defined(__APPLE__)
142 static int reqfd = -1, sfd = -1, interface_index;
145 tapdev_init_darwin_routes(
void)
149 if(-1 == fstat(fd, &st)) {
150 perror(
"tapdev: fstat failed.");
156 struct in6_aliasreq addreq6 = { };
157 reqfd = socket(AF_INET6, SOCK_DGRAM, 0);
159 if(-1 == fcntl(reqfd, F_SETFD, FD_CLOEXEC)) {
160 perror(
"tapdev: fcntl failed.");
164 devname_r(st.st_rdev, S_IFCHR, addreq6.ifra_name,
165 sizeof(addreq6.ifra_name));
167 addreq6.ifra_addr.sin6_family = AF_INET6;
168 addreq6.ifra_addr.sin6_len =
sizeof(addreq6.ifra_addr);
169 addreq6.ifra_addr.sin6_addr.__u6_addr.__u6_addr16[0] =
UIP_HTONS(0xAAAA);
170 addreq6.ifra_addr.sin6_addr.__u6_addr.__u6_addr16[7] =
UIP_HTONS(0x0001);
172 addreq6.ifra_prefixmask.sin6_family = AF_INET6;
173 addreq6.ifra_prefixmask.sin6_len =
sizeof(addreq6.ifra_prefixmask);
174 addreq6.ifra_prefixmask.sin6_addr.__u6_addr.__u6_addr16[0] =
176 addreq6.ifra_prefixmask.sin6_addr.__u6_addr.__u6_addr16[1] =
178 addreq6.ifra_prefixmask.sin6_addr.__u6_addr.__u6_addr16[2] =
180 addreq6.ifra_prefixmask.sin6_addr.__u6_addr.__u6_addr16[3] =
183 addreq6.ifra_lifetime.ia6t_vltime = ND6_INFINITE_LIFETIME;
184 addreq6.ifra_lifetime.ia6t_pltime = ND6_INFINITE_LIFETIME;
185 addreq6.ifra_lifetime.ia6t_expire = ND6_INFINITE_LIFETIME;
186 addreq6.ifra_lifetime.ia6t_preferred = ND6_INFINITE_LIFETIME;
188 if(-1 == ioctl(reqfd, SIOCAIFADDR_IN6, &addreq6)) {
189 perror(
"tapdev: Uable to add address, call to ioctl failed.");
195 int s = socket(AF_ROUTE, SOCK_RAW, AF_INET6);
198 perror(
"tapdev: Unable to add route, call to socket() failed.");
205 interface_index = if_nametoindex(devname(st.st_rdev, S_IFCHR));
207 PRINTF(
"tapdev: if_nametoindex(devname(st.st_rdev, S_IFCHR)) = %d\n",
209 PRINTF(
"tapdev: devname(st.st_rdev, S_IFCHR) = %s\n",
210 devname(st.st_rdev, S_IFCHR));
213 struct rt_msghdr hdr;
214 struct sockaddr_in6 dst;
215 struct sockaddr_dl gw;
216 struct sockaddr_in6 mask;
219 msg.hdr.rtm_msglen =
sizeof(msg);
220 msg.hdr.rtm_version = RTM_VERSION;
221 msg.hdr.rtm_type = RTM_ADD;
222 msg.hdr.rtm_index = interface_index;
223 msg.hdr.rtm_flags = RTF_UP | RTF_STATIC;
224 msg.hdr.rtm_addrs = RTA_DST | RTA_GATEWAY | RTA_NETMASK;
225 msg.hdr.rtm_pid = getpid();
228 msg.dst.sin6_family = AF_INET6;
229 msg.dst.sin6_len =
sizeof(msg.dst);
230 msg.dst.sin6_addr.__u6_addr.__u6_addr16[0] =
UIP_HTONS(0xAAAA);
232 msg.gw.sdl_family = AF_LINK;
233 msg.gw.sdl_len =
sizeof(msg.gw);
234 msg.gw.sdl_index = interface_index;
236 msg.mask.sin6_family = AF_INET6;
237 msg.mask.sin6_len =
sizeof(msg.mask);
238 msg.mask.sin6_addr.__u6_addr.__u6_addr16[0] =
UIP_HTONS(0xFFFF);
239 msg.mask.sin6_addr.__u6_addr.__u6_addr16[1] =
UIP_HTONS(0xFFFF);
240 msg.mask.sin6_addr.__u6_addr.__u6_addr16[2] =
UIP_HTONS(0xFFFF);
241 msg.mask.sin6_addr.__u6_addr.__u6_addr16[3] =
UIP_HTONS(0xFFFF);
243 if(-1 == write(s, &msg,
sizeof(msg))) {
244 perror(
"tapdev: Unable to add route, call to write() failed.");
252 tapdev_cleanup_darwin_routes(
void)
255 struct rt_msghdr hdr;
256 struct sockaddr_in6 dst;
257 struct sockaddr_dl gw;
258 struct sockaddr_in6 mask;
261 msg.hdr.rtm_msglen =
sizeof(msg);
262 msg.hdr.rtm_version = RTM_VERSION;
263 msg.hdr.rtm_type = RTM_DELETE;
264 msg.hdr.rtm_index = interface_index;
265 msg.hdr.rtm_flags = RTF_UP | RTF_STATIC;
266 msg.hdr.rtm_addrs = RTA_DST | RTA_GATEWAY | RTA_NETMASK;
267 msg.hdr.rtm_pid = getpid();
270 msg.dst.sin6_family = AF_INET6;
271 msg.dst.sin6_len =
sizeof(msg.dst);
272 msg.dst.sin6_addr.__u6_addr.__u6_addr16[0] =
UIP_HTONS(0xAAAA);
274 msg.gw.sdl_family = AF_LINK;
275 msg.gw.sdl_len =
sizeof(msg.gw);
276 msg.gw.sdl_index = interface_index;
278 msg.mask.sin6_family = AF_INET6;
279 msg.mask.sin6_len =
sizeof(msg.mask);
280 msg.mask.sin6_addr.__u6_addr.__u6_addr16[0] =
UIP_HTONS(0xFFFF);
281 msg.mask.sin6_addr.__u6_addr.__u6_addr16[1] =
UIP_HTONS(0xFFFF);
282 msg.mask.sin6_addr.__u6_addr.__u6_addr16[2] =
UIP_HTONS(0xFFFF);
283 msg.mask.sin6_addr.__u6_addr.__u6_addr16[3] =
UIP_HTONS(0xFFFF);
284 if(-1 == write(sfd, &msg,
sizeof(msg))) {
285 perror(
"tapdev: Unable to delete route");
292 #endif // defined(__APPLE__)
299 fd = open(DEVTAP, O_RDWR);
301 perror(
"tapdev: tapdev_init: open");
308 memset(&ifr, 0,
sizeof(ifr));
309 ifr.ifr_flags = IFF_TAP|IFF_NO_PI;
310 if (ioctl(fd, TUNSETIFF, (
void *) &ifr) < 0) {
318 tapdev_init_darwin_routes();
333 snprintf(buf,
sizeof(buf),
"ifconfig tap0 up");
343 atexit(&tapdev_exit);
356 PRINTF(
"tapdev_send: sending %d bytes\n",
uip_len);
361 PRINTF(
"Dropped an output packet!\n");
366 ret = write(fd, uip_buf,
uip_len);
369 perror(
"tap_dev: tapdev_send: writev");
384 (&BUF->dest)->addr[0] = 0x33;
385 (&BUF->dest)->addr[1] = 0x33;
386 (&BUF->dest)->addr[2] = IPBUF->destipaddr.u8[12];
387 (&BUF->dest)->addr[3] = IPBUF->destipaddr.u8[13];
388 (&BUF->dest)->addr[4] = IPBUF->destipaddr.u8[14];
389 (&BUF->dest)->addr[5] = IPBUF->destipaddr.u8[15];
391 memcpy(&BUF->dest, lladdr, UIP_LLADDR_LEN);
393 memcpy(&BUF->src, &
uip_lladdr, UIP_LLADDR_LEN);
412 PRINTF(
"tapdev: Closing...\n");
415 tapdev_cleanup_darwin_routes();
uip_len
The length of the packet in the uip_buf buffer.
CCIF uip_lladdr_t uip_lladdr
Host L2 address.
Header file for the uIP TCP/IP stack.
#define NULL
The null pointer.
#define UIP_BUFSIZE
The size of the uIP packet buffer.
#define UIP_HTONS(n)
Convert 16-bit quantity from host byte order to network byte order.
Configuration options for uIP.