51#include <sys/socket.h>
56#define LOG_MODULE "BR"
57#define LOG_LEVEL LOG_LEVEL_NONE
61#include <linux/if_tun.h>
70extern const char *slip_config_ipaddr;
71extern char slip_config_tundev[32];
72extern uint16_t slip_config_basedelay;
76static int set_fd(fd_set *rset, fd_set *wset);
77static void handle_fd(fd_set *rset, fd_set *wset);
78static const struct select_callback tun_select_callback = {
83int ssystem(
const char *fmt, ...)
84 __attribute__((__format__ (__printf__, 1, 2)));
86ssystem(const
char *fmt, ...) __attribute__((__format__ (__printf__, 1, 2)));
89ssystem(const
char *fmt, ...)
94 vsnprintf(cmd,
sizeof(cmd), fmt, ap);
104 ssystem(
"ifconfig %s down", slip_config_tundev);
106 ssystem(
"sysctl -w net.ipv6.conf.all.forwarding=1");
108 ssystem(
"netstat -nr"
109 " | awk '{ if ($2 == \"%s\") print \"route delete -net \"$1; }'"
117 fprintf(stderr,
"signal %d\n", signo);
122ifconf(
const char *tundev,
const char *
ipaddr)
125 ssystem(
"ifconfig %s inet `hostname` up", tundev);
126 ssystem(
"ifconfig %s add %s", tundev,
ipaddr);
127#elif defined(__APPLE__)
128 ssystem(
"ifconfig %s inet6 %s up", tundev,
ipaddr);
129 ssystem(
"sysctl -w net.inet.ip.forwarding=1");
131 ssystem(
"ifconfig %s inet `hostname` %s up", tundev,
ipaddr);
132 ssystem(
"sysctl -w net.inet.ip.forwarding=1");
136 ssystem(
"ifconfig %s\n", tundev);
140devopen(
const char *dev,
int flags)
144 strncat(t, dev,
sizeof(t) - 5);
145 return open(t, flags);
155 if((fd = open(
"/dev/net/tun", O_RDWR)) < 0) {
159 memset(&ifr, 0,
sizeof(ifr));
164 ifr.ifr_flags = IFF_TUN | IFF_NO_PI;
166 strncpy(ifr.ifr_name, dev, IFNAMSIZ - 1);
169 if((err = ioctl(fd, TUNSETIFF, (
void *)&ifr)) < 0) {
173 strcpy(dev, ifr.ifr_name);
180 return devopen(dev, O_RDWR);
184static uint16_t delaymsec = 0;
185static uint32_t delaystartsec, delaystartmsec;
191 setvbuf(stdout, NULL, _IOLBF, 0);
195 LOG_INFO(
"Opening tun interface:%s\n", slip_config_tundev);
197 tunfd = tun_alloc(slip_config_tundev);
200 err(1,
"tun_init: tun_alloc failed");
203 select_set_callback(tunfd, &tun_select_callback);
205 fprintf(stderr,
"opened %s device ``/dev/%s''\n",
206 "tun", slip_config_tundev);
209 signal(SIGHUP, sigcleanup);
210 signal(SIGTERM, sigcleanup);
211 signal(SIGINT, sigcleanup);
212 ifconf(slip_config_tundev, slip_config_ipaddr);
216tun_output(uint8_t *data,
int len)
219 if(write(tunfd, data, len) != len) {
220 err(1,
"serial_to_tun: write");
227tun_input(
unsigned char *data,
int maxlen)
230 if((size = read(tunfd, data, maxlen)) == -1) {
231 err(1,
"tun_input: read");
250const struct uip_fallback_interface rpl_interface = {
258set_fd(fd_set *rset, fd_set *wset)
266handle_fd(fd_set *rset, fd_set *wset)
274 gettimeofday(&tv, NULL);
275 dmsec = (tv.tv_sec - delaystartsec) * 1000 + tv.tv_usec / 1000 - delaystartmsec;
279 if(dmsec > delaymsec) {
287 if(FD_ISSET(tunfd, rset)) {
293 if(slip_config_basedelay) {
295 gettimeofday(&tv, NULL);
296 delaymsec = slip_config_basedelay;
297 delaystartsec = tv.tv_sec;
298 delaystartmsec = tv.tv_usec / 1000;
Border router header file.
void tcpip_input(void)
Deliver an incoming packet to the TCP/IP stack.
#define uip_buf
Macro to access uip_aligned_buf as an array of bytes.
uint16_t uip_len
The length of the packet in the uip_buf buffer.
Header file for the logging system.
Include file for the Contiki low-layer network stack (NETSTACK)
Header file for the Packet buffer (packetbuf) management.
Header file for IPv6-related data structures.
static uip_ipaddr_t ipaddr
Pointer to prefix information option in uip_buf.
Header file for the uIP TCP/IP stack.