aboutsummaryrefslogtreecommitdiff
path: root/ofproto
diff options
context:
space:
mode:
authorAlex Wang <alexw@nicira.com>2013-06-05 12:34:01 -0700
committerBen Pfaff <blp@nicira.com>2013-06-05 12:35:21 -0700
commit29d532d8b8d6475d370351572a2acd8e0e180edd (patch)
tree1afa012c804bfab76f6b2536bd4e06695583f7e5 /ofproto
parentef7a55a497d2737f06df18ceeecd171c25bcd06a (diff)
ofproto-dpif.c: Modify vsp_realdev_to_vlandev() function
Commit 52a90c29 (Implement new "VLAN splinters" feature) passed in OpenFlow port number to vsp_realdev_to_vlandev() function which asks for datapath port number. This patch fixes this bug by making the vsp_realdev_to_vlandev() function take in and return OpenFlow port number. Signed-off-by: Alex Wang <alexw@nicira.com> Signed-off-by: Ben Pfaff <blp@nicira.com>
Diffstat (limited to 'ofproto')
-rw-r--r--ofproto/ofproto-dpif.c47
1 files changed, 27 insertions, 20 deletions
diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
index bf8a601b..8c8487aa 100644
--- a/ofproto/ofproto-dpif.c
+++ b/ofproto/ofproto-dpif.c
@@ -570,8 +570,9 @@ struct vlan_splinter {
int vid;
};
-static uint32_t vsp_realdev_to_vlandev(const struct ofproto_dpif *,
- uint32_t realdev, ovs_be16 vlan_tci);
+static uint16_t vsp_realdev_to_vlandev(const struct ofproto_dpif *,
+ uint16_t realdev_ofp_port,
+ ovs_be16 vlan_tci);
static bool vsp_adjust_flow(const struct ofproto_dpif *, struct flow *);
static void vsp_remove(struct ofport_dpif *);
static void vsp_add(struct ofport_dpif *, uint16_t realdev_ofp_port, int vid);
@@ -5752,9 +5753,13 @@ send_packet(const struct ofport_dpif *ofport, struct ofpbuf *packet)
odp_put_tunnel_action(&flow.tunnel, &odp_actions);
odp_put_skb_mark_action(flow.skb_mark, &odp_actions);
} else {
- odp_port = vsp_realdev_to_vlandev(ofproto, ofport->odp_port,
- flow.vlan_tci);
- if (odp_port != ofport->odp_port) {
+ uint16_t vlandev_port;
+ vlandev_port = vsp_realdev_to_vlandev(ofproto, ofport->up.ofp_port,
+ flow.vlan_tci);
+ if (vlandev_port == ofport->up.ofp_port) {
+ odp_port = ofport->odp_port;
+ } else {
+ odp_port = ofp_port_to_odp_port(ofproto, vlandev_port);
eth_pop_vlan(packet);
flow.vlan_tci = htons(0);
}
@@ -6035,9 +6040,13 @@ compose_output_action__(struct action_xlate_ctx *ctx, uint16_t ofp_port,
commit_odp_tunnel_action(&ctx->flow, &ctx->base_flow,
ctx->odp_actions);
} else {
- out_port = vsp_realdev_to_vlandev(ctx->ofproto, odp_port,
- ctx->flow.vlan_tci);
- if (out_port != odp_port) {
+ uint16_t vlandev_port;
+ vlandev_port = vsp_realdev_to_vlandev(ctx->ofproto, ofp_port,
+ ctx->flow.vlan_tci);
+ if (vlandev_port == ofp_port) {
+ out_port = odp_port;
+ } else {
+ out_port = ofp_port_to_odp_port(ctx->ofproto, vlandev_port);
ctx->flow.vlan_tci = htons(0);
}
ctx->flow.skb_mark &= ~IPSEC_MARK;
@@ -8434,33 +8443,31 @@ hash_realdev_vid(uint16_t realdev_ofp_port, int vid)
return hash_2words(realdev_ofp_port, vid);
}
-/* Returns the ODP port number of the Linux VLAN device that corresponds to
- * 'vlan_tci' on the network device with port number 'realdev_odp_port' in
- * 'ofproto'. For example, given 'realdev_odp_port' of eth0 and 'vlan_tci' 9,
- * it would return the port number of eth0.9.
+/* Returns the OFP port number of the Linux VLAN device that corresponds to
+ * 'vlan_tci' on the network device with port number 'realdev_ofp_port' in
+ * 'struct ofport_dpif'. For example, given 'realdev_ofp_port' of eth0 and
+ * 'vlan_tci' 9, it would return the port number of eth0.9.
*
- * Unless VLAN splinters are enabled for port 'realdev_odp_port', this
- * function just returns its 'realdev_odp_port' argument. */
-static uint32_t
+ * Unless VLAN splinters are enabled for port 'realdev_ofp_port', this
+ * function just returns its 'realdev_ofp_port' argument. */
+static uint16_t
vsp_realdev_to_vlandev(const struct ofproto_dpif *ofproto,
- uint32_t realdev_odp_port, ovs_be16 vlan_tci)
+ uint16_t realdev_ofp_port, ovs_be16 vlan_tci)
{
if (!hmap_is_empty(&ofproto->realdev_vid_map)) {
- uint16_t realdev_ofp_port;
int vid = vlan_tci_to_vid(vlan_tci);
const struct vlan_splinter *vsp;
- realdev_ofp_port = odp_port_to_ofp_port(ofproto, realdev_odp_port);
HMAP_FOR_EACH_WITH_HASH (vsp, realdev_vid_node,
hash_realdev_vid(realdev_ofp_port, vid),
&ofproto->realdev_vid_map) {
if (vsp->realdev_ofp_port == realdev_ofp_port
&& vsp->vid == vid) {
- return ofp_port_to_odp_port(ofproto, vsp->vlandev_ofp_port);
+ return vsp->vlandev_ofp_port;
}
}
}
- return realdev_odp_port;
+ return realdev_ofp_port;
}
static struct vlan_splinter *