diff options
Diffstat (limited to 'net/openvswitch/datapath.c')
| -rw-r--r-- | net/openvswitch/datapath.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c index 2c74daa5aca5..d8277d29e710 100644 --- a/net/openvswitch/datapath.c +++ b/net/openvswitch/datapath.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (c) 2007-2012 Nicira Networks. | 2 | * Copyright (c) 2007-2012 Nicira, Inc. |
| 3 | * | 3 | * |
| 4 | * This program is free software; you can redistribute it and/or | 4 | * This program is free software; you can redistribute it and/or |
| 5 | * modify it under the terms of version 2 of the GNU General Public | 5 | * modify it under the terms of version 2 of the GNU General Public |
| @@ -263,14 +263,15 @@ err: | |||
| 263 | static int queue_gso_packets(int dp_ifindex, struct sk_buff *skb, | 263 | static int queue_gso_packets(int dp_ifindex, struct sk_buff *skb, |
| 264 | const struct dp_upcall_info *upcall_info) | 264 | const struct dp_upcall_info *upcall_info) |
| 265 | { | 265 | { |
| 266 | unsigned short gso_type = skb_shinfo(skb)->gso_type; | ||
| 266 | struct dp_upcall_info later_info; | 267 | struct dp_upcall_info later_info; |
| 267 | struct sw_flow_key later_key; | 268 | struct sw_flow_key later_key; |
| 268 | struct sk_buff *segs, *nskb; | 269 | struct sk_buff *segs, *nskb; |
| 269 | int err; | 270 | int err; |
| 270 | 271 | ||
| 271 | segs = skb_gso_segment(skb, NETIF_F_SG | NETIF_F_HW_CSUM); | 272 | segs = skb_gso_segment(skb, NETIF_F_SG | NETIF_F_HW_CSUM); |
| 272 | if (IS_ERR(skb)) | 273 | if (IS_ERR(segs)) |
| 273 | return PTR_ERR(skb); | 274 | return PTR_ERR(segs); |
| 274 | 275 | ||
| 275 | /* Queue all of the segments. */ | 276 | /* Queue all of the segments. */ |
| 276 | skb = segs; | 277 | skb = segs; |
| @@ -279,7 +280,7 @@ static int queue_gso_packets(int dp_ifindex, struct sk_buff *skb, | |||
| 279 | if (err) | 280 | if (err) |
| 280 | break; | 281 | break; |
| 281 | 282 | ||
| 282 | if (skb == segs && skb_shinfo(skb)->gso_type & SKB_GSO_UDP) { | 283 | if (skb == segs && gso_type & SKB_GSO_UDP) { |
| 283 | /* The initial flow key extracted by ovs_flow_extract() | 284 | /* The initial flow key extracted by ovs_flow_extract() |
| 284 | * in this case is for a first fragment, so we need to | 285 | * in this case is for a first fragment, so we need to |
| 285 | * properly mark later fragments. | 286 | * properly mark later fragments. |
| @@ -1649,7 +1650,9 @@ static int ovs_vport_cmd_set(struct sk_buff *skb, struct genl_info *info) | |||
| 1649 | 1650 | ||
| 1650 | if (!err && a[OVS_VPORT_ATTR_OPTIONS]) | 1651 | if (!err && a[OVS_VPORT_ATTR_OPTIONS]) |
| 1651 | err = ovs_vport_set_options(vport, a[OVS_VPORT_ATTR_OPTIONS]); | 1652 | err = ovs_vport_set_options(vport, a[OVS_VPORT_ATTR_OPTIONS]); |
| 1652 | if (!err && a[OVS_VPORT_ATTR_UPCALL_PID]) | 1653 | if (err) |
| 1654 | goto exit_unlock; | ||
| 1655 | if (a[OVS_VPORT_ATTR_UPCALL_PID]) | ||
| 1653 | vport->upcall_pid = nla_get_u32(a[OVS_VPORT_ATTR_UPCALL_PID]); | 1656 | vport->upcall_pid = nla_get_u32(a[OVS_VPORT_ATTR_UPCALL_PID]); |
| 1654 | 1657 | ||
| 1655 | reply = ovs_vport_cmd_build_info(vport, info->snd_pid, info->snd_seq, | 1658 | reply = ovs_vport_cmd_build_info(vport, info->snd_pid, info->snd_seq, |
