From 3305015d6f99b77bb4ae057ad00b8b24810f3c7a Mon Sep 17 00:00:00 2001 From: Markus Kittenberger Date: Fri, 8 Jan 2010 23:00:52 +0100 Subject: [PATCH] add rule priorities, and ability to set ip addr of interfaces --- src/kernel_routes.h | 2 +- src/linux/kernel_routes.c | 47 ++++++++++++++++++++++++++------------- src/main.c | 4 ++-- 3 files changed, 34 insertions(+), 19 deletions(-) diff --git a/src/kernel_routes.h b/src/kernel_routes.h index 3bceeb60..548d93d3 100644 --- a/src/kernel_routes.h +++ b/src/kernel_routes.h @@ -56,7 +56,7 @@ int olsr_ioctl_del_route6(const struct rt_entry *); #if LINUX_POLICY_ROUTING int olsr_netlink_rule(uint8_t, uint8_t, uint16_t, uint32_t, char*); -int olsr_dev_up(char *); +int olsr_dev_up(const char *, bool); #if LINUX_RTNETLINK_LISTEN int rtnetlink_register_socket(int); diff --git a/src/linux/kernel_routes.c b/src/linux/kernel_routes.c index ecf5a8e2..57c9cdf6 100644 --- a/src/linux/kernel_routes.c +++ b/src/linux/kernel_routes.c @@ -86,25 +86,42 @@ struct olsr_rtreq { }; /*takes up an interface*/ -int olsr_dev_up(char * dev) +int olsr_dev_up(const char * dev,bool set_ip) { - int s, r, up; - struct ifreq f; + int s, r; + struct ifreq ifr; s = socket(PF_INET, SOCK_DGRAM, 0); if (s < 0) { perror("socket"); return(-1); } - memset(&f, 0, sizeof(f)); - strncpy(f.ifr_name, dev, IFNAMSIZ); /* set the interface */ + memset(&ifr, 0, sizeof(ifr)); + strncpy(ifr.ifr_name, dev, IFNAMSIZ); + + if (set_ip){ + struct sockaddr_in sin; + memset(&sin, 0, sizeof(struct sockaddr_in)); + sin.sin_family = AF_INET; + sin.sin_addr.s_addr = 0x01020304;//!!??use originator address + memcpy(&ifr.ifr_addr, &sin, sizeof(struct sockaddr_in)); - r = ioctl(s, SIOCGIFFLAGS, &f); + r = ioctl(s, SIOCSIFADDR, &ifr); + if (r < 0){ + perror("ioctl"); + return(-1); + } + /*reset ifreq fuild for IFFLGAS*/ + memset(&sin, 0, sizeof( struct sockaddr_in) ); + } + + ifr.ifr_flags = IFF_UP; //!!?? read old flags and before setting new ones + r = ioctl(s, SIOCSIFFLAGS, &ifr); if (r < 0) { perror("ioctl"); return(-1); } - up = (short int)f.ifr_flags & IFF_UP; - return up; + + return true; } #if LINUX_RTNETLINK_LISTEN @@ -256,7 +273,7 @@ olsr_netlink_addreq(struct olsr_rtreq *req, int type, const void *data, int len) * not the cause, like unintelligent ordering of inserted routes. * 1 on success */ static int -olsr_netlink_route_int(const struct rt_entry *rt, uint8_t family, uint8_t rttable, __u16 cmd, uint8_t flag) +olsr_netlink_route_int(const struct rt_entry *rt, uint8_t family, uint8_t rttable, __u16 cmd, uint16_t flag) { int ret = 1; /* helper variable for rtnetlink_message processing */ int rt_ret = -2; /* if no response from rtnetlink it must be considered as failed! */ @@ -325,14 +342,12 @@ olsr_netlink_route_int(const struct rt_entry *rt, uint8_t family, uint8_t rttabl if ( ( cmd == RTM_NEWRULE ) || ( cmd == RTM_DELRULE ) ) { /* add or delete a rule */ - static uint32_t priority = 65535; - req.r.rtm_scope = RT_SCOPE_UNIVERSE; - olsr_netlink_addreq(&req, RTA_PRIORITY, &priority, sizeof(priority)); + olsr_netlink_addreq(&req, RTA_PRIORITY, &flag, sizeof(flag)); if (rt!=NULL) { /*add interface name to rule*/ //olsr_netlink_addreq(&req, RTA_interface, &rt, sizeof(?)); - //!!??printf("rule interface %s ignored!",(char*) rt); + printf("rule interface %s ignored!",(const char *) rt); } } else { @@ -352,8 +367,8 @@ olsr_netlink_route_int(const struct rt_entry *rt, uint8_t family, uint8_t rttabl //create tunnel set_tunl(SIOCADDTUNNEL,rt->rt_best->rtp_originator.v4.s_addr); //!!?? currently it gets never deleted at shutdown, anyways reusing existing tunnel might be a safe approach if creating fails? - //set tunnel up (does it need ip aswell?) - olsr_dev_up(olsr_cnf->ipip_name); + //set tunnel up with originator ip + olsr_dev_up(olsr_cnf->ipip_name,true); //find out iifindex (maybe it works even if above failed (old tunnel)) olsr_cnf->ipip_if_index=if_nametoindex(olsr_cnf->ipip_name); } @@ -641,7 +656,7 @@ int olsr_netlink_rule(uint8_t family, uint8_t rttable, uint16_t cmd, uint32_t priority, char* dev) { printf("rule priority not supported"); - return olsr_netlink_route_int(dev, family, rttable, cmd, RT_ORIG_REQUEST); + return olsr_netlink_route_int((const struct rt_entry *) dev, family, rttable, cmd, priority); } /* internal wrapper function for above patched function */ diff --git a/src/main.c b/src/main.c index 9df5d95c..ac76c4f4 100644 --- a/src/main.c +++ b/src/main.c @@ -472,9 +472,9 @@ int main(int argc, char *argv[]) { #if LINUX_POLICY_ROUTING /*create smart-gateway-tunnel policy rules*/ if (olsr_cnf->smart_gateway_active) { - + const char* tunlbase = "tunl0"; //take up tunl0 device or disable smartgateway - olsr_cnf->smart_gateway_active = olsr_dev_up("tunl0"); + olsr_cnf->smart_gateway_active = olsr_dev_up(tunlbase,false);//!!?? kernel 2.4 may need true to function as gateway, does it harm to do anyway if (olsr_cnf->smart_gateway_active) { struct olsr_if *cfg_if; -- 2.20.1