From 088a727c9ca2a9b54e11de94e1fc4396a277523a Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Fri, 18 Feb 2011 20:53:51 -0800 Subject: [PATCH] datapath: Properly initialize ovs_skb_cb of packet from userspace. The ovs_skb_cb in 'packet' in this function is initially a clone of the corresponding area in 'skb', which came from the Netlink layer and thus isn't necessarily all-zeros. This commit initializes it properly before passing it along to execute_actions(). The most common problem caused by failing to initialize the ovs_skb_cb properly was that on Linux 2.6.26 and earlier, where Open vSwitch keeps its own vlan_tci field inside ovs_skb_cb, the first packet of a flow would get sent out tagged with a random VLAN (usually 0x0001 or 0xffff in our testing). This commit should fix that problem. Another likely problem would be for turning on sFlow to randomly panic the kernel. That problem would not be kernel version dependent. We haven't been testing sFlow so we haven't noticed this problem. Signed-off-by: Ben Pfaff Acked-by: Justin Pettit Reported-by: Pankaj Thakkar --- datapath/datapath.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/datapath/datapath.c b/datapath/datapath.c index 940a58142..dcff05f29 100644 --- a/datapath/datapath.c +++ b/datapath/datapath.c @@ -709,6 +709,15 @@ static int odp_packet_cmd_execute(struct sk_buff *skb, struct genl_info *info) if (err) goto exit; + /* Initialize OVS_CB (it came from Netlink so might not be zeroed). */ + OVS_CB(packet)->vport = NULL; + OVS_CB(packet)->flow = NULL; + /* execute_actions() will reset tun_id to 0 anyhow. */ +#ifdef NEED_CSUM_NORMALIZE + OVS_CB(packet)->ip_summed = OVS_CSUM_NONE; +#endif + vlan_copy_skb_tci(packet); + rcu_read_lock(); dp = get_dp(odp_header->dp_ifindex); err = -ENODEV; -- 2.45.2