X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fflow.c;h=d899d260d6a29a8c580e61f334caa73b34e3c6a3;hb=2b13d312fc4d6e5eb1d0e3004fa523bb0c0ba544;hp=d38e3ab3574d0efcb1aeeb34ef143caa2f04703b;hpb=bcd2633a5be6d9b1dc4a42425f48d72423890573;p=sliver-openvswitch.git diff --git a/lib/flow.c b/lib/flow.c index d38e3ab35..d899d260d 100644 --- a/lib/flow.c +++ b/lib/flow.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira, Inc. + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -337,7 +337,7 @@ invalid: } /* Initializes 'flow' members from 'packet', 'skb_priority', 'tnl', and - * 'ofp_in_port'. + * 'in_port'. * * Initializes 'packet' header pointers as follows: * @@ -357,7 +357,7 @@ invalid: */ void flow_extract(struct ofpbuf *packet, uint32_t skb_priority, uint32_t skb_mark, - const struct flow_tnl *tnl, uint16_t ofp_in_port, + const struct flow_tnl *tnl, const union flow_in_port *in_port, struct flow *flow) { struct ofpbuf b = *packet; @@ -371,7 +371,9 @@ flow_extract(struct ofpbuf *packet, uint32_t skb_priority, uint32_t skb_mark, ovs_assert(tnl != &flow->tunnel); flow->tunnel = *tnl; } - flow->in_port = ofp_in_port; + if (in_port) { + flow->in_port = *in_port; + } flow->skb_priority = skb_priority; flow->skb_mark = skb_mark; @@ -498,7 +500,7 @@ flow_get_metadata(const struct flow *flow, struct flow_metadata *fmd) fmd->tun_dst = flow->tunnel.ip_dst; fmd->metadata = flow->metadata; memcpy(fmd->regs, flow->regs, sizeof fmd->regs); - fmd->in_port = flow->in_port; + fmd->in_port = flow->in_port.ofp_port; } char * @@ -779,7 +781,8 @@ flow_hash_symmetric_l4(const struct flow *flow, uint32_t basis) /* Masks the fields in 'wc' that are used by the flow hash 'fields'. */ void -flow_mask_hash_fields(struct flow_wildcards *wc, enum nx_hash_fields fields) +flow_mask_hash_fields(const struct flow *flow, struct flow_wildcards *wc, + enum nx_hash_fields fields) { switch (fields) { case NX_HASH_FIELDS_ETH_SRC: @@ -789,13 +792,19 @@ flow_mask_hash_fields(struct flow_wildcards *wc, enum nx_hash_fields fields) case NX_HASH_FIELDS_SYMMETRIC_L4: memset(&wc->masks.dl_src, 0xff, sizeof wc->masks.dl_src); memset(&wc->masks.dl_dst, 0xff, sizeof wc->masks.dl_dst); - memset(&wc->masks.dl_type, 0xff, sizeof wc->masks.dl_type); - memset(&wc->masks.vlan_tci, 0xff, sizeof wc->masks.vlan_tci); - memset(&wc->masks.nw_proto, 0xff, sizeof wc->masks.nw_proto); - memset(&wc->masks.nw_src, 0xff, sizeof wc->masks.nw_src); - memset(&wc->masks.nw_dst, 0xff, sizeof wc->masks.nw_dst); - memset(&wc->masks.tp_src, 0xff, sizeof wc->masks.tp_src); - memset(&wc->masks.tp_dst, 0xff, sizeof wc->masks.tp_dst); + if (flow->dl_type == htons(ETH_TYPE_IP)) { + memset(&wc->masks.nw_src, 0xff, sizeof wc->masks.nw_src); + memset(&wc->masks.nw_dst, 0xff, sizeof wc->masks.nw_dst); + } else if (flow->dl_type == htons(ETH_TYPE_IPV6)) { + memset(&wc->masks.ipv6_src, 0xff, sizeof wc->masks.ipv6_src); + memset(&wc->masks.ipv6_dst, 0xff, sizeof wc->masks.ipv6_dst); + } + if (is_ip_any(flow)) { + memset(&wc->masks.nw_proto, 0xff, sizeof wc->masks.nw_proto); + memset(&wc->masks.tp_src, 0xff, sizeof wc->masks.tp_src); + memset(&wc->masks.tp_dst, 0xff, sizeof wc->masks.tp_dst); + } + wc->masks.vlan_tci |= htons(VLAN_VID_MASK | VLAN_CFI); break; default: