From: Jukka Rissanen <jukka.rissa...@linux.intel.com> --- src/connman.h | 1 + src/inet.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+)
diff --git a/src/connman.h b/src/connman.h index 2617718..548f987 100644 --- a/src/connman.h +++ b/src/connman.h @@ -193,6 +193,7 @@ int __connman_inet_rtnl_addattr32(struct nlmsghdr *n, size_t maxlen, int type, __u32 data); int __connman_inet_add_fwmark_rule(int ifindex, int family, uint32_t fwmark); int __connman_inet_del_fwmark_rule(int ifindex, int family, uint32_t fwmark); +int __connman_inet_add_default_to_table(int ifindex, const char *gateway); #include <connman/resolver.h> diff --git a/src/inet.c b/src/inet.c index 4e6d1c1..eb586e3 100644 --- a/src/inet.c +++ b/src/inet.c @@ -2453,3 +2453,66 @@ int __connman_inet_del_fwmark_rule(int ifindex, int family, uint32_t fwmark) return iprule_modify(RTM_DELRULE, family, table_id, fwmark); } + +int __connman_inet_add_default_to_table(int ifindex, const char *gateway) +{ + /* ip route add default via 1.2.3.4 dev wlan0 table 1234 */ + + struct __connman_inet_rtnl_handle rth; + unsigned char buf[sizeof(struct in6_addr)]; + uint32_t table_id; + int ret, len; + int family = connman_inet_check_ipaddress(gateway); + + switch (family) { + case AF_INET: + len = 4; + break; + case AF_INET6: + len = 16; + break; + default: + return -EINVAL; + } + + ret = inet_pton(family, gateway, buf); + if (ret <= 0) + return -EINVAL; + + memset(&rth, 0, sizeof(rth)); + + rth.req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg)); + rth.req.n.nlmsg_flags = NLM_F_REQUEST | NLM_F_CREATE | NLM_F_EXCL; + rth.req.n.nlmsg_type = RTM_NEWROUTE; + rth.req.u.r.rt.rtm_family = family; + rth.req.u.r.rt.rtm_table = RT_TABLE_MAIN; + rth.req.u.r.rt.rtm_scope = RT_SCOPE_NOWHERE; + rth.req.u.r.rt.rtm_protocol = RTPROT_BOOT; + rth.req.u.r.rt.rtm_scope = RT_SCOPE_UNIVERSE; + rth.req.u.r.rt.rtm_type = RTN_UNICAST; + + __connman_inet_rtnl_addattr_l(&rth.req.n, sizeof(rth.req), RTA_GATEWAY, + buf, len); + table_id = get_table_id(ifindex); + if (table_id < 256) { + rth.req.u.r.rt.rtm_table = table_id; + } else { + rth.req.u.r.rt.rtm_table = RT_TABLE_UNSPEC; + __connman_inet_rtnl_addattr32(&rth.req.n, sizeof(rth.req), + RTA_TABLE, table_id); + } + + __connman_inet_rtnl_addattr32(&rth.req.n, sizeof(rth.req), + RTA_OIF, ifindex); + + ret = __connman_inet_rtnl_open(&rth); + if (ret < 0) + goto done; + + ret = __connman_inet_rtnl_send(&rth, &rth.req.n); + +done: + __connman_inet_rtnl_close(&rth); + + return ret; +} -- 1.8.1.3.566.gaa39828 _______________________________________________ connman mailing list connman@connman.net http://lists.connman.net/listinfo/connman