summaryrefslogtreecommitdiff
path: root/nuttx/netutils/uiplib/uip-setnetmask.c
diff options
context:
space:
mode:
Diffstat (limited to 'nuttx/netutils/uiplib/uip-setnetmask.c')
-rw-r--r--nuttx/netutils/uiplib/uip-setnetmask.c32
1 files changed, 29 insertions, 3 deletions
diff --git a/nuttx/netutils/uiplib/uip-setnetmask.c b/nuttx/netutils/uiplib/uip-setnetmask.c
index d3acf867e..56e579ef3 100644
--- a/nuttx/netutils/uiplib/uip-setnetmask.c
+++ b/nuttx/netutils/uiplib/uip-setnetmask.c
@@ -43,10 +43,13 @@
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
+#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <netinet/in.h>
+#include <net/uip/uip-lib.h>
+
/****************************************************************************
* Global Functions
****************************************************************************/
@@ -72,18 +75,41 @@ int uip_setnetmask(const char *ifname, const struct in6_addr *addr)
int uip_setnetmask(const char *ifname, const struct in_addr *addr)
#endif
{
+ int ret = ERROR;
if (ifname && addr)
{
int sockfd = socket(PF_INET, SOCK_DGRAM, 0);
if (sockfd >= 0)
{
struct ifreq req;
+#ifdef CONFIG_NET_IPv6
+ struct sockaddr_in6 *inaddr;
+#else
+ struct sockaddr_in *inaddr;
+#endif
+ /* Add the device name to the request */
+
strncpy(req.ifr_name, ifname, IFNAMSIZ);
- memcpy(&req.ifr_addr, addr, sizeof(addr));
- return ioctl(sockfd, SIOCGIFNETMASK, (unsigned long)&req);
+
+ /* Add the INET address to the request */
+
+#ifdef CONFIG_NET_IPv6
+#error "req.ifr_addr.s_addr not big enough for IPv6 address"
+ inaddr = (struct sockaddr_in6 *)&req.ifr_addr;
+ inaddr->sin_family = AF_INET6;
+ inaddr->sin_port = 0;
+ memcpy(&inaddr->sin6_addr, addr, sizeof(struct in6_addr));
+#else
+ inaddr = (struct sockaddr_in *)&req.ifr_addr;
+ inaddr->sin_family = AF_INET;
+ inaddr->sin_port = 0;
+ memcpy(&inaddr->sin_addr, addr, sizeof(struct in_addr));
+#endif
+ ret = ioctl(sockfd, SIOCSIFNETMASK, (unsigned long)&req);
+ close(sockfd);
}
}
- return ERROR;
+ return ret;
}
#endif /* CONFIG_NET && CONFIG_NSOCKET_DESCRIPTORS */