Acked-by: Ethan Jackson <et...@nicira.com>

On Wed, Jun 12, 2013 at 2:23 PM, Ben Pfaff <b...@nicira.com> wrote:
> 'ctx->xin->flow' and 'ctx->xout->wc' are both pretty long.  Where it gets
> in the way of code readability, this patch replaces them by 'xin' and
> 'xout' using local variables.
>
> Also, replace an explicit comparison against IP and IPv6 Ethertypes by
> a call to is_ip_any().
>
> Co-authored-by: Jarno Rajahalme <jarno.rajaha...@nsn.com>.
> Signed-off-by: Ben Pfaff <b...@nicira.com>
> ---
>  ofproto/ofproto-dpif-xlate.c |  337 
> +++++++++++++++++++-----------------------
>  1 files changed, 155 insertions(+), 182 deletions(-)
>
> diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
> index 9682158..068716a 100644
> --- a/ofproto/ofproto-dpif-xlate.c
> +++ b/ofproto/ofproto-dpif-xlate.c
> @@ -370,6 +370,7 @@ static void
>  output_normal(struct xlate_ctx *ctx, const struct ofbundle *out_bundle,
>                uint16_t vlan)
>  {
> +    ovs_be16 *flow_tci = &ctx->xin->flow.vlan_tci;
>      struct ofport_dpif *port;
>      uint16_t vid;
>      ovs_be16 tci, old_tci;
> @@ -386,18 +387,18 @@ output_normal(struct xlate_ctx *ctx, const struct 
> ofbundle *out_bundle,
>          }
>      }
>
> -    old_tci = ctx->xin->flow.vlan_tci;
> +    old_tci = *flow_tci;
>      tci = htons(vid);
>      if (tci || out_bundle->use_priority_tags) {
> -        tci |= ctx->xin->flow.vlan_tci & htons(VLAN_PCP_MASK);
> +        tci |= *flow_tci & htons(VLAN_PCP_MASK);
>          if (tci) {
>              tci |= htons(VLAN_CFI);
>          }
>      }
> -    ctx->xin->flow.vlan_tci = tci;
> +    *flow_tci = tci;
>
>      compose_output_action(ctx, port->up.ofp_port);
> -    ctx->xin->flow.vlan_tci = old_tci;
> +    *flow_tci = old_tci;
>  }
>
>  /* A VM broadcasts a gratuitous ARP to indicate that it has resumed after
> @@ -530,6 +531,8 @@ is_admissible(struct xlate_ctx *ctx, struct ofport_dpif 
> *in_port,
>  static void
>  xlate_normal(struct xlate_ctx *ctx)
>  {
> +    struct flow_wildcards *wc = &ctx->xout->wc;
> +    struct flow *flow = &ctx->xin->flow;
>      struct ofport_dpif *in_port;
>      struct ofbundle *in_bundle;
>      struct mac_entry *mac;
> @@ -539,17 +542,13 @@ xlate_normal(struct xlate_ctx *ctx)
>      ctx->xout->has_normal = true;
>
>      /* Check the dl_type, since we may check for gratuituous ARP. */
> -    memset(&ctx->xout->wc.masks.dl_type, 0xff,
> -           sizeof ctx->xout->wc.masks.dl_type);
> +    memset(&wc->masks.dl_type, 0xff, sizeof wc->masks.dl_type);
>
> -    memset(&ctx->xout->wc.masks.dl_src, 0xff,
> -           sizeof ctx->xout->wc.masks.dl_src);
> -    memset(&ctx->xout->wc.masks.dl_dst, 0xff,
> -           sizeof ctx->xout->wc.masks.dl_dst);
> -    memset(&ctx->xout->wc.masks.vlan_tci, 0xff,
> -           sizeof ctx->xout->wc.masks.vlan_tci);
> +    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.vlan_tci, 0xff, sizeof wc->masks.vlan_tci);
>
> -    in_bundle = lookup_input_bundle(ctx->ofproto, ctx->xin->flow.in_port,
> +    in_bundle = lookup_input_bundle(ctx->ofproto, flow->in_port,
>                                      ctx->xin->packet != NULL, &in_port);
>      if (!in_bundle) {
>          xlate_report(ctx, "no input bundle, dropping");
> @@ -557,8 +556,8 @@ xlate_normal(struct xlate_ctx *ctx)
>      }
>
>      /* Drop malformed frames. */
> -    if (ctx->xin->flow.dl_type == htons(ETH_TYPE_VLAN) &&
> -        !(ctx->xin->flow.vlan_tci & htons(VLAN_CFI))) {
> +    if (flow->dl_type == htons(ETH_TYPE_VLAN) &&
> +        !(flow->vlan_tci & htons(VLAN_CFI))) {
>          if (ctx->xin->packet != NULL) {
>              static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5);
>              VLOG_WARN_RL(&rl, "bridge %s: dropping packet with partial "
> @@ -582,7 +581,7 @@ xlate_normal(struct xlate_ctx *ctx)
>      }
>
>      /* Check VLAN. */
> -    vid = vlan_tci_to_vid(ctx->xin->flow.vlan_tci);
> +    vid = vlan_tci_to_vid(flow->vlan_tci);
>      if (!input_vid_is_valid(vid, in_bundle, ctx->xin->packet != NULL)) {
>          xlate_report(ctx, "disallowed VLAN VID for this input port, 
> dropping");
>          return;
> @@ -596,12 +595,11 @@ xlate_normal(struct xlate_ctx *ctx)
>
>      /* Learn source MAC. */
>      if (ctx->xin->may_learn) {
> -        update_learning_table(ctx->ofproto, &ctx->xin->flow, &ctx->xout->wc,
> -                              vlan, in_bundle);
> +        update_learning_table(ctx->ofproto, flow, wc, vlan, in_bundle);
>      }
>
>      /* Determine output bundle. */
> -    mac = mac_learning_lookup(ctx->ofproto->ml, ctx->xin->flow.dl_dst, vlan,
> +    mac = mac_learning_lookup(ctx->ofproto->ml, flow->dl_dst, vlan,
>                                &ctx->xout->tags);
>      if (mac) {
>          if (mac->port.p != in_bundle) {
> @@ -794,6 +792,7 @@ compose_output_action__(struct xlate_ctx *ctx, uint16_t 
> ofp_port,
>                          bool check_stp)
>  {
>      const struct ofport_dpif *ofport = get_ofp_port(ctx->ofproto, ofp_port);
> +    struct flow *flow = &ctx->xin->flow;
>      ovs_be16 flow_vlan_tci;
>      uint32_t flow_skb_mark;
>      uint8_t flow_nw_tos;
> @@ -834,25 +833,25 @@ compose_output_action__(struct xlate_ctx *ctx, uint16_t 
> ofp_port,
>          }
>
>          ctx->ofproto = ofproto_dpif_cast(peer->up.ofproto);
> -        ctx->xin->flow.in_port = peer->up.ofp_port;
> -        ctx->xin->flow.metadata = htonll(0);
> -        memset(&ctx->xin->flow.tunnel, 0, sizeof ctx->xin->flow.tunnel);
> -        memset(ctx->xin->flow.regs, 0, sizeof ctx->xin->flow.regs);
> +        flow->in_port = peer->up.ofp_port;
> +        flow->metadata = htonll(0);
> +        memset(&flow->tunnel, 0, sizeof flow->tunnel);
> +        memset(flow->regs, 0, sizeof flow->regs);
>
> -        in_port = get_ofp_port(ctx->ofproto, ctx->xin->flow.in_port);
> +        in_port = get_ofp_port(ctx->ofproto, flow->in_port);
>          special = process_special(ctx->ofproto, &ctx->xin->flow, in_port,
>                                    ctx->xin->packet);
>          if (special) {
>              ctx->xout->slow = special;
>          } else if (!in_port || may_receive(in_port, ctx)) {
>              if (!in_port || stp_forward_in_state(in_port->stp_state)) {
> -                xlate_table_action(ctx, ctx->xin->flow.in_port, 0, true);
> +                xlate_table_action(ctx, flow->in_port, 0, true);
>              } else {
>                  /* Forwarding is disabled by STP.  Let OFPP_NORMAL and the
>                   * learning action look at the packet, then drop it. */
>                  struct flow old_base_flow = ctx->base_flow;
>                  size_t old_size = ctx->xout->odp_actions.size;
> -                xlate_table_action(ctx, ctx->xin->flow.in_port, 0, true);
> +                xlate_table_action(ctx, flow->in_port, 0, true);
>                  ctx->base_flow = old_base_flow;
>                  ctx->xout->odp_actions.size = old_size;
>              }
> @@ -869,14 +868,14 @@ compose_output_action__(struct xlate_ctx *ctx, uint16_t 
> ofp_port,
>          return;
>      }
>
> -    flow_vlan_tci = ctx->xin->flow.vlan_tci;
> -    flow_skb_mark = ctx->xin->flow.skb_mark;
> -    flow_nw_tos = ctx->xin->flow.nw_tos;
> +    flow_vlan_tci = flow->vlan_tci;
> +    flow_skb_mark = flow->skb_mark;
> +    flow_nw_tos = flow->nw_tos;
>
> -    pdscp = get_priority(ofport, ctx->xin->flow.skb_priority);
> +    pdscp = get_priority(ofport, flow->skb_priority);
>      if (pdscp) {
> -        ctx->xin->flow.nw_tos &= ~IP_DSCP_MASK;
> -        ctx->xin->flow.nw_tos |= pdscp->dscp;
> +        flow->nw_tos &= ~IP_DSCP_MASK;
> +        flow->nw_tos |= pdscp->dscp;
>      }
>
>      if (ofport->tnl_port) {
> @@ -884,13 +883,13 @@ compose_output_action__(struct xlate_ctx *ctx, uint16_t 
> ofp_port,
>            * the Logical (tunnel) Port are not visible for any further
>            * matches, while explicit set actions on tunnel metadata are.
>            */
> -        struct flow_tnl flow_tnl = ctx->xin->flow.tunnel;
> -        odp_port = tnl_port_send(ofport->tnl_port, &ctx->xin->flow);
> +        struct flow_tnl flow_tnl = flow->tunnel;
> +        odp_port = tnl_port_send(ofport->tnl_port, flow);
>          if (odp_port == OVSP_NONE) {
>              xlate_report(ctx, "Tunneling decided against output");
>              goto out; /* restore flow_nw_tos */
>          }
> -        if (ctx->xin->flow.tunnel.ip_dst == ctx->orig_tunnel_ip_dst) {
> +        if (flow->tunnel.ip_dst == ctx->orig_tunnel_ip_dst) {
>              xlate_report(ctx, "Not tunneling to our own address");
>              goto out; /* restore flow_nw_tos */
>          }
> @@ -898,24 +897,23 @@ compose_output_action__(struct xlate_ctx *ctx, uint16_t 
> ofp_port,
>              netdev_vport_inc_tx(ofport->up.netdev, ctx->xin->resubmit_stats);
>          }
>          out_port = odp_port;
> -        commit_odp_tunnel_action(&ctx->xin->flow, &ctx->base_flow,
> +        commit_odp_tunnel_action(flow, &ctx->base_flow,
>                                   &ctx->xout->odp_actions);
> -        ctx->xin->flow.tunnel = flow_tnl; /* Restore tunnel metadata */
> +        flow->tunnel = flow_tnl; /* Restore tunnel metadata */
>      } else {
>          uint16_t vlandev_port;
>          odp_port = ofport->odp_port;
>          vlandev_port = vsp_realdev_to_vlandev(ctx->ofproto, ofp_port,
> -                                              ctx->xin->flow.vlan_tci);
> +                                              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->xin->flow.vlan_tci = htons(0);
> +            flow->vlan_tci = htons(0);
>          }
> -        ctx->xin->flow.skb_mark &= ~IPSEC_MARK;
> +        flow->skb_mark &= ~IPSEC_MARK;
>      }
> -    commit_odp_actions(&ctx->xin->flow, &ctx->base_flow,
> -                       &ctx->xout->odp_actions);
> +    commit_odp_actions(flow, &ctx->base_flow, &ctx->xout->odp_actions);
>      nl_msg_put_u32(&ctx->xout->odp_actions, OVS_ACTION_ATTR_OUTPUT, 
> out_port);
>
>      ctx->sflow_odp_port = odp_port;
> @@ -923,10 +921,10 @@ compose_output_action__(struct xlate_ctx *ctx, uint16_t 
> ofp_port,
>      ctx->xout->nf_output_iface = ofp_port;
>
>      /* Restore flow */
> -    ctx->xin->flow.vlan_tci = flow_vlan_tci;
> -    ctx->xin->flow.skb_mark = flow_skb_mark;
> +    flow->vlan_tci = flow_vlan_tci;
> +    flow->skb_mark = flow_skb_mark;
>   out:
> -    ctx->xin->flow.nw_tos = flow_nw_tos;
> +    flow->nw_tos = flow_nw_tos;
>  }
>
>  static void
> @@ -1107,53 +1105,53 @@ execute_controller_action(struct xlate_ctx *ctx, int 
> len,
>  static void
>  execute_mpls_push_action(struct xlate_ctx *ctx, ovs_be16 eth_type)
>  {
> +    struct flow_wildcards *wc = &ctx->xout->wc;
> +    struct flow *flow = &ctx->xin->flow;
> +
>      ovs_assert(eth_type_mpls(eth_type));
>
> -    memset(&ctx->xout->wc.masks.dl_type, 0xff,
> -               sizeof ctx->xout->wc.masks.dl_type);
> -    memset(&ctx->xout->wc.masks.mpls_lse, 0xff,
> -               sizeof ctx->xout->wc.masks.mpls_lse);
> -    memset(&ctx->xout->wc.masks.mpls_depth, 0xff,
> -               sizeof ctx->xout->wc.masks.mpls_depth);
> +    memset(&wc->masks.dl_type, 0xff, sizeof wc->masks.dl_type);
> +    memset(&wc->masks.mpls_lse, 0xff, sizeof wc->masks.mpls_lse);
> +    memset(&wc->masks.mpls_depth, 0xff, sizeof wc->masks.mpls_depth);
>
> -    if (ctx->xin->flow.mpls_depth) {
> -        ctx->xin->flow.mpls_lse &= ~htonl(MPLS_BOS_MASK);
> -        ctx->xin->flow.mpls_depth++;
> +    if (flow->mpls_depth) {
> +        flow->mpls_lse &= ~htonl(MPLS_BOS_MASK);
> +        flow->mpls_depth++;
>      } else {
>          ovs_be32 label;
>          uint8_t tc, ttl;
>
> -        if (ctx->xin->flow.dl_type == htons(ETH_TYPE_IPV6)) {
> +        if (flow->dl_type == htons(ETH_TYPE_IPV6)) {
>              label = htonl(0x2); /* IPV6 Explicit Null. */
>          } else {
>              label = htonl(0x0); /* IPV4 Explicit Null. */
>          }
> -        tc = (ctx->xin->flow.nw_tos & IP_DSCP_MASK) >> 2;
> -        ttl = ctx->xin->flow.nw_ttl ? ctx->xin->flow.nw_ttl : 0x40;
> -        ctx->xin->flow.mpls_lse = set_mpls_lse_values(ttl, tc, 1, label);
> -        ctx->xin->flow.mpls_depth = 1;
> +        tc = (flow->nw_tos & IP_DSCP_MASK) >> 2;
> +        ttl = flow->nw_ttl ? flow->nw_ttl : 0x40;
> +        flow->mpls_lse = set_mpls_lse_values(ttl, tc, 1, label);
> +        flow->mpls_depth = 1;
>      }
> -    ctx->xin->flow.dl_type = eth_type;
> +    flow->dl_type = eth_type;
>  }
>
>  static void
>  execute_mpls_pop_action(struct xlate_ctx *ctx, ovs_be16 eth_type)
>  {
> +    struct flow_wildcards *wc = &ctx->xout->wc;
> +    struct flow *flow = &ctx->xin->flow;
> +
>      ovs_assert(eth_type_mpls(ctx->xin->flow.dl_type));
>      ovs_assert(!eth_type_mpls(eth_type));
>
> -    memset(&ctx->xout->wc.masks.dl_type, 0xff,
> -               sizeof ctx->xout->wc.masks.dl_type);
> -    memset(&ctx->xout->wc.masks.mpls_lse, 0xff,
> -               sizeof ctx->xout->wc.masks.mpls_lse);
> -    memset(&ctx->xout->wc.masks.mpls_depth, 0xff,
> -               sizeof ctx->xout->wc.masks.mpls_depth);
> -
> -    if (ctx->xin->flow.mpls_depth) {
> -        ctx->xin->flow.mpls_depth--;
> -        ctx->xin->flow.mpls_lse = htonl(0);
> -        if (!ctx->xin->flow.mpls_depth) {
> -            ctx->xin->flow.dl_type = eth_type;
> +    memset(&wc->masks.dl_type, 0xff, sizeof wc->masks.dl_type);
> +    memset(&wc->masks.mpls_lse, 0xff, sizeof wc->masks.mpls_lse);
> +    memset(&wc->masks.mpls_depth, 0xff, sizeof wc->masks.mpls_depth);
> +
> +    if (flow->mpls_depth) {
> +        flow->mpls_depth--;
> +        flow->mpls_lse = htonl(0);
> +        if (!flow->mpls_depth) {
> +            flow->dl_type = eth_type;
>          }
>      }
>  }
> @@ -1161,13 +1159,14 @@ execute_mpls_pop_action(struct xlate_ctx *ctx, 
> ovs_be16 eth_type)
>  static bool
>  compose_dec_ttl(struct xlate_ctx *ctx, struct ofpact_cnt_ids *ids)
>  {
> -    if (ctx->xin->flow.dl_type != htons(ETH_TYPE_IP) &&
> -        ctx->xin->flow.dl_type != htons(ETH_TYPE_IPV6)) {
> +    struct flow *flow = &ctx->xin->flow;
> +
> +    if (!is_ip_any(flow)) {
>          return false;
>      }
>
> -    if (ctx->xin->flow.nw_ttl > 1) {
> -        ctx->xin->flow.nw_ttl--;
> +    if (flow->nw_ttl > 1) {
> +        flow->nw_ttl--;
>          return false;
>      } else {
>          size_t i;
> @@ -1196,15 +1195,16 @@ execute_set_mpls_ttl_action(struct xlate_ctx *ctx, 
> uint8_t ttl)
>  static bool
>  execute_dec_mpls_ttl_action(struct xlate_ctx *ctx)
>  {
> -    uint8_t ttl = mpls_lse_to_ttl(ctx->xin->flow.mpls_lse);
> +    struct flow *flow = &ctx->xin->flow;
> +    uint8_t ttl = mpls_lse_to_ttl(flow->mpls_lse);
>
> -    if (!eth_type_mpls(ctx->xin->flow.dl_type)) {
> +    if (!eth_type_mpls(flow->dl_type)) {
>          return false;
>      }
>
>      if (ttl > 1) {
>          ttl--;
> -        set_mpls_lse_ttl(&ctx->xin->flow.mpls_lse, ttl);
> +        set_mpls_lse_ttl(&flow->mpls_lse, ttl);
>          return false;
>      } else {
>          execute_controller_action(ctx, UINT16_MAX, OFPR_INVALID_TTL, 0);
> @@ -1481,6 +1481,8 @@ static void
>  do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len,
>                   struct xlate_ctx *ctx)
>  {
> +    struct flow_wildcards *wc = &ctx->xout->wc;
> +    struct flow *flow = &ctx->xin->flow;
>      bool was_evictable = true;
>      const struct ofpact *a;
>
> @@ -1517,83 +1519,71 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t 
> ofpacts_len,
>              break;
>
>          case OFPACT_SET_VLAN_VID:
> -            ctx->xin->flow.vlan_tci &= ~htons(VLAN_VID_MASK);
> -            ctx->xin->flow.vlan_tci |=
> -                (htons(ofpact_get_SET_VLAN_VID(a)->vlan_vid)
> -                 | htons(VLAN_CFI));
> +            flow->vlan_tci &= ~htons(VLAN_VID_MASK);
> +            flow->vlan_tci |= (htons(ofpact_get_SET_VLAN_VID(a)->vlan_vid)
> +                               | htons(VLAN_CFI));
>              break;
>
>          case OFPACT_SET_VLAN_PCP:
> -            ctx->xin->flow.vlan_tci &= ~htons(VLAN_PCP_MASK);
> -            ctx->xin->flow.vlan_tci |=
> +            flow->vlan_tci &= ~htons(VLAN_PCP_MASK);
> +            flow->vlan_tci |=
>                  htons((ofpact_get_SET_VLAN_PCP(a)->vlan_pcp << 
> VLAN_PCP_SHIFT)
>                        | VLAN_CFI);
>              break;
>
>          case OFPACT_STRIP_VLAN:
> -            ctx->xin->flow.vlan_tci = htons(0);
> +            flow->vlan_tci = htons(0);
>              break;
>
>          case OFPACT_PUSH_VLAN:
>              /* XXX 802.1AD(QinQ) */
> -            ctx->xin->flow.vlan_tci = htons(VLAN_CFI);
> +            flow->vlan_tci = htons(VLAN_CFI);
>              break;
>
>          case OFPACT_SET_ETH_SRC:
> -            memcpy(ctx->xin->flow.dl_src, ofpact_get_SET_ETH_SRC(a)->mac,
> -                   ETH_ADDR_LEN);
> +            memcpy(flow->dl_src, ofpact_get_SET_ETH_SRC(a)->mac, 
> ETH_ADDR_LEN);
>              break;
>
>          case OFPACT_SET_ETH_DST:
> -            memcpy(ctx->xin->flow.dl_dst, ofpact_get_SET_ETH_DST(a)->mac,
> -                   ETH_ADDR_LEN);
> +            memcpy(flow->dl_dst, ofpact_get_SET_ETH_DST(a)->mac, 
> ETH_ADDR_LEN);
>              break;
>
>          case OFPACT_SET_IPV4_SRC:
> -            memset(&ctx->xout->wc.masks.dl_type, 0xff,
> -                   sizeof ctx->xout->wc.masks.dl_type);
> -            if (ctx->xin->flow.dl_type == htons(ETH_TYPE_IP)) {
> -                ctx->xin->flow.nw_src = ofpact_get_SET_IPV4_SRC(a)->ipv4;
> +            memset(&wc->masks.dl_type, 0xff, sizeof wc->masks.dl_type);
> +            if (flow->dl_type == htons(ETH_TYPE_IP)) {
> +                flow->nw_src = ofpact_get_SET_IPV4_SRC(a)->ipv4;
>              }
>              break;
>
>          case OFPACT_SET_IPV4_DST:
> -            memset(&ctx->xout->wc.masks.dl_type, 0xff,
> -                   sizeof ctx->xout->wc.masks.dl_type);
> -            if (ctx->xin->flow.dl_type == htons(ETH_TYPE_IP)) {
> -                ctx->xin->flow.nw_dst = ofpact_get_SET_IPV4_DST(a)->ipv4;
> +            memset(&wc->masks.dl_type, 0xff, sizeof wc->masks.dl_type);
> +            if (flow->dl_type == htons(ETH_TYPE_IP)) {
> +                flow->nw_dst = ofpact_get_SET_IPV4_DST(a)->ipv4;
>              }
>              break;
>
>          case OFPACT_SET_IPV4_DSCP:
>              /* OpenFlow 1.0 only supports IPv4. */
> -            memset(&ctx->xout->wc.masks.dl_type, 0xff,
> -                   sizeof ctx->xout->wc.masks.dl_type);
> -            if (ctx->xin->flow.dl_type == htons(ETH_TYPE_IP)) {
> -                ctx->xin->flow.nw_tos &= ~IP_DSCP_MASK;
> -                ctx->xin->flow.nw_tos |= ofpact_get_SET_IPV4_DSCP(a)->dscp;
> +            memset(&wc->masks.dl_type, 0xff, sizeof wc->masks.dl_type);
> +            if (flow->dl_type == htons(ETH_TYPE_IP)) {
> +                flow->nw_tos &= ~IP_DSCP_MASK;
> +                flow->nw_tos |= ofpact_get_SET_IPV4_DSCP(a)->dscp;
>              }
>              break;
>
>          case OFPACT_SET_L4_SRC_PORT:
> -            memset(&ctx->xout->wc.masks.dl_type, 0xff,
> -                   sizeof ctx->xout->wc.masks.dl_type);
> -            memset(&ctx->xout->wc.masks.nw_proto, 0xff,
> -                    sizeof ctx->xout->wc.masks.nw_proto);
> -            if (is_ip_any(&ctx->xin->flow)) {
> -                ctx->xin->flow.tp_src =
> -                    htons(ofpact_get_SET_L4_SRC_PORT(a)->port);
> +            memset(&wc->masks.dl_type, 0xff, sizeof wc->masks.dl_type);
> +            memset(&wc->masks.nw_proto, 0xff, sizeof wc->masks.nw_proto);
> +            if (is_ip_any(flow)) {
> +                flow->tp_src = htons(ofpact_get_SET_L4_SRC_PORT(a)->port);
>              }
>              break;
>
>          case OFPACT_SET_L4_DST_PORT:
> -            memset(&ctx->xout->wc.masks.dl_type, 0xff,
> -                   sizeof ctx->xout->wc.masks.dl_type);
> -            memset(&ctx->xout->wc.masks.nw_proto, 0xff,
> -                    sizeof ctx->xout->wc.masks.nw_proto);
> -            if (is_ip_any(&ctx->xin->flow)) {
> -                ctx->xin->flow.tp_dst =
> -                    htons(ofpact_get_SET_L4_DST_PORT(a)->port);
> +            memset(&wc->masks.dl_type, 0xff, sizeof wc->masks.dl_type);
> +            memset(&wc->masks.nw_proto, 0xff, sizeof wc->masks.nw_proto);
> +            if (is_ip_any(flow)) {
> +                flow->tp_dst = htons(ofpact_get_SET_L4_DST_PORT(a)->port);
>              }
>              break;
>
> @@ -1602,8 +1592,7 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t 
> ofpacts_len,
>              break;
>
>          case OFPACT_SET_TUNNEL:
> -            ctx->xin->flow.tunnel.tun_id =
> -                htonll(ofpact_get_SET_TUNNEL(a)->tun_id);
> +            flow->tunnel.tun_id = htonll(ofpact_get_SET_TUNNEL(a)->tun_id);
>              break;
>
>          case OFPACT_SET_QUEUE:
> @@ -1611,29 +1600,27 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t 
> ofpacts_len,
>              break;
>
>          case OFPACT_POP_QUEUE:
> -            memset(&ctx->xout->wc.masks.skb_priority, 0xff,
> -                   sizeof ctx->xout->wc.masks.skb_priority);
> +            memset(&wc->masks.skb_priority, 0xff,
> +                   sizeof wc->masks.skb_priority);
>
> -            ctx->xin->flow.skb_priority = ctx->orig_skb_priority;
> +            flow->skb_priority = ctx->orig_skb_priority;
>              break;
>
>          case OFPACT_REG_MOVE:
> -            nxm_execute_reg_move(ofpact_get_REG_MOVE(a), &ctx->xin->flow,
> -                                 &ctx->xout->wc);
> +            nxm_execute_reg_move(ofpact_get_REG_MOVE(a), flow, wc);
>              break;
>
>          case OFPACT_REG_LOAD:
> -            nxm_execute_reg_load(ofpact_get_REG_LOAD(a), &ctx->xin->flow);
> +            nxm_execute_reg_load(ofpact_get_REG_LOAD(a), flow);
>              break;
>
>          case OFPACT_STACK_PUSH:
> -            nxm_execute_stack_push(ofpact_get_STACK_PUSH(a), &ctx->xin->flow,
> -                                   &ctx->xout->wc, &ctx->stack);
> +            nxm_execute_stack_push(ofpact_get_STACK_PUSH(a), flow, wc,
> +                                   &ctx->stack);
>              break;
>
>          case OFPACT_STACK_POP:
> -            nxm_execute_stack_pop(ofpact_get_STACK_POP(a), &ctx->xin->flow,
> -                                  &ctx->stack);
> +            nxm_execute_stack_pop(ofpact_get_STACK_POP(a), flow, 
> &ctx->stack);
>              break;
>
>          case OFPACT_PUSH_MPLS:
> @@ -1658,8 +1645,7 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t 
> ofpacts_len,
>              break;
>
>          case OFPACT_DEC_TTL:
> -            memset(&ctx->xout->wc.masks.dl_type, 0xff,
> -                   sizeof ctx->xout->wc.masks.dl_type);
> +            memset(&wc->masks.dl_type, 0xff, sizeof wc->masks.dl_type);
>              if (compose_dec_ttl(ctx, ofpact_get_DEC_TTL(a))) {
>                  goto out;
>              }
> @@ -1670,8 +1656,7 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t 
> ofpacts_len,
>              break;
>
>          case OFPACT_MULTIPATH:
> -            multipath_execute(ofpact_get_MULTIPATH(a), &ctx->xin->flow,
> -                              &ctx->xout->wc);
> +            multipath_execute(ofpact_get_MULTIPATH(a), flow, wc);
>              break;
>
>          case OFPACT_BUNDLE:
> @@ -1692,10 +1677,8 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t 
> ofpacts_len,
>              break;
>
>          case OFPACT_FIN_TIMEOUT:
> -            memset(&ctx->xout->wc.masks.dl_type, 0xff,
> -                   sizeof ctx->xout->wc.masks.dl_type);
> -            memset(&ctx->xout->wc.masks.nw_proto, 0xff,
> -                   sizeof ctx->xout->wc.masks.nw_proto);
> +            memset(&wc->masks.dl_type, 0xff, sizeof wc->masks.dl_type);
> +            memset(&wc->masks.nw_proto, 0xff, sizeof wc->masks.nw_proto);
>              ctx->xout->has_fin_timeout = true;
>              xlate_fin_timeout(ctx, ofpact_get_FIN_TIMEOUT(a));
>              break;
> @@ -1710,8 +1693,8 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t 
> ofpacts_len,
>
>          case OFPACT_WRITE_METADATA:
>              metadata = ofpact_get_WRITE_METADATA(a);
> -            ctx->xin->flow.metadata &= ~metadata->mask;
> -            ctx->xin->flow.metadata |= metadata->metadata & metadata->mask;
> +            flow->metadata &= ~metadata->mask;
> +            flow->metadata |= metadata->metadata & metadata->mask;
>              break;
>
>          case OFPACT_GOTO_TABLE: {
> @@ -1724,8 +1707,8 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t 
> ofpacts_len,
>              ctx->table_id = ogt->table_id;
>
>              /* Look up a flow from the new table. */
> -            rule = rule_dpif_lookup_in_table(ctx->ofproto, &ctx->xin->flow,
> -                                             &ctx->xout->wc, ctx->table_id);
> +            rule = rule_dpif_lookup_in_table(ctx->ofproto, flow, wc,
> +                                             ctx->table_id);
>
>              tag_the_flow(ctx, rule);
>
> @@ -1833,6 +1816,9 @@ xlate_actions(struct xlate_in *xin, struct xlate_out 
> *xout)
>       * tracing purposes. */
>      static bool hit_resubmit_limit;
>
> +    struct flow_wildcards *wc = &xout->wc;
> +    struct flow *flow = &xin->flow;
> +
>      enum slow_path_reason special;
>      const struct ofpact *ofpacts;
>      struct ofport_dpif *in_port;
> @@ -1869,39 +1855,28 @@ xlate_actions(struct xlate_in *xin, struct xlate_out 
> *xout)
>      ctx.ofproto = xin->ofproto;
>      ctx.rule = xin->rule;
>
> -    ctx.base_flow = ctx.xin->flow;
> +    ctx.base_flow = *flow;
>      memset(&ctx.base_flow.tunnel, 0, sizeof ctx.base_flow.tunnel);
> -    ctx.orig_tunnel_ip_dst = ctx.xin->flow.tunnel.ip_dst;
> +    ctx.orig_tunnel_ip_dst = flow->tunnel.ip_dst;
>
> -    flow_wildcards_init_catchall(&ctx.xout->wc);
> -    memset(&ctx.xout->wc.masks.in_port, 0xff,
> -           sizeof ctx.xout->wc.masks.in_port);
> +    flow_wildcards_init_catchall(wc);
> +    memset(&wc->masks.in_port, 0xff, sizeof wc->masks.in_port);
>
>      if (tnl_port_should_receive(&ctx.xin->flow)) {
> -        memset(&ctx.xout->wc.masks.tunnel, 0xff,
> -               sizeof ctx.xout->wc.masks.tunnel);
> +        memset(&wc->masks.tunnel, 0xff, sizeof wc->masks.tunnel);
>      }
>
>      /* Disable most wildcarding for NetFlow. */
>      if (xin->ofproto->netflow) {
> -        memset(&ctx.xout->wc.masks.dl_src, 0xff,
> -               sizeof ctx.xout->wc.masks.dl_src);
> -        memset(&ctx.xout->wc.masks.dl_dst, 0xff,
> -               sizeof ctx.xout->wc.masks.dl_dst);
> -        memset(&ctx.xout->wc.masks.dl_type, 0xff,
> -               sizeof ctx.xout->wc.masks.dl_type);
> -        memset(&ctx.xout->wc.masks.vlan_tci, 0xff,
> -               sizeof ctx.xout->wc.masks.vlan_tci);
> -        memset(&ctx.xout->wc.masks.nw_proto, 0xff,
> -               sizeof ctx.xout->wc.masks.nw_proto);
> -        memset(&ctx.xout->wc.masks.nw_src, 0xff,
> -               sizeof ctx.xout->wc.masks.nw_src);
> -        memset(&ctx.xout->wc.masks.nw_dst, 0xff,
> -               sizeof ctx.xout->wc.masks.nw_dst);
> -        memset(&ctx.xout->wc.masks.tp_src, 0xff,
> -               sizeof ctx.xout->wc.masks.tp_src);
> -        memset(&ctx.xout->wc.masks.tp_dst, 0xff,
> -               sizeof ctx.xout->wc.masks.tp_dst);
> +        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);
>      }
>
>      ctx.xout->tags = 0;
> @@ -1918,7 +1893,7 @@ xlate_actions(struct xlate_in *xin, struct xlate_out 
> *xout)
>
>      ctx.recurse = 0;
>      ctx.max_resubmit_trigger = false;
> -    ctx.orig_skb_priority = ctx.xin->flow.skb_priority;
> +    ctx.orig_skb_priority = flow->skb_priority;
>      ctx.table_id = 0;
>      ctx.exit = false;
>
> @@ -1937,15 +1912,15 @@ xlate_actions(struct xlate_in *xin, struct xlate_out 
> *xout)
>      if (ctx.ofproto->has_mirrors || hit_resubmit_limit) {
>          /* Do this conditionally because the copy is expensive enough that it
>           * shows up in profiles. */
> -        orig_flow = ctx.xin->flow;
> +        orig_flow = *flow;
>      }
>
> -    if (ctx.xin->flow.nw_frag & FLOW_NW_FRAG_ANY) {
> +    if (flow->nw_frag & FLOW_NW_FRAG_ANY) {
>          switch (ctx.ofproto->up.frag_handling) {
>          case OFPC_FRAG_NORMAL:
>              /* We must pretend that transport ports are unavailable. */
> -            ctx.xin->flow.tp_src = ctx.base_flow.tp_src = htons(0);
> -            ctx.xin->flow.tp_dst = ctx.base_flow.tp_dst = htons(0);
> +            flow->tp_src = ctx.base_flow.tp_src = htons(0);
> +            flow->tp_dst = ctx.base_flow.tp_dst = htons(0);
>              break;
>
>          case OFPC_FRAG_DROP:
> @@ -1963,9 +1938,8 @@ xlate_actions(struct xlate_in *xin, struct xlate_out 
> *xout)
>          }
>      }
>
> -    in_port = get_ofp_port(ctx.ofproto, ctx.xin->flow.in_port);
> -    special = process_special(ctx.ofproto, &ctx.xin->flow, in_port,
> -                              ctx.xin->packet);
> +    in_port = get_ofp_port(ctx.ofproto, flow->in_port);
> +    special = process_special(ctx.ofproto, flow, in_port, ctx.xin->packet);
>      if (special) {
>          ctx.xout->slow = special;
>      } else {
> @@ -1973,9 +1947,9 @@ xlate_actions(struct xlate_in *xin, struct xlate_out 
> *xout)
>          size_t sample_actions_len;
>          uint32_t local_odp_port;
>
> -        if (ctx.xin->flow.in_port
> -            != vsp_realdev_to_vlandev(ctx.ofproto, ctx.xin->flow.in_port,
> -                                      ctx.xin->flow.vlan_tci)) {
> +        if (flow->in_port
> +            != vsp_realdev_to_vlandev(ctx.ofproto, flow->in_port,
> +                                      flow->vlan_tci)) {
>              ctx.base_flow.vlan_tci = 0;
>          }
>
> @@ -2009,7 +1983,7 @@ xlate_actions(struct xlate_in *xin, struct xlate_out 
> *xout)
>          }
>
>          local_odp_port = ofp_port_to_odp_port(ctx.ofproto, OFPP_LOCAL);
> -        if (!connmgr_must_output_local(ctx.ofproto->up.connmgr, 
> &ctx.xin->flow,
> +        if (!connmgr_must_output_local(ctx.ofproto->up.connmgr, flow,
>                                         local_odp_port,
>                                         ctx.xout->odp_actions.data,
>                                         ctx.xout->odp_actions.size)) {
> @@ -2025,7 +1999,6 @@ xlate_actions(struct xlate_in *xin, struct xlate_out 
> *xout)
>
>      /* Clear the metadata and register wildcard masks, because we won't
>       * use non-header fields as part of the cache. */
> -    memset(&ctx.xout->wc.masks.metadata, 0,
> -           sizeof ctx.xout->wc.masks.metadata);
> -    memset(&ctx.xout->wc.masks.regs, 0, sizeof ctx.xout->wc.masks.regs);
> +    memset(&wc->masks.metadata, 0, sizeof wc->masks.metadata);
> +    memset(&wc->masks.regs, 0, sizeof wc->masks.regs);
>  }
> --
> 1.7.2.5
>
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to