* Delete a vif from the vif table */
| 941 | * Delete a vif from the vif table |
| 942 | */ |
| 943 | static int |
| 944 | del_vif_locked(vifi_t vifi) |
| 945 | { |
| 946 | struct vif *vifp; |
| 947 | |
| 948 | VIF_LOCK_ASSERT(); |
| 949 | |
| 950 | if (vifi >= V_numvifs) { |
| 951 | return EINVAL; |
| 952 | } |
| 953 | vifp = &V_viftable[vifi]; |
| 954 | if (in_nullhost(vifp->v_lcl_addr)) { |
| 955 | return EADDRNOTAVAIL; |
| 956 | } |
| 957 | |
| 958 | if (!(vifp->v_flags & (VIFF_TUNNEL | VIFF_REGISTER))) |
| 959 | if_allmulti(vifp->v_ifp, 0); |
| 960 | |
| 961 | if (vifp->v_flags & VIFF_REGISTER) |
| 962 | V_reg_vif_num = VIFI_INVALID; |
| 963 | |
| 964 | bzero((caddr_t)vifp, sizeof (*vifp)); |
| 965 | |
| 966 | CTR2(KTR_IPMF, "%s: delete vif %d", __func__, (int)vifi); |
| 967 | |
| 968 | /* Adjust numvifs down */ |
| 969 | for (vifi = V_numvifs; vifi > 0; vifi--) |
| 970 | if (!in_nullhost(V_viftable[vifi-1].v_lcl_addr)) |
| 971 | break; |
| 972 | V_numvifs = vifi; |
| 973 | |
| 974 | return 0; |
| 975 | } |
| 976 | |
| 977 | static int |
| 978 | del_vif(vifi_t vifi) |
no test coverage detected