On Tue, Oct 09, 2012 at 04:08:32PM +0900, Simon Horman wrote: > +static int push_mpls(struct sk_buff *skb, const struct ovs_action_push_mpls > *mpls) > +{ > + u32 l2_size; > + __be32 *new_mpls_label; > + > + if (skb_cow_head(skb, MPLS_HLEN) < 0) { > + kfree_skb(skb); > + return -ENOMEM; > + } > + > + l2_size = skb_cb_mpls_stack_offset(skb); > + skb_push(skb, MPLS_HLEN); > + memmove(skb_mac_header(skb) - MPLS_HLEN, skb_mac_header(skb), l2_size); > + skb_reset_mac_header(skb); > + > + new_mpls_label = (__be32 *)(skb_mac_header(skb) + l2_size); > + *new_mpls_label = mpls->mpls_label; > + > + set_ethertype(skb, mpls->mpls_ethertype); > + return 0; > +} > + > +static int pop_mpls(struct sk_buff *skb, const __be16 *ethertype) > +{ > + __be16 current_ethertype = get_ethertype(skb); > + if (current_ethertype == htons(ETH_P_MPLS_UC) || > + current_ethertype == htons(ETH_P_MPLS_MC)) { > + u32 l2_size = skb_cb_mpls_stack_offset(skb); > + > + memmove(skb_mac_header(skb) + MPLS_HLEN, skb_mac_header(skb), > l2_size); > + > + skb_pull(skb, MPLS_HLEN); > + skb_reset_mac_header(skb); > + > + set_ethertype(skb, *ethertype); > + } > + return 0; > +} > + > +static int set_mpls(struct sk_buff *skb, const __be32 *mpls_label) > +{ > + __be16 current_ethertype = get_ethertype(skb); > + if (current_ethertype == htons(ETH_P_MPLS_UC) || > + current_ethertype == htons(ETH_P_MPLS_MC)) { > + memcpy(skb_cb_mpls_stack(skb), mpls_label, sizeof(__be32)); > + } > + return 0; > +} > +
push_mpls and set_mpls overwrite BOS bit. So it can produce corrupted packet. Is this by design? -- yamahata _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev