diff --git a/sys/net/if_vlan.c b/sys/net/if_vlan.c index 5a8fafe6d421..758800acadf7 100644 --- a/sys/net/if_vlan.c +++ b/sys/net/if_vlan.c @@ -502,7 +502,7 @@ vlan_start(struct ifnet *ifp) m_freem(m); continue; } - *(u_int*)(mtag + 1) = ifv->ifv_tag; + VLAN_TAG_VALUE(mtag) = ifv->ifv_tag; m_tag_prepend(m, mtag); m->m_flags |= M_VLANTAG; } else { diff --git a/sys/net/if_vlan_var.h b/sys/net/if_vlan_var.h index 11cbf7b20fcf..c55d5d1ec555 100644 --- a/sys/net/if_vlan_var.h +++ b/sys/net/if_vlan_var.h @@ -96,6 +96,12 @@ struct vlanreq { #define MTAG_VLAN 1035328035 #define MTAG_VLAN_TAG 0 /* tag of VLAN interface */ +/* + * This macro must expand to a lvalue so that it can be used + * to set a tag with a simple assignment. + */ +#define VLAN_TAG_VALUE(_mt) (*(u_int *)((_mt) + 1)) + #define VLAN_INPUT_TAG(_ifp, _m, _t, _errcase) do { \ struct m_tag *mtag; \ mtag = m_tag_alloc(MTAG_VLAN, MTAG_VLAN_TAG, \ @@ -105,7 +111,7 @@ struct vlanreq { m_freem(_m); \ _errcase; \ } \ - *(u_int *)(mtag+1) = (_t); \ + VLAN_TAG_VALUE(mtag) = (_t); \ m_tag_prepend((_m), mtag); \ (_m)->m_flags |= M_VLANTAG; \ } while (0) @@ -113,7 +119,6 @@ struct vlanreq { #define VLAN_OUTPUT_TAG(_ifp, _m) \ ((_m)->m_flags & M_VLANTAG ? \ m_tag_locate((_m), MTAG_VLAN, MTAG_VLAN_TAG, NULL) : NULL) -#define VLAN_TAG_VALUE(_mt) (*(u_int *)((_mt)+1)) #endif /* _KERNEL */ #endif /* _NET_IF_VLAN_VAR_H_ */