~mdw
/
secnet
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
test-example: USE mtu of 1400 not 500 (!)
[secnet]
/
tun.c
diff --git
a/tun.c
b/tun.c
index
3db998f
..
40bf6dd
100644
(file)
--- a/
tun.c
+++ b/
tun.c
@@
-116,8
+116,8
@@
static void tun_afterpoll(void *sst, struct pollfd *fds, int nfds)
}
if (fds[0].revents&POLLIN) {
BUF_ALLOC(st->buff,"tun_afterpoll");
}
if (fds[0].revents&POLLIN) {
BUF_ALLOC(st->buff,"tun_afterpoll");
- buffer_init(st->buff,
st->nl.max_start_pad
);
- l=read(st->fd,st->buff->start,st->buff->len-
st->nl.max_start_pad
);
+ buffer_init(st->buff,
calculate_max_start_pad()
);
+ l=read(st->fd,st->buff->start,st->buff->len-
calculate_max_start_pad()
);
if (l<0) {
fatal_perror("tun_afterpoll: read()");
}
if (l<0) {
fatal_perror("tun_afterpoll: read()");
}
@@
-166,8
+166,14
@@
static bool_t tun_set_route(void *sst, struct netlink_client *routes)
struct subnet_list *nets;
int32_t i;
int fd=-1;
struct subnet_list *nets;
int32_t i;
int fd=-1;
+ bool_t up;
- if (routes->up == routes->kup) return False;
+ if (routes->options & OPT_SOFTROUTE)
+ up = routes->up;
+ else
+ up = routes->link_quality > LINK_QUALITY_UNUSED;
+
+ if (up == routes->kup) return False;
if (st->route_type==TUN_CONFIG_IOCTL) {
if (st->tun_flavour==TUN_FLAVOUR_STREAMS) {
fd=open(st->ip_path,O_RDWR);
if (st->route_type==TUN_CONFIG_IOCTL) {
if (st->tun_flavour==TUN_FLAVOUR_STREAMS) {
fd=open(st->ip_path,O_RDWR);
@@
-187,20
+193,20
@@
static bool_t tun_set_route(void *sst, struct netlink_client *routes)
network=ipaddr_to_string(nets->list[i].prefix);
mask=ipaddr_to_string(nets->list[i].mask);
Message(M_INFO,"%s: %s route %s/%d %s kernel routing table\n",
network=ipaddr_to_string(nets->list[i].prefix);
mask=ipaddr_to_string(nets->list[i].mask);
Message(M_INFO,"%s: %s route %s/%d %s kernel routing table\n",
- st->nl.name,
routes->
up?"adding":"deleting",network,
- nets->list[i].len,
routes->
up?"to":"from");
+ st->nl.name,up?"adding":"deleting",network,
+ nets->list[i].len,up?"to":"from");
switch (st->route_type) {
case TUN_CONFIG_LINUX:
switch (st->route_type) {
case TUN_CONFIG_LINUX:
- sys_cmd(st->route_path,"route",
routes->
up?"add":"del",
+ sys_cmd(st->route_path,"route",up?"add":"del",
"-net",network,"netmask",mask,
"gw",secnetaddr,(char *)0);
break;
case TUN_CONFIG_BSD:
"-net",network,"netmask",mask,
"gw",secnetaddr,(char *)0);
break;
case TUN_CONFIG_BSD:
- sys_cmd(st->route_path,"route",
routes->
up?"add":"del",
+ sys_cmd(st->route_path,"route",up?"add":"del",
"-net",network,secnetaddr,mask,(char *)0);
break;
case TUN_CONFIG_SOLARIS25:
"-net",network,secnetaddr,mask,(char *)0);
break;
case TUN_CONFIG_SOLARIS25:
- sys_cmd(st->route_path,"route",
routes->
up?"add":"del",
+ sys_cmd(st->route_path,"route",up?"add":"del",
network,secnetaddr,(char *)0);
break;
case TUN_CONFIG_IOCTL:
network,secnetaddr,(char *)0);
break;
case TUN_CONFIG_IOCTL:
@@
-211,7
+217,7
@@
static bool_t tun_set_route(void *sst, struct netlink_client *routes)
struct sockaddr_in *sa;
int action;
struct sockaddr_in *sa;
int action;
-
memset(&rt,0,sizeof(rt)
);
+
FILLZERO(rt
);
sa=(struct sockaddr_in *)&rt.rt_dst;
sa->sin_family=AF_INET;
sa->sin_addr.s_addr=htonl(nets->list[i].prefix);
sa=(struct sockaddr_in *)&rt.rt_dst;
sa->sin_family=AF_INET;
sa->sin_addr.s_addr=htonl(nets->list[i].prefix);
@@
-222,7
+228,7
@@
static bool_t tun_set_route(void *sst, struct netlink_client *routes)
sa->sin_family=AF_INET;
sa->sin_addr.s_addr=htonl(st->nl.secnet_address);
rt.rt_flags=RTF_UP|RTF_GATEWAY;
sa->sin_family=AF_INET;
sa->sin_addr.s_addr=htonl(st->nl.secnet_address);
rt.rt_flags=RTF_UP|RTF_GATEWAY;
- action=
routes->
up?SIOCADDRT:SIOCDELRT;
+ action=up?SIOCADDRT:SIOCDELRT;
if (ioctl(fd,action,&rt)<0) {
fatal_perror("tun_set_route: ioctl()");
}
if (ioctl(fd,action,&rt)<0) {
fatal_perror("tun_set_route: ioctl()");
}
@@
-241,7
+247,7
@@
static bool_t tun_set_route(void *sst, struct netlink_client *routes)
if (st->route_type==TUN_CONFIG_IOCTL) {
close(fd);
}
if (st->route_type==TUN_CONFIG_IOCTL) {
close(fd);
}
- routes->kup=
routes->
up;
+ routes->kup=up;
return True;
}
return True;
}
@@
-292,7
+298,7
@@
static void tun_phase_hook(void *sst, uint32_t newphase)
fatal_perror("%s: can't open device file %s",st->nl.name,
st->device_path);
}
fatal_perror("%s: can't open device file %s",st->nl.name,
st->device_path);
}
-
memset(&ifr,0,sizeof(ifr)
);
+
FILLZERO(ifr
);
ifr.ifr_flags = IFF_TUN | IFF_NO_PI; /* Just send/receive IP packets,
no extra headers */
if (st->interface_name)
ifr.ifr_flags = IFF_TUN | IFF_NO_PI; /* Just send/receive IP packets,
no extra headers */
if (st->interface_name)
@@
-379,7
+385,7
@@
static void tun_phase_hook(void *sst, uint32_t newphase)
/* Interface address */
strncpy(ifr.ifr_name,st->interface_name,IFNAMSIZ);
sa=(struct sockaddr_in *)&ifr.ifr_addr;
/* Interface address */
strncpy(ifr.ifr_name,st->interface_name,IFNAMSIZ);
sa=(struct sockaddr_in *)&ifr.ifr_addr;
-
memset(sa,0,sizeof(*sa)
);
+
FILLZERO(*sa
);
sa->sin_family=AF_INET;
sa->sin_addr.s_addr=htonl(st->local_address);
if (ioctl(fd,SIOCSIFADDR, &ifr)!=0) {
sa->sin_family=AF_INET;
sa->sin_addr.s_addr=htonl(st->local_address);
if (ioctl(fd,SIOCSIFADDR, &ifr)!=0) {
@@
-389,7
+395,7
@@
static void tun_phase_hook(void *sst, uint32_t newphase)
/* Netmask */
strncpy(ifr.ifr_name,st->interface_name,IFNAMSIZ);
sa=(struct sockaddr_in *)&ifr.ifr_netmask;
/* Netmask */
strncpy(ifr.ifr_name,st->interface_name,IFNAMSIZ);
sa=(struct sockaddr_in *)&ifr.ifr_netmask;
-
memset(sa,0,sizeof(*sa)
);
+
FILLZERO(*sa
);
sa->sin_family=AF_INET;
sa->sin_addr.s_addr=htonl(0xffffffff);
if (ioctl(fd,SIOCSIFNETMASK, &ifr)!=0) {
sa->sin_family=AF_INET;
sa->sin_addr.s_addr=htonl(0xffffffff);
if (ioctl(fd,SIOCSIFNETMASK, &ifr)!=0) {
@@
-399,7
+405,7
@@
static void tun_phase_hook(void *sst, uint32_t newphase)
/* Destination address (point-to-point) */
strncpy(ifr.ifr_name,st->interface_name,IFNAMSIZ);
sa=(struct sockaddr_in *)&ifr.ifr_dstaddr;
/* Destination address (point-to-point) */
strncpy(ifr.ifr_name,st->interface_name,IFNAMSIZ);
sa=(struct sockaddr_in *)&ifr.ifr_dstaddr;
-
memset(sa,0,sizeof(*sa)
);
+
FILLZERO(*sa
);
sa->sin_family=AF_INET;
sa->sin_addr.s_addr=htonl(st->nl.secnet_address);
if (ioctl(fd,SIOCSIFDSTADDR, &ifr)!=0) {
sa->sin_family=AF_INET;
sa->sin_addr.s_addr=htonl(st->nl.secnet_address);
if (ioctl(fd,SIOCSIFDSTADDR, &ifr)!=0) {