From 14959b43e01d1fdddc08f20db33fad36e3ef1f49 Mon Sep 17 00:00:00 2001 From: Masayuki Ishikawa Date: Fri, 19 Jan 2018 08:33:56 +0900 Subject: [PATCH] apps/netutils/netlib: Add default route in netlib_set_dripv4addr() Signed-off-by: Masayuki Ishikawa --- netutils/netlib/netlib_setdripv4addr.c | 39 ++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/netutils/netlib/netlib_setdripv4addr.c b/netutils/netlib/netlib_setdripv4addr.c index c0ee3c00e..7a971e071 100644 --- a/netutils/netlib/netlib_setdripv4addr.c +++ b/netutils/netlib/netlib_setdripv4addr.c @@ -50,6 +50,10 @@ #include #include +#ifdef CONFIG_NET_ROUTE +# include +#endif + #include "netutils/netlib.h" /**************************************************************************** @@ -76,6 +80,21 @@ int netlib_set_dripv4addr(FAR const char *ifname, { int ret = ERROR; +#ifdef CONFIG_NET_ROUTE + struct sockaddr_in target; + struct sockaddr_in netmask; + struct sockaddr_in router; + + memset(&target, 0, sizeof(target)); + target.sin_family = AF_INET; + + memset(&netmask, 0, sizeof(netmask)); + netmask.sin_family = AF_INET; + + router.sin_addr = *addr; + router.sin_family = AF_INET; +#endif + if (ifname && addr) { int sockfd = socket(PF_INET, NETLIB_SOCK_TYPE, 0); @@ -96,6 +115,26 @@ int netlib_set_dripv4addr(FAR const char *ifname, memcpy(&inaddr->sin_addr, addr, sizeof(struct in_addr)); ret = ioctl(sockfd, SIOCSIFDSTADDR, (unsigned long)&req); + +#ifdef CONFIG_NET_ROUTE + if (OK == ret) + { + /* Delete the default route first */ + /* This call fails if no default route exists, but it's OK */ + + (void)delroute(sockfd, + (FAR struct sockaddr_storage *)&target, + (FAR struct sockaddr_storage *)&netmask); + + /* Then add the new default route */ + + ret = addroute(sockfd, + (FAR struct sockaddr_storage *)&target, + (FAR struct sockaddr_storage *)&netmask, + (FAR struct sockaddr_storage *)&router); + } +#endif + close(sockfd); } }