| 701 | } |
| 702 | |
| 703 | static int |
| 704 | stf_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) |
| 705 | { |
| 706 | struct ifaddr *ifa; |
| 707 | struct ifreq *ifr; |
| 708 | struct sockaddr_in6 *sin6; |
| 709 | struct in_addr addr; |
| 710 | int error, mtu; |
| 711 | |
| 712 | error = 0; |
| 713 | switch (cmd) { |
| 714 | case SIOCSIFADDR: |
| 715 | ifa = (struct ifaddr *)data; |
| 716 | if (ifa == NULL || ifa->ifa_addr->sa_family != AF_INET6) { |
| 717 | error = EAFNOSUPPORT; |
| 718 | break; |
| 719 | } |
| 720 | sin6 = (struct sockaddr_in6 *)ifa->ifa_addr; |
| 721 | if (!IN6_IS_ADDR_6TO4(&sin6->sin6_addr)) { |
| 722 | error = EINVAL; |
| 723 | break; |
| 724 | } |
| 725 | bcopy(GET_V4(&sin6->sin6_addr), &addr, sizeof(addr)); |
| 726 | if (isrfc1918addr(&addr)) { |
| 727 | error = EINVAL; |
| 728 | break; |
| 729 | } |
| 730 | |
| 731 | ifp->if_flags |= IFF_UP; |
| 732 | ifp->if_drv_flags |= IFF_DRV_RUNNING; |
| 733 | break; |
| 734 | |
| 735 | case SIOCADDMULTI: |
| 736 | case SIOCDELMULTI: |
| 737 | ifr = (struct ifreq *)data; |
| 738 | if (ifr && ifr->ifr_addr.sa_family == AF_INET6) |
| 739 | ; |
| 740 | else |
| 741 | error = EAFNOSUPPORT; |
| 742 | break; |
| 743 | |
| 744 | case SIOCGIFMTU: |
| 745 | break; |
| 746 | |
| 747 | case SIOCSIFMTU: |
| 748 | ifr = (struct ifreq *)data; |
| 749 | mtu = ifr->ifr_mtu; |
| 750 | /* RFC 4213 3.2 ideal world MTU */ |
| 751 | if (mtu < IPV6_MINMTU || mtu > IF_MAXMTU - 20) |
| 752 | return (EINVAL); |
| 753 | ifp->if_mtu = mtu; |
| 754 | break; |
| 755 | |
| 756 | default: |
| 757 | error = EINVAL; |
| 758 | break; |
| 759 | } |
| 760 |
nothing calls this directly
no test coverage detected