this basically makes the code use if_get instead of carrying a
pointer around. this is as mechanical as i can make it.
ok?
Index: if_vlan_var.h
===================================================================
RCS file: /cvs/src/sys/net/if_vlan_var.h,v
retrieving revision 1.33
diff -u -p -r1.33 if_vlan_var.h
--- if_vlan_var.h 14 Mar 2016 03:48:47 -0000 1.33
+++ if_vlan_var.h 22 Mar 2016 11:34:45 -0000
@@ -61,9 +61,8 @@ struct vlan_mc_entry {
struct ifvlan {
struct arpcom ifv_ac; /* make this an interface */
- struct ifnet *ifv_p; /* parent interface of this vlan */
+ unsigned int ifv_p; /* parent interface of this vlan */
struct ifv_linkmib {
- int ifvm_parent;
u_int16_t ifvm_proto; /* encapsulation ethertype */
u_int16_t ifvm_tag; /* tag to apply on packets leaving if */
u_int16_t ifvm_prio; /* prio to apply on packet leaving if */
Index: if_vlan.c
===================================================================
RCS file: /cvs/src/sys/net/if_vlan.c,v
retrieving revision 1.155
diff -u -p -r1.155 if_vlan.c
--- if_vlan.c 18 Mar 2016 02:40:04 -0000 1.155
+++ if_vlan.c 22 Mar 2016 11:34:45 -0000
@@ -235,7 +235,12 @@ vlan_start(struct ifnet *ifp)
uint8_t prio;
ifv = ifp->if_softc;
- ifp0 = ifv->ifv_p;
+ ifp0 = if_get(ifv->ifv_p);
+ if (ifp0 == NULL || (ifp0->if_flags & (IFF_UP|IFF_RUNNING)) !=
+ (IFF_UP|IFF_RUNNING)) {
+ ifq_purge(&ifp->if_snd);
+ goto leave;
+ }
for (;;) {
IFQ_DEQUEUE(&ifp->if_snd, m);
@@ -247,12 +252,6 @@ vlan_start(struct ifnet *ifp)
bpf_mtap_ether(ifp->if_bpf, m, BPF_DIRECTION_OUT);
#endif /* NBPFILTER > 0 */
- if ((ifp0->if_flags & (IFF_UP|IFF_RUNNING)) !=
- (IFF_UP|IFF_RUNNING)) {
- ifp->if_oerrors++;
- m_freem(m);
- continue;
- }
/* IEEE 802.1p has prio 0 and 1 swapped */
prio = m->m_pkthdr.pf.prio;
@@ -290,6 +289,9 @@ vlan_start(struct ifnet *ifp)
}
ifp->if_opackets++;
}
+
+leave:
+ if_put(ifp0);
}
struct mbuf *
@@ -358,7 +360,7 @@ vlan_input(struct ifnet *ifp0, struct mb
list = &tagh[TAG_HASH(tag)];
SRPL_FOREACH(ifv, list, &i, ifv_list) {
- if (ifp0 == ifv->ifv_p && tag == ifv->ifv_tag &&
+ if (ifp0->if_index == ifv->ifv_p && tag == ifv->ifv_tag &&
etype == ifv->ifv_type)
break;
}
@@ -417,13 +419,13 @@ vlan_config(struct ifvlan *ifv, struct i
if (ifp0->if_type != IFT_ETHER)
return EPROTONOSUPPORT;
- if (ifv->ifv_p == ifp0 && ifv->ifv_tag == tag) /* noop */
+ if (ifp0->if_index == ifv->ifv_p && ifv->ifv_tag == tag) /* noop */
return (0);
/* Remember existing interface flags and reset the interface */
flags = ifv->ifv_flags;
vlan_unconfig(&ifv->ifv_if, ifp0);
- ifv->ifv_p = ifp0;
+ ifv->ifv_p = ifp0->if_index;
ifv->ifv_if.if_baudrate = ifp0->if_baudrate;
if (ifp0->if_capabilities & IFCAP_VLAN_MTU) {
@@ -509,8 +511,9 @@ vlan_unconfig(struct ifnet *ifp, struct
struct ifnet *ifp0;
ifv = ifp->if_softc;
- if ((ifp0 = ifv->ifv_p) == NULL)
- return 0;
+ ifp0 = if_get(ifv->ifv_p);
+ if (ifp0 == NULL)
+ goto disconnect;
/* Unset promisc mode on the interface and its parent */
if (ifv->ifv_flags & IFVF_PROMISC) {
@@ -544,8 +547,9 @@ vlan_unconfig(struct ifnet *ifp, struct
*/
vlan_multi_apply(ifv, ifp0, SIOCDELMULTI);
+disconnect:
/* Disconnect from parent. */
- ifv->ifv_p = NULL;
+ ifv->ifv_p = 0;
ifv->ifv_if.if_mtu = ETHERMTU;
ifv->ifv_if.if_hardmtu = ETHERMTU;
ifv->ifv_flags = 0;
@@ -557,6 +561,8 @@ vlan_unconfig(struct ifnet *ifp, struct
bzero(LLADDR(sdl), ETHER_ADDR_LEN);
bzero(ifv->ifv_ac.ac_enaddr, ETHER_ADDR_LEN);
+ if_put(ifp0);
+
return (0);
}
@@ -564,12 +570,22 @@ void
vlan_vlandev_state(void *v)
{
struct ifvlan *ifv = v;
+ struct ifnet *ifp0;
+ int link_state = LINK_STATE_DOWN;
+ uint64_t baudrate = 0;
- if (ifv->ifv_if.if_link_state == ifv->ifv_p->if_link_state)
+ ifp0 = if_get(ifv->ifv_p);
+ if (ifp0 != NULL) {
+ link_state = ifp0->if_link_state;
+ baudrate = ifp0->if_baudrate;
+ }
+ if_put(ifp0);
+
+ if (ifv->ifv_if.if_link_state == link_state)
return;
- ifv->ifv_if.if_link_state = ifv->ifv_p->if_link_state;
- ifv->ifv_if.if_baudrate = ifv->ifv_p->if_baudrate;
+ ifv->ifv_if.if_link_state = link_state;
+ ifv->ifv_if.if_baudrate = baudrate;
if_link_state_change(&ifv->ifv_if);
}
@@ -577,17 +593,26 @@ int
vlan_set_promisc(struct ifnet *ifp)
{
struct ifvlan *ifv = ifp->if_softc;
+ struct ifnet *ifp0;
int error = 0;
+ ifp0 = if_get(ifv->ifv_p);
+ if (ifp0 == NULL)
+ goto leave;
+
if ((ifp->if_flags & IFF_PROMISC) != 0) {
if ((ifv->ifv_flags & IFVF_PROMISC) == 0)
- if ((error = ifpromisc(ifv->ifv_p, 1)) == 0)
+ if ((error = ifpromisc(ifp0, 1)) == 0)
ifv->ifv_flags |= IFVF_PROMISC;
} else {
if ((ifv->ifv_flags & IFVF_PROMISC) != 0)
- if ((error = ifpromisc(ifv->ifv_p, 0)) == 0)
+ if ((error = ifpromisc(ifp0, 0)) == 0)
ifv->ifv_flags &= ~IFVF_PROMISC;
}
+
+leave:
+ if_put(ifp0);
+
return (0);
}
@@ -608,14 +633,14 @@ vlan_ioctl(struct ifnet *ifp, u_long cmd
switch (cmd) {
case SIOCSIFADDR:
- if (ifv->ifv_p != NULL)
+ if (ifv->ifv_p != 0)
ifp->if_flags |= IFF_UP;
else
error = EINVAL;
break;
case SIOCSIFMTU:
- if (ifv->ifv_p != NULL) {
+ if (ifv->ifv_p != 0) {
if (ifr->ifr_mtu < ETHERMIN ||
ifr->ifr_mtu > ifv->ifv_if.if_hardmtu)
error = EINVAL;
@@ -664,11 +689,13 @@ vlan_ioctl(struct ifnet *ifp, u_long cmd
case SIOCGETVLAN:
bzero(&vlr, sizeof vlr);
- if (ifv->ifv_p) {
+ ifp0 = if_get(ifv->ifv_p);
+ if (ifp0) {
snprintf(vlr.vlr_parent, sizeof(vlr.vlr_parent),
- "%s", ifv->ifv_p->if_xname);
+ "%s", ifp0->if_xname);
vlr.vlr_tag = ifv->ifv_tag;
}
+ if_put(ifp0);
error = copyout(&vlr, ifr->ifr_data, sizeof vlr);
break;
case SIOCSIFFLAGS:
@@ -676,7 +703,7 @@ vlan_ioctl(struct ifnet *ifp, u_long cmd
* For promiscuous mode, we enable promiscuous mode on
* the parent if we need promiscuous on the VLAN interface.
*/
- if (ifv->ifv_p != NULL)
+ if (ifv->ifv_p != 0)
error = vlan_set_promisc(ifp);
break;
@@ -725,9 +752,10 @@ vlan_multi_add(struct ifvlan *ifv, struc
memcpy(&mc->mc_addr, &ifr->ifr_addr, ifr->ifr_addr.sa_len);
LIST_INSERT_HEAD(&ifv->vlan_mc_listhead, mc, mc_entries);
- ifp0 = ifv->ifv_p;
+ ifp0 = if_get(ifv->ifv_p);
error = (ifp0 == NULL) ? 0 :
(*ifp0->if_ioctl)(ifp0, SIOCADDMULTI, (caddr_t)ifr);
+ if_put(ifp0);
if (error != 0)
goto ioctl_failed;
@@ -778,9 +806,10 @@ vlan_multi_del(struct ifvlan *ifv, struc
if (!ISSET(ifv->ifv_if.if_flags, IFF_RUNNING))
goto forget;
- ifp0 = ifv->ifv_p;
+ ifp0 = if_get(ifv->ifv_p);
error = (ifp0 == NULL) ? 0 :
(*ifp0->if_ioctl)(ifp0, SIOCDELMULTI, (caddr_t)ifr);
+ if_put(ifp0);
if (error != 0) {
(void)ether_addmulti(ifr, &ifv->ifv_ac);