datapath: Calculate proper checksum for set_tp_src/dst action
authorJustin Pettit <jpettit@nicira.com>
Tue, 17 Nov 2009 01:51:31 +0000 (17:51 -0800)
committerJustin Pettit <jpettit@nicira.com>
Tue, 17 Nov 2009 02:11:40 +0000 (18:11 -0800)
When the set_tp_src or set_tp_dst action is used, the calculation for
where the checksum is located was wrong.  This caused the checksum to
not be updated and packet corruption in the bad offset.

datapath/actions.c

index 8a3e8ab..a21bce8 100644 (file)
@@ -259,8 +259,8 @@ set_tp_port(struct sk_buff *skb, struct odp_flow_key *key,
                u16 *f = a->type == ODPAT_SET_TP_SRC ? &th->source : &th->dest;
                u16 old = *f;
                u16 new = a->tp_port;
-               update_csum((u16*)((u8*)skb->data + check_ofs),
-                           skb, old, new, 1);
+               update_csum((u16*)(skb_transport_header(skb) + check_ofs), 
+                               skb, old, new, 1);
                *f = new;
        }
        return skb;