mirror of
https://github.com/apache/nuttx.git
synced 2026-06-06 00:14:22 +08:00
Networking: Add support for IPv6 ioctls
This commit is contained in:
+4
-2
@@ -184,11 +184,13 @@ endmenu # Data link support
|
||||
source "net/socket/Kconfig"
|
||||
source "net/netdev/Kconfig"
|
||||
|
||||
#source "net/ipv4/Kconfig"
|
||||
# source "net/ipv4/Kconfig"
|
||||
# Currently cannot select both IPv4 and IPv6
|
||||
|
||||
config NET_IPv4
|
||||
bool
|
||||
default y
|
||||
default y if !NET_IPv6
|
||||
default n if NET_IPv6
|
||||
|
||||
source "net/ipv6/Kconfig"
|
||||
source "net/pkt/Kconfig"
|
||||
|
||||
+186
-34
@@ -83,36 +83,53 @@
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: ioctl_getipaddr
|
||||
* Name: ioctl_getipv4addr
|
||||
*
|
||||
* Description:
|
||||
* Copy IP addresses from device structure to user memory.
|
||||
*
|
||||
* Input Parameters:
|
||||
* outaddr - Pointer to the user-provided memory to receive the address.
|
||||
* Actual type may be either 'struct sockaddr' (IPv4 only) or type
|
||||
* 'struct sockaddr_storage' (both IPv4 and IPv6).
|
||||
* inaddr - The source IP adress in the device structure.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static void ioctl_getipaddr(FAR void *outaddr, FAR const net_ipaddr_t *inaddr)
|
||||
#ifdef CONFIG_NET_IPv4
|
||||
static void ioctl_getipv4addr(FAR struct sockaddr *outaddr,
|
||||
FAR const net_ipaddr_t *inaddr)
|
||||
{
|
||||
#ifdef CONFIG_NET_IPv6
|
||||
FAR struct sockaddr_in6 *dest = (FAR struct sockaddr_in6 *)outaddr;
|
||||
dest->sin_family = AF_INET6;
|
||||
dest->sin_port = 0;
|
||||
memcpy(dest->sin6_addr.in6_u.u6_addr8, inaddr, 16);
|
||||
#else
|
||||
FAR struct sockaddr_in *dest = (FAR struct sockaddr_in *)outaddr;
|
||||
dest->sin_family = AF_INET;
|
||||
dest->sin_port = 0;
|
||||
dest->sin_addr.s_addr = *inaddr;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: ioctl_setipaddr
|
||||
* Name: ioctl_getipv6addr
|
||||
*
|
||||
* Description:
|
||||
* Copy IP addresses from device structure to user memory.
|
||||
*
|
||||
* Input Parameters:
|
||||
* outaddr - Pointer to the user-provided memory to receive the address.
|
||||
* inaddr - The source IP adress in the device structure.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_NET_IPv6
|
||||
static void ioctl_getipv6addr(FAR struct sockaddr_storage *outaddr,
|
||||
FAR const net_ipaddr_t *inaddr)
|
||||
{
|
||||
FAR struct sockaddr_in6 *dest = (FAR struct sockaddr_in6 *)outaddr;
|
||||
dest->sin_family = AF_INET6;
|
||||
dest->sin_port = 0;
|
||||
memcpy(dest->sin6_addr.in6_u.u6_addr8, inaddr, 16);
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: ioctl_setipv4addr
|
||||
*
|
||||
* Description:
|
||||
* Copy IP addresses from user memory into the device structure
|
||||
@@ -120,21 +137,40 @@ static void ioctl_getipaddr(FAR void *outaddr, FAR const net_ipaddr_t *inaddr)
|
||||
* Input Parameters:
|
||||
* outaddr - Pointer to the source IP address in the device structure.
|
||||
* inaddr - Pointer to the user-provided memory to containing the new IP
|
||||
* address. Actual type may be either 'struct sockaddr' (IPv4 only) or
|
||||
* type 'struct sockaddr_storage' (both IPv4 and IPv6).
|
||||
* address.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static void ioctl_setipaddr(FAR net_ipaddr_t *outaddr, FAR const void *inaddr)
|
||||
#ifdef CONFIG_NET_IPv4
|
||||
static void ioctl_setipv4addr(FAR net_ipaddr_t *outaddr,
|
||||
FAR const struct sockaddr *inaddr)
|
||||
{
|
||||
#ifdef CONFIG_NET_IPv6
|
||||
FAR const struct sockaddr_in6 *src = (FAR const struct sockaddr_in6 *)inaddr;
|
||||
memcpy(outaddr, src->sin6_addr.in6_u.u6_addr8, 16);
|
||||
#else
|
||||
FAR const struct sockaddr_in *src = (FAR const struct sockaddr_in *)inaddr;
|
||||
*outaddr = src->sin_addr.s_addr;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: ioctl_setipv6addr
|
||||
*
|
||||
* Description:
|
||||
* Copy IP addresses from user memory into the device structure
|
||||
*
|
||||
* Input Parameters:
|
||||
* outaddr - Pointer to the source IP address in the device structure.
|
||||
* inaddr - Pointer to the user-provided memory to containing the new IP
|
||||
* address.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_NET_IPv6
|
||||
static void ioctl_setipv6addr(FAR net_ipaddr_t *outaddr,
|
||||
FAR const struct sockaddr_storage *inaddr)
|
||||
{
|
||||
FAR const struct sockaddr_in6 *src = (FAR const struct sockaddr_in6 *)inaddr;
|
||||
memcpy(outaddr, src->sin6_addr.in6_u.u6_addr8, 16);
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: ioctl_ifup / ioctl_ifdown
|
||||
@@ -246,75 +282,198 @@ static int netdev_ifrioctl(FAR struct socket *psock, int cmd,
|
||||
|
||||
switch (cmd)
|
||||
{
|
||||
#ifdef CONFIG_NET_IPv4
|
||||
case SIOCGIFADDR: /* Get IP address */
|
||||
{
|
||||
dev = netdev_ifrdev(req);
|
||||
if (dev)
|
||||
{
|
||||
ioctl_getipaddr(&req->ifr_addr, &dev->d_ipaddr);
|
||||
ioctl_getipv4addr(&req->ifr_addr, &dev->d_ipaddr);
|
||||
ret = OK;
|
||||
}
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef CONFIG_NET_IPv4
|
||||
case SIOCSIFADDR: /* Set IP address */
|
||||
{
|
||||
dev = netdev_ifrdev(req);
|
||||
if (dev)
|
||||
{
|
||||
ioctl_ifdown(dev);
|
||||
ioctl_setipaddr(&dev->d_ipaddr, &req->ifr_addr);
|
||||
ioctl_setipv4addr(&dev->d_ipaddr, &req->ifr_addr);
|
||||
ioctl_ifup(dev);
|
||||
ret = OK;
|
||||
}
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NET_IPv4
|
||||
case SIOCGIFDSTADDR: /* Get P-to-P address */
|
||||
{
|
||||
dev = netdev_ifrdev(req);
|
||||
if (dev)
|
||||
{
|
||||
ioctl_getipaddr(&req->ifr_dstaddr, &dev->d_draddr);
|
||||
ioctl_getipv4addr(&req->ifr_dstaddr, &dev->d_draddr);
|
||||
ret = OK;
|
||||
}
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NET_IPv4
|
||||
case SIOCSIFDSTADDR: /* Set P-to-P address */
|
||||
{
|
||||
dev = netdev_ifrdev(req);
|
||||
if (dev)
|
||||
{
|
||||
ioctl_setipaddr(&dev->d_draddr, &req->ifr_dstaddr);
|
||||
ioctl_setipv4addr(&dev->d_draddr, &req->ifr_dstaddr);
|
||||
ret = OK;
|
||||
}
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NET_IPv4
|
||||
case SIOCGIFBRDADDR: /* Get broadcast IP address */
|
||||
case SIOCSIFBRDADDR: /* Set broadcast IP address */
|
||||
{
|
||||
ret = -ENOSYS;
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NET_IPv4
|
||||
case SIOCGIFNETMASK: /* Get network mask */
|
||||
{
|
||||
dev = netdev_ifrdev(req);
|
||||
if (dev)
|
||||
{
|
||||
ioctl_getipaddr(&req->ifr_addr, &dev->d_netmask);
|
||||
ioctl_getipv4addr(&req->ifr_addr, &dev->d_netmask);
|
||||
ret = OK;
|
||||
}
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NET_IPv4
|
||||
case SIOCSIFNETMASK: /* Set network mask */
|
||||
{
|
||||
dev = netdev_ifrdev(req);
|
||||
if (dev)
|
||||
{
|
||||
ioctl_setipaddr(&dev->d_netmask, &req->ifr_addr);
|
||||
ioctl_setipv4addr(&dev->d_netmask, &req->ifr_addr);
|
||||
ret = OK;
|
||||
}
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
||||
case SIOCGIFMTU: /* Get MTU size */
|
||||
#ifdef CONFIG_NET_IPv6
|
||||
case SIOCGLIFADDR: /* Get IP address */
|
||||
{
|
||||
dev = netdev_ifrdev(req);
|
||||
if (dev)
|
||||
{
|
||||
FAR struct lifreq *lreq = (FAR struct lifreq *)req;
|
||||
|
||||
ioctl_getipv6addr(&lreq->lifr_addr, &dev->d_ipaddr);
|
||||
ret = OK;
|
||||
}
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NET_IPv6
|
||||
case SIOCSLIFADDR: /* Set IP address */
|
||||
{
|
||||
dev = netdev_ifrdev(req);
|
||||
if (dev)
|
||||
{
|
||||
FAR struct lifreq *lreq = (FAR struct lifreq *)req;
|
||||
|
||||
ioctl_ifdown(dev);
|
||||
ioctl_setipv6addr(&dev->d_ipaddr, &lreq->lifr_addr);
|
||||
ioctl_ifup(dev);
|
||||
ret = OK;
|
||||
}
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NET_IPv6
|
||||
case SIOCGLIFDSTADDR: /* Get P-to-P address */
|
||||
{
|
||||
dev = netdev_ifrdev(req);
|
||||
if (dev)
|
||||
{
|
||||
FAR struct lifreq *lreq = (FAR struct lifreq *)req;
|
||||
|
||||
ioctl_getipv6addr(&lreq->lifr_dstaddr, &dev->d_draddr);
|
||||
ret = OK;
|
||||
}
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NET_IPv6
|
||||
case SIOCSLIFDSTADDR: /* Set P-to-P address */
|
||||
{
|
||||
dev = netdev_ifrdev(req);
|
||||
if (dev)
|
||||
{
|
||||
FAR struct lifreq *lreq = (FAR struct lifreq *)req;
|
||||
|
||||
ioctl_setipv6addr(&dev->d_draddr, &lreq->lifr_dstaddr);
|
||||
ret = OK;
|
||||
}
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NET_IPv6
|
||||
case SIOCGLIFBRDADDR: /* Get broadcast IP address */
|
||||
case SIOCSLIFBRDADDR: /* Set broadcast IP address */
|
||||
{
|
||||
ret = -ENOSYS;
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NET_IPv6
|
||||
case SIOCGIFNETMASK: /* Get network mask */
|
||||
{
|
||||
dev = netdev_ifrdev(req);
|
||||
if (dev)
|
||||
{
|
||||
FAR struct lifreq *lreq = (FAR struct lifreq *)req;
|
||||
|
||||
ioctl_getipv6addr(&lreq->lifr_addr, &dev->d_netmask);
|
||||
ret = OK;
|
||||
}
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NET_IPv6
|
||||
case SIOCSLIFNETMASK: /* Set network mask */
|
||||
{
|
||||
dev = netdev_ifrdev(req);
|
||||
if (dev)
|
||||
{
|
||||
FAR struct lifreq *lreq = (FAR struct lifreq *)req;
|
||||
ioctl_setipv6addr(&dev->d_netmask, &lreq->lifr_addr);
|
||||
ret = OK;
|
||||
}
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
||||
case SIOCGLIFMTU: /* Get MTU size */
|
||||
case SIOCGIFMTU: /* Get MTU size */
|
||||
{
|
||||
dev = netdev_ifrdev(req);
|
||||
if (dev)
|
||||
@@ -414,13 +573,6 @@ static int netdev_ifrioctl(FAR struct socket *psock, int cmd,
|
||||
}
|
||||
break;
|
||||
|
||||
case SIOCGIFBRDADDR: /* Get broadcast IP address */
|
||||
case SIOCSIFBRDADDR: /* Set broadcast IP address */
|
||||
{
|
||||
ret = -ENOSYS;
|
||||
}
|
||||
break;
|
||||
|
||||
#ifdef CONFIG_NET_ARPIOCTLS
|
||||
case SIOCSARP: /* Set a ARP mapping */
|
||||
case SIOCDARP: /* Delete an ARP mapping */
|
||||
|
||||
Reference in New Issue
Block a user