X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=datapath%2Ftunnel.c;h=bd63da5555d849990d64e79ac9b2c35291cf9917;hb=bd3ad2c3508aaf7283f3ee041ecd3e5108471b21;hp=910278686212c486912fcb2bdcf69d21fbcf5dff;hpb=85606e05b691be7c2f2d4bcf0e91170b71ec8fbb;p=sliver-openvswitch.git diff --git a/datapath/tunnel.c b/datapath/tunnel.c index 910278686..bd63da555 100644 --- a/datapath/tunnel.c +++ b/datapath/tunnel.c @@ -144,6 +144,9 @@ static struct sk_buff *handle_offloads(struct sk_buff *skb) if (skb_is_gso(skb)) { struct sk_buff *nskb; + char cb[sizeof(skb->cb)]; + + memcpy(cb, skb->cb, sizeof(cb)); nskb = __skb_gso_segment(skb, 0, false); if (IS_ERR(nskb)) { @@ -153,6 +156,10 @@ static struct sk_buff *handle_offloads(struct sk_buff *skb) consume_skb(skb); skb = nskb; + while (nskb) { + memcpy(nskb->cb, cb, sizeof(cb)); + nskb = nskb->next; + } } else if (get_ip_summed(skb) == OVS_CSUM_PARTIAL) { /* Pages aren't locked and could change at any time. * If this happens after we compute the checksum, the @@ -186,7 +193,9 @@ u16 ovs_tnl_get_src_port(struct sk_buff *skb) int low; int high; unsigned int range; - u32 hash = OVS_CB(skb)->flow->hash; + struct sw_flow_key *pkt_key = OVS_CB(skb)->pkt_key; + u32 hash = jhash2((const u32 *)pkt_key, + sizeof(*pkt_key) / sizeof(u32), 0); inet_get_local_port_range(&low, &high); range = (high - low) + 1;