| 1136 | } |
| 1137 | |
| 1138 | int |
| 1139 | ether_ioctl(struct ifnet *ifp, u_long command, caddr_t data) |
| 1140 | { |
| 1141 | struct ifaddr *ifa = (struct ifaddr *) data; |
| 1142 | struct ifreq *ifr = (struct ifreq *) data; |
| 1143 | int error = 0; |
| 1144 | |
| 1145 | switch (command) { |
| 1146 | case SIOCSIFADDR: |
| 1147 | ifp->if_flags |= IFF_UP; |
| 1148 | |
| 1149 | switch (ifa->ifa_addr->sa_family) { |
| 1150 | #ifdef INET |
| 1151 | case AF_INET: |
| 1152 | ifp->if_init(ifp->if_softc); /* before arpwhohas */ |
| 1153 | arp_ifinit(ifp, ifa); |
| 1154 | break; |
| 1155 | #endif |
| 1156 | default: |
| 1157 | ifp->if_init(ifp->if_softc); |
| 1158 | break; |
| 1159 | } |
| 1160 | break; |
| 1161 | |
| 1162 | case SIOCGIFADDR: |
| 1163 | bcopy(IF_LLADDR(ifp), &ifr->ifr_addr.sa_data[0], |
| 1164 | ETHER_ADDR_LEN); |
| 1165 | break; |
| 1166 | |
| 1167 | case SIOCSIFMTU: |
| 1168 | /* |
| 1169 | * Set the interface MTU. |
| 1170 | */ |
| 1171 | if (ifr->ifr_mtu > ETHERMTU) { |
| 1172 | error = EINVAL; |
| 1173 | } else { |
| 1174 | ifp->if_mtu = ifr->ifr_mtu; |
| 1175 | } |
| 1176 | break; |
| 1177 | |
| 1178 | case SIOCSLANPCP: |
| 1179 | error = priv_check(curthread, PRIV_NET_SETLANPCP); |
| 1180 | if (error != 0) |
| 1181 | break; |
| 1182 | if (ifr->ifr_lan_pcp > 7 && |
| 1183 | ifr->ifr_lan_pcp != IFNET_PCP_NONE) { |
| 1184 | error = EINVAL; |
| 1185 | } else { |
| 1186 | ifp->if_pcp = ifr->ifr_lan_pcp; |
| 1187 | /* broadcast event about PCP change */ |
| 1188 | EVENTHANDLER_INVOKE(ifnet_event, ifp, IFNET_EVENT_PCP); |
| 1189 | } |
| 1190 | break; |
| 1191 | |
| 1192 | case SIOCGLANPCP: |
| 1193 | ifr->ifr_lan_pcp = ifp->if_pcp; |
| 1194 | break; |
| 1195 |
no test coverage detected