[ovs-dev] [bondlib 18/19] bridge: Separate mirroring logic from forwarding logic.
Ethan Jackson
ethan at nicira.com
Wed Mar 30 17:56:42 UTC 2011
Looks Good.
On Fri, Mar 25, 2011 at 10:35 AM, Ben Pfaff <blp at nicira.com> wrote:
> In my opinion this is easier to understand than the way that these
> two logically separate steps were previously entangled.
> ---
> vswitchd/bridge.c | 41 ++++++++++++++++++++++++++++++-----------
> 1 files changed, 30 insertions(+), 11 deletions(-)
>
> diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c
> index 29d53a8..2a13822 100644
> --- a/vswitchd/bridge.c
> +++ b/vswitchd/bridge.c
> @@ -2219,14 +2219,7 @@ compose_dsts(const struct bridge *br, const struct flow *flow, uint16_t vlan,
> const struct port *in_port, const struct port *out_port,
> struct dst_set *set, tag_type *tags, uint16_t *nf_output_iface)
> {
> - mirror_mask_t mirrors = in_port->src_mirrors;
> struct dst dst;
> - int flow_vlan;
> -
> - flow_vlan = vlan_tci_to_vid(flow->vlan_tci);
> - if (flow_vlan == 0) {
> - flow_vlan = OFP_VLAN_NONE;
> - }
>
> if (out_port == FLOOD_PORT) {
> struct port *port;
> @@ -2237,7 +2230,6 @@ compose_dsts(const struct bridge *br, const struct flow *flow, uint16_t vlan,
> && port_includes_vlan(port, vlan)
> && !port->is_mirror_output_port
> && set_dst(&dst, flow, in_port, port, tags)) {
> - mirrors |= port->dst_mirrors;
> dst_set_add(set, &dst);
> }
> }
> @@ -2245,12 +2237,37 @@ compose_dsts(const struct bridge *br, const struct flow *flow, uint16_t vlan,
> } else if (out_port && set_dst(&dst, flow, in_port, out_port, tags)) {
> dst_set_add(set, &dst);
> *nf_output_iface = dst.iface->dp_ifidx;
> - mirrors |= out_port->dst_mirrors;
> + }
> +}
> +
> +static void
> +compose_mirror_dsts(const struct bridge *br, const struct flow *flow,
> + uint16_t vlan, const struct port *in_port,
> + struct dst_set *set, tag_type *tags)
> +{
> + mirror_mask_t mirrors;
> + int flow_vlan;
> + size_t i;
> +
> + mirrors = in_port->src_mirrors;
> + for (i = 0; i < set->n; i++) {
> + mirrors |= set->dsts[i].iface->port->dst_mirrors;
> + }
> +
> + if (!mirrors) {
> + return;
> + }
> +
> + flow_vlan = vlan_tci_to_vid(flow->vlan_tci);
> + if (flow_vlan == 0) {
> + flow_vlan = OFP_VLAN_NONE;
> }
>
> while (mirrors) {
> struct mirror *m = br->mirrors[mirror_mask_ffs(mirrors) - 1];
> if (!m->n_vlans || vlan_is_mirrored(m, vlan)) {
> + struct dst dst;
> +
> if (m->out_port) {
> if (set_dst(&dst, flow, in_port, m->out_port, tags)
> && !dst_is_duplicate(set, &dst)) {
> @@ -2287,8 +2304,6 @@ compose_dsts(const struct bridge *br, const struct flow *flow, uint16_t vlan,
> }
> mirrors &= mirrors - 1;
> }
> -
> - partition_dsts(set, flow_vlan);
> }
>
> static void
> @@ -2304,11 +2319,15 @@ compose_actions(struct bridge *br, const struct flow *flow, uint16_t vlan,
> dst_set_init(&set);
> compose_dsts(br, flow, vlan, in_port, out_port, &set, tags,
> nf_output_iface);
> + compose_mirror_dsts(br, flow, vlan, in_port, &set, tags);
>
> cur_vlan = vlan_tci_to_vid(flow->vlan_tci);
> if (cur_vlan == 0) {
> cur_vlan = OFP_VLAN_NONE;
> }
> +
> + partition_dsts(&set, cur_vlan);
> +
> for (i = 0; i < set.n; i++) {
> const struct dst *dst = &set.dsts[i];
> if (dst->vlan != cur_vlan) {
> --
> 1.7.1
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
>
More information about the dev
mailing list