Thanks for the refactor that makes code much cleaner.

Reviewed-by: Yifeng Sun <pkusunyif...@gmail.com>


On Thu, Jan 18, 2018 at 2:45 PM, Ben Pfaff <b...@ovn.org> wrote:

> Each of the cases in flow_compose_l4() separately tracked the number of
> bytes of L4 data added to the packet.  This commit makes the function do
> that in a single place without per-protocol bookkeeping.
>
> Signed-off-by: Ben Pfaff <b...@ovn.org>
> ---
>  lib/flow.c | 40 ++++++++++------------------------------
>  1 file changed, 10 insertions(+), 30 deletions(-)
>
> diff --git a/lib/flow.c b/lib/flow.c
> index f9d7c2a74007..04a73fd4ed5a 100644
> --- a/lib/flow.c
> +++ b/lib/flow.c
> @@ -2695,53 +2695,35 @@ flow_set_mpls_lse(struct flow *flow, int idx,
> ovs_be32 lse)
>  static size_t
>  flow_compose_l4(struct dp_packet *p, const struct flow *flow)
>  {
> -    size_t l4_len = 0;
> +    size_t orig_len = dp_packet_size(p);
>
>      if (!(flow->nw_frag & FLOW_NW_FRAG_ANY)
>          || !(flow->nw_frag & FLOW_NW_FRAG_LATER)) {
>          if (flow->nw_proto == IPPROTO_TCP) {
> -            struct tcp_header *tcp;
> -
> -            l4_len = sizeof *tcp;
> -            tcp = dp_packet_put_zeros(p, l4_len);
> +            struct tcp_header *tcp = dp_packet_put_zeros(p, sizeof *tcp);
>              tcp->tcp_src = flow->tp_src;
>              tcp->tcp_dst = flow->tp_dst;
>              tcp->tcp_ctl = TCP_CTL(ntohs(flow->tcp_flags), 5);
>          } else if (flow->nw_proto == IPPROTO_UDP) {
> -            struct udp_header *udp;
> -
> -            l4_len = sizeof *udp;
> -            udp = dp_packet_put_zeros(p, l4_len);
> +            struct udp_header *udp = dp_packet_put_zeros(p, sizeof *udp);
>              udp->udp_src = flow->tp_src;
>              udp->udp_dst = flow->tp_dst;
> -            udp->udp_len = htons(l4_len);
> +            udp->udp_len = htons(sizeof *udp);
>          } else if (flow->nw_proto == IPPROTO_SCTP) {
> -            struct sctp_header *sctp;
> -
> -            l4_len = sizeof *sctp;
> -            sctp = dp_packet_put_zeros(p, l4_len);
> +            struct sctp_header *sctp = dp_packet_put_zeros(p, sizeof
> *sctp);
>              sctp->sctp_src = flow->tp_src;
>              sctp->sctp_dst = flow->tp_dst;
>          } else if (flow->nw_proto == IPPROTO_ICMP) {
> -            struct icmp_header *icmp;
> -
> -            l4_len = sizeof *icmp;
> -            icmp = dp_packet_put_zeros(p, l4_len);
> +            struct icmp_header *icmp = dp_packet_put_zeros(p, sizeof
> *icmp);
>              icmp->icmp_type = ntohs(flow->tp_src);
>              icmp->icmp_code = ntohs(flow->tp_dst);
>          } else if (flow->nw_proto == IPPROTO_IGMP) {
> -            struct igmp_header *igmp;
> -
> -            l4_len = sizeof *igmp;
> -            igmp = dp_packet_put_zeros(p, l4_len);
> +            struct igmp_header *igmp = dp_packet_put_zeros(p, sizeof
> *igmp);
>              igmp->igmp_type = ntohs(flow->tp_src);
>              igmp->igmp_code = ntohs(flow->tp_dst);
>              put_16aligned_be32(&igmp->group, flow->igmp_group_ip4);
>          } else if (flow->nw_proto == IPPROTO_ICMPV6) {
> -            struct icmp6_hdr *icmp;
> -
> -            l4_len = sizeof *icmp;
> -            icmp = dp_packet_put_zeros(p, l4_len);
> +            struct icmp6_hdr *icmp = dp_packet_put_zeros(p, sizeof *icmp);
>              icmp->icmp6_type = ntohs(flow->tp_src);
>              icmp->icmp6_code = ntohs(flow->tp_dst);
>
> @@ -2751,19 +2733,16 @@ flow_compose_l4(struct dp_packet *p, const struct
> flow *flow)
>                  struct in6_addr *nd_target;
>                  struct ovs_nd_lla_opt *lla_opt;
>
> -                l4_len += sizeof *nd_target;
>                  nd_target = dp_packet_put_zeros(p, sizeof *nd_target);
>                  *nd_target = flow->nd_target;
>
>                  if (!eth_addr_is_zero(flow->arp_sha)) {
> -                    l4_len += 8;
>                      lla_opt = dp_packet_put_zeros(p, 8);
>                      lla_opt->len = 1;
>                      lla_opt->type = ND_OPT_SOURCE_LINKADDR;
>                      lla_opt->mac = flow->arp_sha;
>                  }
>                  if (!eth_addr_is_zero(flow->arp_tha)) {
> -                    l4_len += 8;
>                      lla_opt = dp_packet_put_zeros(p, 8);
>                      lla_opt->len = 1;
>                      lla_opt->type = ND_OPT_TARGET_LINKADDR;
> @@ -2772,7 +2751,8 @@ flow_compose_l4(struct dp_packet *p, const struct
> flow *flow)
>              }
>          }
>      }
> -    return l4_len;
> +
> +    return dp_packet_size(p) - orig_len;
>  }
>
>  static void
> --
> 2.10.2
>
> _______________________________________________
> dev mailing list
> d...@openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to