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

Reply via email to