void devif_send(struct net_driver_s *dev, const void *buf, int len) { DEBUGASSERT(dev && len > 0 && len < NET_DEV_MTU(dev)); memcpy(dev->d_appdata, buf, len); dev->d_sndlen = len; }
void devif_pkt_send(FAR struct net_driver_s *dev, FAR const void *buf, unsigned int len) { DEBUGASSERT(dev && len > 0 && len < NET_DEV_MTU(dev)); /* Copy the data into the device packet buffer */ memcpy(dev->d_buf, buf, len); /* Set the number of bytes to send */ dev->d_len = len; dev->d_sndlen = len; }
void devif_iob_send(FAR struct net_driver_s *dev, FAR struct iob_s *iob, unsigned int len, unsigned int offset) { DEBUGASSERT(dev && len > 0 && len < NET_DEV_MTU(dev)); /* Copy the data from the I/O buffer chain to the device buffer */ iob_copyout(dev->d_snddata, iob, len, offset); dev->d_sndlen = len; #ifdef CONFIG_NET_TCP_WRBUFFER_DUMP /* Dump the outgoing device buffer */ lib_dumpbuffer("devif_iob_send", dev->d_snddata, len); #endif }
static int netdev_ifrioctl(FAR struct socket *psock, int cmd, FAR struct ifreq *req) { FAR struct net_driver_s *dev; int ret = -EINVAL; nvdbg("cmd: %d\n", cmd); /* Execute the command */ switch (cmd) { #ifdef CONFIG_NET_IPv4 case SIOCGIFADDR: /* Get IP address */ { dev = netdev_ifrdev(req); if (dev) { 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) { netdev_ifdown(dev); ioctl_setipv4addr(&dev->d_ipaddr, &req->ifr_addr); netdev_ifup(dev); ret = OK; } } break; #endif #ifdef CONFIG_NET_IPv4 case SIOCGIFDSTADDR: /* Get P-to-P address */ { dev = netdev_ifrdev(req); if (dev) { 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_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_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_setipv4addr(&dev->d_netmask, &req->ifr_addr); ret = OK; } } break; #endif #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_ipv6addr); 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; netdev_ifdown(dev); ioctl_setipv6addr(dev->d_ipv6addr, &lreq->lifr_addr); netdev_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_ipv6draddr); 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_ipv6draddr, &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 SIOCGLIFNETMASK: /* Get network mask */ { dev = netdev_ifrdev(req); if (dev) { FAR struct lifreq *lreq = (FAR struct lifreq *)req; ioctl_getipv6addr(&lreq->lifr_addr, dev->d_ipv6netmask); 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_ipv6netmask, &lreq->lifr_addr); ret = OK; } } break; #endif case SIOCGLIFMTU: /* Get MTU size */ case SIOCGIFMTU: /* Get MTU size */ { dev = netdev_ifrdev(req); if (dev) { req->ifr_mtu = NET_DEV_MTU(dev); ret = OK; } } break; #ifdef CONFIG_NET_ICMPv6_AUTOCONF case SIOCIFAUTOCONF: /* Perform ICMPv6 auto-configuration */ { dev = netdev_ifrdev(req); if (dev) { ret = icmpv6_autoconfig(dev); } } break; #endif case SIOCSIFFLAGS: /* Sets the interface flags */ { /* Is this a request to bring the interface up? */ dev = netdev_ifrdev(req); if (dev) { if (req->ifr_flags & IFF_UP) { /* Yes.. bring the interface up */ netdev_ifup(dev); } /* Is this a request to take the interface down? */ else if (req->ifr_flags & IFF_DOWN) { /* Yes.. take the interface down */ netdev_ifdown(dev); } } ret = OK; } break; case SIOCGIFFLAGS: /* Gets the interface flags */ { dev = netdev_ifrdev(req); if (dev) { req->ifr_flags = dev->d_flags; } ret = OK; } break; /* MAC address operations only make sense if Ethernet is supported */ #ifdef CONFIG_NET_ETHERNET case SIOCGIFHWADDR: /* Get hardware address */ { dev = netdev_ifrdev(req); if (dev) { req->ifr_hwaddr.sa_family = AF_INETX; memcpy(req->ifr_hwaddr.sa_data, dev->d_mac.ether_addr_octet, IFHWADDRLEN); ret = OK; } } break; case SIOCSIFHWADDR: /* Set hardware address -- will not take effect until ifup */ { dev = netdev_ifrdev(req); if (dev) { memcpy(dev->d_mac.ether_addr_octet, req->ifr_hwaddr.sa_data, IFHWADDRLEN); ret = OK; } } break; #endif case SIOCDIFADDR: /* Delete IP address */ { dev = netdev_ifrdev(req); if (dev) { netdev_ifdown(dev); #ifdef CONFIG_NET_IPv4 dev->d_ipaddr = 0; #endif #ifdef CONFIG_NET_IPv6 memset(&dev->d_ipv6addr, 0, sizeof(net_ipv6addr_t)); #endif ret = OK; } } break; case SIOCGIFCOUNT: /* Get number of devices */ { req->ifr_count = netdev_count(); ret = -ENOSYS; } break; #ifdef CONFIG_NET_ARPIOCTLS case SIOCSARP: /* Set a ARP mapping */ case SIOCDARP: /* Delete an ARP mapping */ case SIOCGARP: /* Get an ARP mapping */ # error "IOCTL Commands not implemented" #endif #ifdef CONFIG_NETDEV_PHY_IOCTL #ifdef CONFIG_ARCH_PHY_INTERRUPT case SIOCMIINOTIFY: /* Set up for PHY event notifications */ { dev = netdev_ifrdev(req); if (dev && dev->d_ioctl) { struct mii_iotcl_notify_s *notify = &req->ifr_ifru.ifru_mii_notify; ret = dev->d_ioctl(dev, cmd, ((long)(uintptr_t)notify)); } } break; #endif case SIOCGMIIPHY: /* Get address of MII PHY in use */ case SIOCGMIIREG: /* Get MII register via MDIO */ case SIOCSMIIREG: /* Set MII register via MDIO */ { dev = netdev_ifrdev(req); if (dev && dev->d_ioctl) { struct mii_ioctl_data_s *mii_data = &req->ifr_ifru.ifru_mii_data; ret = dev->d_ioctl(dev, cmd, ((long)(uintptr_t)mii_data)); } } break; #endif default: { ret = -ENOTTY; } break;; } return ret; }