From: Jesse Gross Date: Wed, 7 Nov 2012 15:57:22 +0000 (-0800) Subject: datapath: Move tun_key out of struct phy and union. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6694e498efc445ec24ef1715ae03ebb43daa678f;p=openvswitch datapath: Move tun_key out of struct phy and union. Tunneling metadata is important enough to move out of struct phy and handled on its own. This makes it somewhat easier to tell how well the other structures are packed and also the name shorter. This also drops the union since it's not needed quite yet. We can introduce it back when we have support for IPv6 tunneling. Signed-off-by: Jesse Gross Acked-by: Kyle Mestery --- diff --git a/datapath/flow.c b/datapath/flow.c index fdfe3e94..41c624e5 100644 --- a/datapath/flow.c +++ b/datapath/flow.c @@ -622,7 +622,7 @@ int ovs_flow_extract(struct sk_buff *skb, u16 in_port, struct sw_flow_key *key, key->phy.priority = skb->priority; if (OVS_CB(skb)->tun_key) - memcpy(&key->phy.tun.tun_key, OVS_CB(skb)->tun_key, sizeof(key->phy.tun.tun_key)); + memcpy(&key->tun_key, OVS_CB(skb)->tun_key, sizeof(key->tun_key)); key->phy.in_port = in_port; skb_reset_mac_header(skb); @@ -784,10 +784,10 @@ static u32 ovs_flow_hash(const struct sw_flow_key *key, int key_start, int key_l static int flow_key_start(struct sw_flow_key *key) { - if (key->phy.tun.tun_key.ipv4_dst) + if (key->tun_key.ipv4_dst) return 0; else - return offsetof(struct sw_flow_key, phy.priority); + return offsetof(struct sw_flow_key, phy); } struct sw_flow *ovs_flow_tbl_lookup(struct flow_table *table, @@ -1041,8 +1041,7 @@ int ovs_flow_from_nlattrs(struct sw_flow_key *swkey, int *key_lenp, if (tun_id != tun_key->tun_id) return -EINVAL; - memcpy(&swkey->phy.tun.tun_key, tun_key, - sizeof(swkey->phy.tun.tun_key)); + memcpy(&swkey->tun_key, tun_key, sizeof(swkey->tun_key)); attrs &= ~(1ULL << OVS_KEY_ATTR_TUN_ID); attrs &= ~(1ULL << OVS_KEY_ATTR_IPV4_TUNNEL); @@ -1053,8 +1052,7 @@ int ovs_flow_from_nlattrs(struct sw_flow_key *swkey, int *key_lenp, if (!tun_key->ipv4_dst) return -EINVAL; - memcpy(&swkey->phy.tun.tun_key, tun_key, - sizeof(swkey->phy.tun.tun_key)); + memcpy(&swkey->tun_key, tun_key, sizeof(swkey->tun_key)); attrs &= ~(1ULL << OVS_KEY_ATTR_IPV4_TUNNEL); } @@ -1198,14 +1196,14 @@ int ovs_flow_from_nlattrs(struct sw_flow_key *swkey, int *key_lenp, int ovs_flow_metadata_from_nlattrs(struct sw_flow *flow, int key_len, const struct nlattr *attr) { - struct ovs_key_ipv4_tunnel *tun_key = &flow->key.phy.tun.tun_key; + struct ovs_key_ipv4_tunnel *tun_key = &flow->key.tun_key; const struct nlattr *nla; int rem; __be64 tun_id = 0; flow->key.phy.in_port = DP_MAX_PORTS; flow->key.phy.priority = 0; - memset(tun_key, 0, sizeof(flow->key.phy.tun.tun_key)); + memset(tun_key, 0, sizeof(flow->key.tun_key)); nla_for_each_nested(nla, attr, rem) { int type = nla_type(nla); @@ -1277,16 +1275,16 @@ int ovs_flow_to_nlattrs(const struct sw_flow_key *swkey, struct sk_buff *skb) nla_put_u32(skb, OVS_KEY_ATTR_PRIORITY, swkey->phy.priority)) goto nla_put_failure; - if (swkey->phy.tun.tun_key.ipv4_dst) { + if (swkey->tun_key.ipv4_dst) { struct ovs_key_ipv4_tunnel *tun_key; nla = nla_reserve(skb, OVS_KEY_ATTR_IPV4_TUNNEL, sizeof(*tun_key)); if (!nla) goto nla_put_failure; tun_key = nla_data(nla); - memcpy(tun_key, &swkey->phy.tun.tun_key, sizeof(*tun_key)); + memcpy(tun_key, &swkey->tun_key, sizeof(*tun_key)); } - if ((swkey->phy.tun.tun_key.tun_flags & OVS_TNL_F_KEY) && - nla_put_be64(skb, OVS_KEY_ATTR_TUN_ID, swkey->phy.tun.tun_key.tun_id)) + if ((swkey->tun_key.tun_flags & OVS_TNL_F_KEY) && + nla_put_be64(skb, OVS_KEY_ATTR_TUN_ID, swkey->tun_key.tun_id)) goto nla_put_failure; if (swkey->phy.in_port != DP_MAX_PORTS && diff --git a/datapath/flow.h b/datapath/flow.h index 8bc6db6f..54f0fcdc 100644 --- a/datapath/flow.h +++ b/datapath/flow.h @@ -41,10 +41,8 @@ struct sw_flow_actions { }; struct sw_flow_key { + struct ovs_key_ipv4_tunnel tun_key; /* Encapsulating tunnel key. */ struct { - union { - struct ovs_key_ipv4_tunnel tun_key; /* Encapsulating tunnel key. */ - } tun; u32 priority; /* Packet QoS priority. */ u16 in_port; /* Input switch port (or DP_MAX_PORTS). */ } phy;