Discussion:
[PATCH v1 1/8] linux: increase the netlink buffer size
Ferry Huberts
2014-08-19 10:07:45 UTC
Permalink
From: Ferry Huberts <***@pelagic.nl>

Mirror what iproute2 does.

Signed-off-by: Ferry Huberts <***@pelagic.nl>
---
src/linux/kernel_routes_nl.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/linux/kernel_routes_nl.c b/src/linux/kernel_routes_nl.c
index 76dfb0d..8d8e702 100644
--- a/src/linux/kernel_routes_nl.c
+++ b/src/linux/kernel_routes_nl.c
@@ -77,7 +77,7 @@ static void rtnetlink_read(int sock, void *, unsigned int);
struct olsr_rtreq {
struct nlmsghdr n;
struct rtmsg r;
- char buf[512];
+ char buf[1024];
};

struct olsr_ipadd_req {
--
1.9.3
--
Olsr-dev mailing list
Olsr-***@lists.olsr.org
https://lists.olsr.org/mailman/listinfo/olsr-dev
Ferry Huberts
2014-08-19 10:07:46 UTC
Permalink
From: Ferry Huberts <***@pelagic.nl>

Mirror what iproute2 does.

An exception is made for Android: RTA_TABLE is not available in the
current required Android version and we don't want to bump it.

Signed-off-by: Ferry Huberts <***@pelagic.nl>
---
src/linux/kernel_routes_nl.c | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/src/linux/kernel_routes_nl.c b/src/linux/kernel_routes_nl.c
index 8d8e702..43f3a20 100644
--- a/src/linux/kernel_routes_nl.c
+++ b/src/linux/kernel_routes_nl.c
@@ -338,7 +338,7 @@ int olsr_os_ifip(int ifindex, union olsr_ip_addr *ip, bool create) {
return olsr_add_ip(ifindex, ip, NULL, create);
}

-static int olsr_new_netlink_route(int family, int rttable, int if_index, int metric, int protocol,
+static int olsr_new_netlink_route(int family, uint32_t rttable, int if_index, int metric, int protocol,
const union olsr_ip_addr *src, const union olsr_ip_addr *gw, const struct olsr_ip_prefix *dst,
bool set, bool del_similar) {

@@ -360,7 +360,16 @@ static int olsr_new_netlink_route(int family, int rttable, int if_index, int met

req.r.rtm_flags = RTNH_F_ONLINK;
req.r.rtm_family = family;
+#ifndef __ANDROID__
+ if (rttable < 256)
+ req.r.rtm_table = rttable;
+ else {
+ req.r.rtm_table = RT_TABLE_UNSPEC;
+ olsr_netlink_addreq(&req.n, sizeof(req), RTA_TABLE, &rttable, sizeof(rttable));
+ }
+#else
req.r.rtm_table = rttable;
+#endif

req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg));
req.n.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
@@ -481,7 +490,8 @@ void olsr_os_inetgw_tunnel_route(uint32_t if_idx, bool ipv4, bool set, uint8_t t
}

static int olsr_os_process_rt_entry(int af_family, const struct rt_entry *rt, bool set) {
- int metric, table;
+ int metric;
+ uint32_t table;
const struct rt_nexthop *nexthop;
union olsr_ip_addr *src;
bool hostRoute;
--
1.9.3
--
Olsr-dev mailing list
Olsr-***@lists.olsr.org
https://lists.olsr.org/mailman/listinfo/olsr-dev
Ferry Huberts
2014-08-19 10:07:50 UTC
Permalink
From: Ferry Huberts <***@pelagic.nl>

Signed-off-by: Ferry Huberts <***@pelagic.nl>
---
src/linux/kernel_routes_nl.c | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/src/linux/kernel_routes_nl.c b/src/linux/kernel_routes_nl.c
index 1110fa3..2daa2c0 100644
--- a/src/linux/kernel_routes_nl.c
+++ b/src/linux/kernel_routes_nl.c
@@ -338,7 +338,7 @@ int olsr_os_ifip(int ifindex, union olsr_ip_addr *ip, bool create) {
return olsr_add_ip(ifindex, ip, NULL, create);
}

-static int olsr_new_netlink_route(unsigned char family, uint32_t rttable, unsigned int flags, int if_index, int metric, int protocol,
+static int olsr_new_netlink_route(unsigned char family, uint32_t rttable, unsigned int flags, unsigned char scope, int if_index, int metric, int protocol,
const union olsr_ip_addr *src, const union olsr_ip_addr *gw, const struct olsr_ip_prefix *dst,
bool set, bool del_similar) {

@@ -399,7 +399,7 @@ static int olsr_new_netlink_route(unsigned char family, uint32_t rttable, unsign
}
else {
/* for all our routes */
- req.r.rtm_scope = RT_SCOPE_UNIVERSE;
+ req.r.rtm_scope = scope;
}

if (set || !del_similar) {
@@ -458,7 +458,7 @@ static int olsr_new_netlink_route(unsigned char family, uint32_t rttable, unsign
void olsr_os_niit_6to4_route(const struct olsr_ip_prefix *dst_v6, bool set) {
if (olsr_new_netlink_route(AF_INET6,
ip_prefix_is_mappedv4_inetgw(dst_v6) ? olsr_cnf->rt_table_default : olsr_cnf->rt_table,
- RTNH_F_ONLINK, olsr_cnf->niit6to4_if_index,
+ RTNH_F_ONLINK, RT_SCOPE_UNIVERSE, olsr_cnf->niit6to4_if_index,
olsr_cnf->fib_metric_default, olsr_cnf->rt_proto, NULL, NULL, dst_v6, set, false)) {
olsr_syslog(OLSR_LOG_ERR, ". error while %s static niit route to %s",
set ? "setting" : "removing", olsr_ip_prefix_to_string(dst_v6));
@@ -468,7 +468,7 @@ void olsr_os_niit_6to4_route(const struct olsr_ip_prefix *dst_v6, bool set) {
void olsr_os_niit_4to6_route(const struct olsr_ip_prefix *dst_v4, bool set) {
if (olsr_new_netlink_route(AF_INET,
ip_prefix_is_v4_inetgw(dst_v4) ? olsr_cnf->rt_table_default : olsr_cnf->rt_table,
- RTNH_F_ONLINK, olsr_cnf->niit4to6_if_index,
+ RTNH_F_ONLINK, RT_SCOPE_UNIVERSE, olsr_cnf->niit4to6_if_index,
olsr_cnf->fib_metric_default, olsr_cnf->rt_proto, NULL, NULL, dst_v4, set, false)) {
olsr_syslog(OLSR_LOG_ERR, ". error while %s niit route to %s",
set ? "setting" : "removing", olsr_ip_prefix_to_string(dst_v4));
@@ -482,7 +482,7 @@ void olsr_os_inetgw_tunnel_route(uint32_t if_idx, bool ipv4, bool set, uint8_t t

dst = ipv4 ? &ipv4_internet_route : &ipv6_internet_route;

- if (olsr_new_netlink_route(ipv4 ? AF_INET : AF_INET6, table, RTNH_F_ONLINK,
+ if (olsr_new_netlink_route(ipv4 ? AF_INET : AF_INET6, table, RTNH_F_ONLINK, RT_SCOPE_UNIVERSE,
if_idx, olsr_cnf->fib_metric_default, olsr_cnf->rt_proto, NULL, NULL, dst, set, false)) {
olsr_syslog(OLSR_LOG_ERR, ". error while %s inetgw tunnel route to %s for if %d",
set ? "setting" : "removing", olsr_ip_prefix_to_string(dst), if_idx);
@@ -535,7 +535,7 @@ static int olsr_os_process_rt_entry(unsigned char af_family, const struct rt_ent
}

/* create route */
- err = olsr_new_netlink_route(af_family, table, RTNH_F_ONLINK, nexthop->iif_index, metric, olsr_cnf->rt_proto,
+ err = olsr_new_netlink_route(af_family, table, RTNH_F_ONLINK, RT_SCOPE_UNIVERSE, nexthop->iif_index, metric, olsr_cnf->rt_proto,
src, hostRoute ? NULL : &nexthop->gateway, &rt->rt_dst, set, false);

/* resolve "File exist" (17) propblems (on orig and autogen routes)*/
@@ -544,11 +544,11 @@ static int olsr_os_process_rt_entry(unsigned char af_family, const struct rt_ent
olsr_syslog(OLSR_LOG_ERR, ". auto-deleting similar routes to resolve 'File exists' (17) while adding route!");

/* erase similar rule */
- err = olsr_new_netlink_route(af_family, table, RTNH_F_ONLINK, 0, 0, -1, NULL, NULL, &rt->rt_dst, false, true);
+ err = olsr_new_netlink_route(af_family, table, RTNH_F_ONLINK, RT_SCOPE_UNIVERSE, 0, 0, -1, NULL, NULL, &rt->rt_dst, false, true);

if (!err) {
/* create this rule a second time if delete worked*/
- err = olsr_new_netlink_route(af_family, table, RTNH_F_ONLINK, nexthop->iif_index, metric, olsr_cnf->rt_proto,
+ err = olsr_new_netlink_route(af_family, table, RTNH_F_ONLINK, RT_SCOPE_UNIVERSE, nexthop->iif_index, metric, olsr_cnf->rt_proto,
src, hostRoute ? NULL : &nexthop->gateway, &rt->rt_dst, set, false);
}
olsr_syslog(OLSR_LOG_ERR, ". %s (%d)", err == 0 ? "successful" : "failed", err);
@@ -585,11 +585,11 @@ static int olsr_os_process_rt_entry(unsigned char af_family, const struct rt_ent
hostPrefix.prefix = nexthop->gateway;
hostPrefix.prefix_len = olsr_cnf->ipsize * 8;

- err = olsr_new_netlink_route(af_family, olsr_cnf->rt_table, RTNH_F_ONLINK, nexthop->iif_index,
+ err = olsr_new_netlink_route(af_family, olsr_cnf->rt_table, RTNH_F_ONLINK, RT_SCOPE_UNIVERSE, nexthop->iif_index,
metric, olsr_cnf->rt_proto, src, NULL, &hostPrefix, true, false);
if (err == 0) {
/* create this rule a second time if hostrule generation was successful */
- err = olsr_new_netlink_route(af_family, table, RTNH_F_ONLINK, nexthop->iif_index, metric, olsr_cnf->rt_proto,
+ err = olsr_new_netlink_route(af_family, table, RTNH_F_ONLINK, RT_SCOPE_UNIVERSE, nexthop->iif_index, metric, olsr_cnf->rt_proto,
src, &nexthop->gateway, &rt->rt_dst, set, false);
}
olsr_syslog(OLSR_LOG_ERR, ". %s (%d)", err == 0 ? "successful" : "failed", err);
--
1.9.3
--
Olsr-dev mailing list
Olsr-***@lists.olsr.org
https://lists.olsr.org/mailman/listinfo/olsr-dev
Ferry Huberts
2014-08-19 10:07:51 UTC
Permalink
From: Ferry Huberts <***@pelagic.nl>

Signed-off-by: Ferry Huberts <***@pelagic.nl>
---
src/linux/kernel_routes_nl.c | 26 +++++++++++++++-----------
1 file changed, 15 insertions(+), 11 deletions(-)

diff --git a/src/linux/kernel_routes_nl.c b/src/linux/kernel_routes_nl.c
index 2daa2c0..c225d71 100644
--- a/src/linux/kernel_routes_nl.c
+++ b/src/linux/kernel_routes_nl.c
@@ -340,7 +340,7 @@ int olsr_os_ifip(int ifindex, union olsr_ip_addr *ip, bool create) {

static int olsr_new_netlink_route(unsigned char family, uint32_t rttable, unsigned int flags, unsigned char scope, int if_index, int metric, int protocol,
const union olsr_ip_addr *src, const union olsr_ip_addr *gw, const struct olsr_ip_prefix *dst,
- bool set, bool del_similar) {
+ bool set, bool del_similar, bool blackhole) {

struct olsr_rtreq req;
int family_size;
@@ -383,7 +383,11 @@ static int olsr_new_netlink_route(unsigned char family, uint32_t rttable, unsign

/* RTN_UNSPEC would be the wildcard, but blackhole broadcast or nat roules should usually not conflict */
/* -> olsr only adds deletes unicast routes */
- req.r.rtm_type = RTN_UNICAST;
+ if (blackhole) {
+ req.r.rtm_type = RTN_BLACKHOLE;
+ } else {
+ req.r.rtm_type = RTN_UNICAST;
+ }

req.r.rtm_dst_len = dst->prefix_len;

@@ -402,7 +406,7 @@ static int olsr_new_netlink_route(unsigned char family, uint32_t rttable, unsign
req.r.rtm_scope = scope;
}

- if (set || !del_similar) {
+ if ((set || !del_similar) && !blackhole) {
/* add interface*/
olsr_netlink_addreq(&req.n, sizeof(req), RTA_OIF, &if_index, sizeof(if_index));
}
@@ -459,7 +463,7 @@ void olsr_os_niit_6to4_route(const struct olsr_ip_prefix *dst_v6, bool set) {
if (olsr_new_netlink_route(AF_INET6,
ip_prefix_is_mappedv4_inetgw(dst_v6) ? olsr_cnf->rt_table_default : olsr_cnf->rt_table,
RTNH_F_ONLINK, RT_SCOPE_UNIVERSE, olsr_cnf->niit6to4_if_index,
- olsr_cnf->fib_metric_default, olsr_cnf->rt_proto, NULL, NULL, dst_v6, set, false)) {
+ olsr_cnf->fib_metric_default, olsr_cnf->rt_proto, NULL, NULL, dst_v6, set, false, false)) {
olsr_syslog(OLSR_LOG_ERR, ". error while %s static niit route to %s",
set ? "setting" : "removing", olsr_ip_prefix_to_string(dst_v6));
}
@@ -469,7 +473,7 @@ void olsr_os_niit_4to6_route(const struct olsr_ip_prefix *dst_v4, bool set) {
if (olsr_new_netlink_route(AF_INET,
ip_prefix_is_v4_inetgw(dst_v4) ? olsr_cnf->rt_table_default : olsr_cnf->rt_table,
RTNH_F_ONLINK, RT_SCOPE_UNIVERSE, olsr_cnf->niit4to6_if_index,
- olsr_cnf->fib_metric_default, olsr_cnf->rt_proto, NULL, NULL, dst_v4, set, false)) {
+ olsr_cnf->fib_metric_default, olsr_cnf->rt_proto, NULL, NULL, dst_v4, set, false, false)) {
olsr_syslog(OLSR_LOG_ERR, ". error while %s niit route to %s",
set ? "setting" : "removing", olsr_ip_prefix_to_string(dst_v4));
}
@@ -483,7 +487,7 @@ void olsr_os_inetgw_tunnel_route(uint32_t if_idx, bool ipv4, bool set, uint8_t t
dst = ipv4 ? &ipv4_internet_route : &ipv6_internet_route;

if (olsr_new_netlink_route(ipv4 ? AF_INET : AF_INET6, table, RTNH_F_ONLINK, RT_SCOPE_UNIVERSE,
- if_idx, olsr_cnf->fib_metric_default, olsr_cnf->rt_proto, NULL, NULL, dst, set, false)) {
+ if_idx, olsr_cnf->fib_metric_default, olsr_cnf->rt_proto, NULL, NULL, dst, set, false, false)) {
olsr_syslog(OLSR_LOG_ERR, ". error while %s inetgw tunnel route to %s for if %d",
set ? "setting" : "removing", olsr_ip_prefix_to_string(dst), if_idx);
}
@@ -536,7 +540,7 @@ static int olsr_os_process_rt_entry(unsigned char af_family, const struct rt_ent

/* create route */
err = olsr_new_netlink_route(af_family, table, RTNH_F_ONLINK, RT_SCOPE_UNIVERSE, nexthop->iif_index, metric, olsr_cnf->rt_proto,
- src, hostRoute ? NULL : &nexthop->gateway, &rt->rt_dst, set, false);
+ src, hostRoute ? NULL : &nexthop->gateway, &rt->rt_dst, set, false, false);

/* resolve "File exist" (17) propblems (on orig and autogen routes)*/
if (set && err == 17) {
@@ -544,12 +548,12 @@ static int olsr_os_process_rt_entry(unsigned char af_family, const struct rt_ent
olsr_syslog(OLSR_LOG_ERR, ". auto-deleting similar routes to resolve 'File exists' (17) while adding route!");

/* erase similar rule */
- err = olsr_new_netlink_route(af_family, table, RTNH_F_ONLINK, RT_SCOPE_UNIVERSE, 0, 0, -1, NULL, NULL, &rt->rt_dst, false, true);
+ err = olsr_new_netlink_route(af_family, table, RTNH_F_ONLINK, RT_SCOPE_UNIVERSE, 0, 0, -1, NULL, NULL, &rt->rt_dst, false, true, false);

if (!err) {
/* create this rule a second time if delete worked*/
err = olsr_new_netlink_route(af_family, table, RTNH_F_ONLINK, RT_SCOPE_UNIVERSE, nexthop->iif_index, metric, olsr_cnf->rt_proto,
- src, hostRoute ? NULL : &nexthop->gateway, &rt->rt_dst, set, false);
+ src, hostRoute ? NULL : &nexthop->gateway, &rt->rt_dst, set, false, false);
}
olsr_syslog(OLSR_LOG_ERR, ". %s (%d)", err == 0 ? "successful" : "failed", err);
}
@@ -586,11 +590,11 @@ static int olsr_os_process_rt_entry(unsigned char af_family, const struct rt_ent
hostPrefix.prefix_len = olsr_cnf->ipsize * 8;

err = olsr_new_netlink_route(af_family, olsr_cnf->rt_table, RTNH_F_ONLINK, RT_SCOPE_UNIVERSE, nexthop->iif_index,
- metric, olsr_cnf->rt_proto, src, NULL, &hostPrefix, true, false);
+ metric, olsr_cnf->rt_proto, src, NULL, &hostPrefix, true, false, false);
if (err == 0) {
/* create this rule a second time if hostrule generation was successful */
err = olsr_new_netlink_route(af_family, table, RTNH_F_ONLINK, RT_SCOPE_UNIVERSE, nexthop->iif_index, metric, olsr_cnf->rt_proto,
- src, &nexthop->gateway, &rt->rt_dst, set, false);
+ src, &nexthop->gateway, &rt->rt_dst, set, false, false);
}
olsr_syslog(OLSR_LOG_ERR, ". %s (%d)", err == 0 ? "successful" : "failed", err);
}
--
1.9.3
--
Olsr-dev mailing list
Olsr-***@lists.olsr.org
https://lists.olsr.org/mailman/listinfo/olsr-dev
Ferry Huberts
2014-08-19 10:07:47 UTC
Permalink
From: Ferry Huberts <***@pelagic.nl>

Signed-off-by: Ferry Huberts <***@pelagic.nl>
---
src/linux/kernel_routes_nl.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/linux/kernel_routes_nl.c b/src/linux/kernel_routes_nl.c
index 43f3a20..5f87989 100644
--- a/src/linux/kernel_routes_nl.c
+++ b/src/linux/kernel_routes_nl.c
@@ -338,7 +338,7 @@ int olsr_os_ifip(int ifindex, union olsr_ip_addr *ip, bool create) {
return olsr_add_ip(ifindex, ip, NULL, create);
}

-static int olsr_new_netlink_route(int family, uint32_t rttable, int if_index, int metric, int protocol,
+static int olsr_new_netlink_route(unsigned char family, uint32_t rttable, int if_index, int metric, int protocol,
const union olsr_ip_addr *src, const union olsr_ip_addr *gw, const struct olsr_ip_prefix *dst,
bool set, bool del_similar) {

@@ -489,7 +489,7 @@ void olsr_os_inetgw_tunnel_route(uint32_t if_idx, bool ipv4, bool set, uint8_t t
}
}

-static int olsr_os_process_rt_entry(int af_family, const struct rt_entry *rt, bool set) {
+static int olsr_os_process_rt_entry(unsigned char af_family, const struct rt_entry *rt, bool set) {
int metric;
uint32_t table;
const struct rt_nexthop *nexthop;
--
1.9.3
--
Olsr-dev mailing list
Olsr-***@lists.olsr.org
https://lists.olsr.org/mailman/listinfo/olsr-dev
Henning Rogge
2014-08-19 11:01:19 UTC
Permalink
Most userspace API uses "int" fÃŒr address family, thats why we used "int"
too (I think).

Henning
Post by Ferry Huberts
---
src/linux/kernel_routes_nl.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/linux/kernel_routes_nl.c b/src/linux/kernel_routes_nl.c
index 43f3a20..5f87989 100644
--- a/src/linux/kernel_routes_nl.c
+++ b/src/linux/kernel_routes_nl.c
@@ -338,7 +338,7 @@ int olsr_os_ifip(int ifindex, union olsr_ip_addr *ip, bool create) {
return olsr_add_ip(ifindex, ip, NULL, create);
}
-static int olsr_new_netlink_route(int family, uint32_t rttable, int
if_index, int metric, int protocol,
+static int olsr_new_netlink_route(unsigned char family, uint32_t rttable,
int if_index, int metric, int protocol,
const union olsr_ip_addr *src, const union olsr_ip_addr *gw, const
struct olsr_ip_prefix *dst,
bool set, bool del_similar) {
@@ -489,7 +489,7 @@ void olsr_os_inetgw_tunnel_route(uint32_t if_idx, bool
ipv4, bool set, uint8_t t
}
}
-static int olsr_os_process_rt_entry(int af_family, const struct rt_entry *rt, bool set) {
+static int olsr_os_process_rt_entry(unsigned char af_family, const struct
rt_entry *rt, bool set) {
int metric;
uint32_t table;
const struct rt_nexthop *nexthop;
--
1.9.3
--
Olsr-dev mailing list
https://lists.olsr.org/mailman/listinfo/olsr-dev
Ferry Huberts
2014-08-19 10:07:52 UTC
Permalink
From: Ferry Huberts <***@pelagic.nl>

Signed-off-by: Ferry Huberts <***@pelagic.nl>
---
src/kernel_routes.h | 7 ++++++-
src/linux/kernel_routes_nl.c | 2 +-
2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/src/kernel_routes.h b/src/kernel_routes.h
index 10e7eca..38f163a 100644
--- a/src/kernel_routes.h
+++ b/src/kernel_routes.h
@@ -54,7 +54,12 @@ int olsr_ioctl_del_route(const struct rt_entry *rt);
int olsr_ioctl_del_route6(const struct rt_entry *rt);

#ifdef __linux__
-int rtnetlink_register_socket(int);
+ int olsr_new_netlink_route(unsigned char family, uint32_t rttable,
+ unsigned int flags, unsigned char scope, int if_index, int metric,
+ int protocol, const union olsr_ip_addr *src, const union olsr_ip_addr *gw,
+ const struct olsr_ip_prefix *dst, bool set, bool del_similar, bool blackhole);
+
+ int rtnetlink_register_socket(int);
#endif /* __linux__ */

void olsr_os_niit_4to6_route(const struct olsr_ip_prefix *dst_v4, bool set);
diff --git a/src/linux/kernel_routes_nl.c b/src/linux/kernel_routes_nl.c
index c225d71..3a8cde6 100644
--- a/src/linux/kernel_routes_nl.c
+++ b/src/linux/kernel_routes_nl.c
@@ -338,7 +338,7 @@ int olsr_os_ifip(int ifindex, union olsr_ip_addr *ip, bool create) {
return olsr_add_ip(ifindex, ip, NULL, create);
}

-static int olsr_new_netlink_route(unsigned char family, uint32_t rttable, unsigned int flags, unsigned char scope, int if_index, int metric, int protocol,
+int olsr_new_netlink_route(unsigned char family, uint32_t rttable, unsigned int flags, unsigned char scope, int if_index, int metric, int protocol,
const union olsr_ip_addr *src, const union olsr_ip_addr *gw, const struct olsr_ip_prefix *dst,
bool set, bool del_similar, bool blackhole) {
--
1.9.3
--
Olsr-dev mailing list
Olsr-***@lists.olsr.org
https://lists.olsr.org/mailman/listinfo/olsr-dev
Ferry Huberts
2014-08-19 10:07:48 UTC
Permalink
From: Ferry Huberts <***@pelagic.nl>

Makes no sense.

Signed-off-by: Ferry Huberts <***@pelagic.nl>
---
src/linux/kernel_routes_nl.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/linux/kernel_routes_nl.c b/src/linux/kernel_routes_nl.c
index 5f87989..025037d 100644
--- a/src/linux/kernel_routes_nl.c
+++ b/src/linux/kernel_routes_nl.c
@@ -412,7 +412,7 @@ static int olsr_new_netlink_route(unsigned char family, uint32_t rttable, int if
olsr_netlink_addreq(&req.n, sizeof(req), RTA_PREFSRC, src, family_size);
}

- if (metric != -1) {
+ if (metric >= 0) {
/* add metric */
olsr_netlink_addreq(&req.n, sizeof(req), RTA_PRIORITY, &metric, sizeof(metric));
}
--
1.9.3
--
Olsr-dev mailing list
Olsr-***@lists.olsr.org
https://lists.olsr.org/mailman/listinfo/olsr-dev
Ferry Huberts
2014-08-19 10:07:49 UTC
Permalink
From: Ferry Huberts <***@pelagic.nl>

Signed-off-by: Ferry Huberts <***@pelagic.nl>
---
src/linux/kernel_routes_nl.c | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/src/linux/kernel_routes_nl.c b/src/linux/kernel_routes_nl.c
index 025037d..1110fa3 100644
--- a/src/linux/kernel_routes_nl.c
+++ b/src/linux/kernel_routes_nl.c
@@ -338,7 +338,7 @@ int olsr_os_ifip(int ifindex, union olsr_ip_addr *ip, bool create) {
return olsr_add_ip(ifindex, ip, NULL, create);
}

-static int olsr_new_netlink_route(unsigned char family, uint32_t rttable, int if_index, int metric, int protocol,
+static int olsr_new_netlink_route(unsigned char family, uint32_t rttable, unsigned int flags, int if_index, int metric, int protocol,
const union olsr_ip_addr *src, const union olsr_ip_addr *gw, const struct olsr_ip_prefix *dst,
bool set, bool del_similar) {

@@ -358,7 +358,7 @@ static int olsr_new_netlink_route(unsigned char family, uint32_t rttable, int if

memset(&req, 0, sizeof(req));

- req.r.rtm_flags = RTNH_F_ONLINK;
+ req.r.rtm_flags = flags;
req.r.rtm_family = family;
#ifndef __ANDROID__
if (rttable < 256)
@@ -458,7 +458,7 @@ static int olsr_new_netlink_route(unsigned char family, uint32_t rttable, int if
void olsr_os_niit_6to4_route(const struct olsr_ip_prefix *dst_v6, bool set) {
if (olsr_new_netlink_route(AF_INET6,
ip_prefix_is_mappedv4_inetgw(dst_v6) ? olsr_cnf->rt_table_default : olsr_cnf->rt_table,
- olsr_cnf->niit6to4_if_index,
+ RTNH_F_ONLINK, olsr_cnf->niit6to4_if_index,
olsr_cnf->fib_metric_default, olsr_cnf->rt_proto, NULL, NULL, dst_v6, set, false)) {
olsr_syslog(OLSR_LOG_ERR, ". error while %s static niit route to %s",
set ? "setting" : "removing", olsr_ip_prefix_to_string(dst_v6));
@@ -468,7 +468,7 @@ void olsr_os_niit_6to4_route(const struct olsr_ip_prefix *dst_v6, bool set) {
void olsr_os_niit_4to6_route(const struct olsr_ip_prefix *dst_v4, bool set) {
if (olsr_new_netlink_route(AF_INET,
ip_prefix_is_v4_inetgw(dst_v4) ? olsr_cnf->rt_table_default : olsr_cnf->rt_table,
- olsr_cnf->niit4to6_if_index,
+ RTNH_F_ONLINK, olsr_cnf->niit4to6_if_index,
olsr_cnf->fib_metric_default, olsr_cnf->rt_proto, NULL, NULL, dst_v4, set, false)) {
olsr_syslog(OLSR_LOG_ERR, ". error while %s niit route to %s",
set ? "setting" : "removing", olsr_ip_prefix_to_string(dst_v4));
@@ -482,7 +482,7 @@ void olsr_os_inetgw_tunnel_route(uint32_t if_idx, bool ipv4, bool set, uint8_t t

dst = ipv4 ? &ipv4_internet_route : &ipv6_internet_route;

- if (olsr_new_netlink_route(ipv4 ? AF_INET : AF_INET6, table,
+ if (olsr_new_netlink_route(ipv4 ? AF_INET : AF_INET6, table, RTNH_F_ONLINK,
if_idx, olsr_cnf->fib_metric_default, olsr_cnf->rt_proto, NULL, NULL, dst, set, false)) {
olsr_syslog(OLSR_LOG_ERR, ". error while %s inetgw tunnel route to %s for if %d",
set ? "setting" : "removing", olsr_ip_prefix_to_string(dst), if_idx);
@@ -535,7 +535,7 @@ static int olsr_os_process_rt_entry(unsigned char af_family, const struct rt_ent
}

/* create route */
- err = olsr_new_netlink_route(af_family, table, nexthop->iif_index, metric, olsr_cnf->rt_proto,
+ err = olsr_new_netlink_route(af_family, table, RTNH_F_ONLINK, nexthop->iif_index, metric, olsr_cnf->rt_proto,
src, hostRoute ? NULL : &nexthop->gateway, &rt->rt_dst, set, false);

/* resolve "File exist" (17) propblems (on orig and autogen routes)*/
@@ -544,11 +544,11 @@ static int olsr_os_process_rt_entry(unsigned char af_family, const struct rt_ent
olsr_syslog(OLSR_LOG_ERR, ". auto-deleting similar routes to resolve 'File exists' (17) while adding route!");

/* erase similar rule */
- err = olsr_new_netlink_route(af_family, table, 0, 0, -1, NULL, NULL, &rt->rt_dst, false, true);
+ err = olsr_new_netlink_route(af_family, table, RTNH_F_ONLINK, 0, 0, -1, NULL, NULL, &rt->rt_dst, false, true);

if (!err) {
/* create this rule a second time if delete worked*/
- err = olsr_new_netlink_route(af_family, table, nexthop->iif_index, metric, olsr_cnf->rt_proto,
+ err = olsr_new_netlink_route(af_family, table, RTNH_F_ONLINK, nexthop->iif_index, metric, olsr_cnf->rt_proto,
src, hostRoute ? NULL : &nexthop->gateway, &rt->rt_dst, set, false);
}
olsr_syslog(OLSR_LOG_ERR, ". %s (%d)", err == 0 ? "successful" : "failed", err);
@@ -585,11 +585,11 @@ static int olsr_os_process_rt_entry(unsigned char af_family, const struct rt_ent
hostPrefix.prefix = nexthop->gateway;
hostPrefix.prefix_len = olsr_cnf->ipsize * 8;

- err = olsr_new_netlink_route(af_family, olsr_cnf->rt_table, nexthop->iif_index,
+ err = olsr_new_netlink_route(af_family, olsr_cnf->rt_table, RTNH_F_ONLINK, nexthop->iif_index,
metric, olsr_cnf->rt_proto, src, NULL, &hostPrefix, true, false);
if (err == 0) {
/* create this rule a second time if hostrule generation was successful */
- err = olsr_new_netlink_route(af_family, table, nexthop->iif_index, metric, olsr_cnf->rt_proto,
+ err = olsr_new_netlink_route(af_family, table, RTNH_F_ONLINK, nexthop->iif_index, metric, olsr_cnf->rt_proto,
src, &nexthop->gateway, &rt->rt_dst, set, false);
}
olsr_syslog(OLSR_LOG_ERR, ". %s (%d)", err == 0 ? "successful" : "failed", err);
--
1.9.3
--
Olsr-dev mailing list
Olsr-***@lists.olsr.org
https://lists.olsr.org/mailman/listinfo/olsr-dev
Henning Rogge
2014-08-20 18:39:18 UTC
Permalink
Hi,

I am okay with merging this patchset.

Henning
I need more flexibility in the olsr_new_netlink_route function for the work
I'm doing to (finally) add the last piece of the mult-smart-gateway code to
olsrd.
We have that code in one of our own daemons but since that daemon work very
differently from olsrd, the code needs 'some' massaging, refactoring and
translation.
This series is something that is needed as a basis and is quite localised,
which
is why I'm sending it out now.
linux: increase the netlink buffer size
linux: fix using tables >= 256
linux: fix type of af_family
linux: do not try to set routes with negative metric
linux: add 'flags' parameter to olsr_new_netlink_route function
linux: add 'scope' parameter to olsr_new_netlink_route function
linux: make it possible to add/remove blackhole routes
linux: export the olsr_new_netlink_route function
src/kernel_routes.h | 7 ++++-
src/linux/kernel_routes_nl.c | 64
+++++++++++++++++++++++++++-----------------
2 files changed, 45 insertions(+), 26 deletions(-)
--
1.9.3
--
Olsr-dev mailing list
https://lists.olsr.org/mailman/listinfo/olsr-dev
Loading...