From: Jukka Rissanen <[email protected]>
---
src/connman.h | 1 +
src/inet.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 64 insertions(+)
diff --git a/src/connman.h b/src/connman.h
index aca644d..4bcc37a 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.2.rc3.16.gce432ca
_______________________________________________
connman mailing list
[email protected]
http://lists.connman.net/listinfo/connman