The patch makes sense,

could we add some testing to make sure this is happening and ensure that we
don't hit regressions later?

On Wed, Sep 20, 2017 at 5:12 PM, Guoshuai Li <[email protected]> wrote:

> When sending a localnet port with vlan, the GARP packet needs push_vlan.
> ---
>
> v2:
>    Add check vlan vaid.
>    Add update localnet vlan tag process.
>
> ---
>  ovn/controller/pinctrl.c | 16 +++++++++++++---
>  1 file changed, 13 insertions(+), 3 deletions(-)
>
> diff --git a/ovn/controller/pinctrl.c b/ovn/controller/pinctrl.c
> index 469a35586..eb9276833 100644
> --- a/ovn/controller/pinctrl.c
> +++ b/ovn/controller/pinctrl.c
> @@ -1264,6 +1264,7 @@ struct garp_data {
>      long long int announce_time; /* Next announcement in ms. */
>      int backoff;                 /* Backoff for the next announcement. */
>      ofp_port_t ofport;           /* ofport used to output this GARP. */
> +    int64_t tag;                 /* vlan tag of this GARP packet. */
>  };
>
>  /* Contains GARPs to be sent. */
> @@ -1286,7 +1287,7 @@ destroy_send_garps(void)
>  }
>
>  static void
> -add_garp(const char *name, ofp_port_t ofport,
> +add_garp(const char *name, ofp_port_t ofport, int64_t tag,
>           const struct eth_addr ea, ovs_be32 ip)
>  {
>      struct garp_data *garp = xmalloc(sizeof *garp);
> @@ -1295,6 +1296,7 @@ add_garp(const char *name, ofp_port_t ofport,
>      garp->announce_time = time_msec() + 1000;
>      garp->backoff = 1;
>      garp->ofport = ofport;
> +    garp->tag = tag;
>      shash_add(&send_garp_data, name, garp);
>  }
>
> @@ -1313,6 +1315,8 @@ send_garp_update(const struct sbrec_port_binding
> *binding_rec,
>      }
>      ofp_port_t ofport = u16_to_ofp(simap_get(localnet_ofports,
>                                               ld->localnet_port->logical_
> port));
> +    int64_t tag = ld->localnet_port->n_tag ?
> +                      *(ld->localnet_port->tag) : 0xFFFF;
>
>      volatile struct garp_data *garp = NULL;
>      /* Update GARP for NAT IP if it exists.  Consider port bindings with
> type
> @@ -1331,8 +1335,9 @@ send_garp_update(const struct sbrec_port_binding
> *binding_rec,
>                  garp = shash_find_data(&send_garp_data, name);
>                  if (garp) {
>                      garp->ofport = ofport;
> +                    garp->tag = tag;
>                  } else {
> -                    add_garp(name, ofport, laddrs->ea,
> +                    add_garp(name, ofport, tag, laddrs->ea,
>                               laddrs->ipv4_addrs[i].addr);
>                  }
>                  free(name);
> @@ -1359,7 +1364,7 @@ send_garp_update(const struct sbrec_port_binding
> *binding_rec,
>              continue;
>          }
>
> -        add_garp(binding_rec->logical_port, ofport,
> +        add_garp(binding_rec->logical_port, ofport, tag,
>                   laddrs.ea, laddrs.ipv4_addrs[0].addr);
>
>          destroy_lport_addresses(&laddrs);
> @@ -1389,6 +1394,11 @@ send_garp(struct garp_data *garp, long long int
> current_time)
>      compose_arp(&packet, ARP_OP_REQUEST, garp->ea, eth_addr_zero,
>                  true, garp->ipv4, garp->ipv4);
>
> +    /* Compose a GARP request packet's vlan if exist. */
> +    if (garp->tag >= 0 && garp->tag <= 4095) {
> +        eth_push_vlan(&packet, htons(ETH_TYPE_VLAN), htons(garp->tag));
> +    }
> +
>      /* Compose actions.  The garp request is output on localnet ofport. */
>      uint64_t ofpacts_stub[4096 / 8];
>      struct ofpbuf ofpacts = OFPBUF_STUB_INITIALIZER(ofpacts_stub);
> --
> 2.13.2.windows.1
>
> _______________________________________________
> dev mailing list
> [email protected]
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to