Acked-by: Ethan Jackson <et...@nicira.com>
On Mon, Aug 11, 2014 at 6:34 PM, Alex Wang <al...@nicira.com> wrote: > This commit adds options for configuring the MAC addresses > in BFD state machine. Therein, the "bfd_local_src_mac" and > "bfd_local_dst_mac" configure the MAC address of sent BFD > packets. The "bfd_remote_dst_mac" configure the matching > of MAC address on recevied BFD packets. > > Signed-off-by: Alex Wang <al...@nicira.com> > > --- > PATCH -> V2: > - simplify the code. > --- > lib/bfd.c | 47 +++++++++++++++++++++++++++++++++-------------- > vswitchd/vswitch.xml | 23 +++++++++++++++++++---- > 2 files changed, 52 insertions(+), 18 deletions(-) > > diff --git a/lib/bfd.c b/lib/bfd.c > index 9069582..5c86451 100644 > --- a/lib/bfd.c > +++ b/lib/bfd.c > @@ -169,8 +169,10 @@ struct bfd { > > uint32_t rmt_disc; /* bfd.RemoteDiscr. */ > > - uint8_t eth_dst[ETH_ADDR_LEN];/* Ethernet destination address. */ > - bool eth_dst_set; /* 'eth_dst' set through database. */ > + uint8_t local_eth_src[ETH_ADDR_LEN]; /* Local eth src address. */ > + uint8_t local_eth_dst[ETH_ADDR_LEN]; /* Local eth dst address. */ > + > + uint8_t rmt_eth_dst[ETH_ADDR_LEN]; /* Remote eth dst address. */ > > ovs_be32 ip_src; /* IPv4 source address. */ > ovs_be32 ip_dst; /* IPv4 destination address. */ > @@ -388,8 +390,6 @@ bfd_configure(struct bfd *bfd, const char *name, const > struct smap *cfg, > > bfd_set_state(bfd, STATE_DOWN, DIAG_NONE); > > - memcpy(bfd->eth_dst, eth_addr_bfd, ETH_ADDR_LEN); > - > bfd_status_changed(bfd); > } > > @@ -440,13 +440,25 @@ bfd_configure(struct bfd *bfd, const char *name, const > struct smap *cfg, > need_poll = true; > } > > - hwaddr = smap_get(cfg, "bfd_dst_mac"); > - if (hwaddr && eth_addr_from_string(hwaddr, ea) && !eth_addr_is_zero(ea)) > { > - memcpy(bfd->eth_dst, ea, ETH_ADDR_LEN); > - bfd->eth_dst_set = true; > - } else if (bfd->eth_dst_set) { > - memcpy(bfd->eth_dst, eth_addr_bfd, ETH_ADDR_LEN); > - bfd->eth_dst_set = false; > + hwaddr = smap_get(cfg, "bfd_local_src_mac"); > + if (hwaddr && eth_addr_from_string(hwaddr, ea)) { > + memcpy(bfd->local_eth_src, ea, ETH_ADDR_LEN); > + } else { > + memset(bfd->local_eth_src, 0, ETH_ADDR_LEN); > + } > + > + hwaddr = smap_get(cfg, "bfd_local_dst_mac"); > + if (hwaddr && eth_addr_from_string(hwaddr, ea)) { > + memcpy(bfd->local_eth_dst, ea, ETH_ADDR_LEN); > + } else { > + memset(bfd->local_eth_dst, 0, ETH_ADDR_LEN); > + } > + > + hwaddr = smap_get(cfg, "bfd_remote_dst_mac"); > + if (hwaddr && eth_addr_from_string(hwaddr, ea)) { > + memcpy(bfd->rmt_eth_dst, ea, ETH_ADDR_LEN); > + } else { > + memset(bfd->rmt_eth_dst, 0, ETH_ADDR_LEN); > } > > ip_src = smap_get(cfg, "bfd_src_ip"); > @@ -600,8 +612,14 @@ bfd_put_packet(struct bfd *bfd, struct ofpbuf *p, > > ofpbuf_reserve(p, 2); /* Properly align after the ethernet header. */ > eth = ofpbuf_put_uninit(p, sizeof *eth); > - memcpy(eth->eth_src, eth_src, ETH_ADDR_LEN); > - memcpy(eth->eth_dst, bfd->eth_dst, ETH_ADDR_LEN); > + memcpy(eth->eth_src, > + eth_addr_is_zero(bfd->local_eth_src) ? eth_src > + : bfd->local_eth_src, > + ETH_ADDR_LEN); > + memcpy(eth->eth_dst, > + eth_addr_is_zero(bfd->local_eth_dst) ? eth_addr_bfd > + : bfd->local_eth_dst, > + ETH_ADDR_LEN); > eth->eth_type = htons(ETH_TYPE_IP); > > ip = ofpbuf_put_zeros(p, sizeof *ip); > @@ -657,7 +675,8 @@ bfd_should_process_flow(const struct bfd *bfd_, const > struct flow *flow, > bool check_tnl_key; > > memset(&wc->masks.dl_dst, 0xff, sizeof wc->masks.dl_dst); > - if (bfd->eth_dst_set && memcmp(bfd->eth_dst, flow->dl_dst, > ETH_ADDR_LEN)) { > + if (!eth_addr_is_zero(bfd->rmt_eth_dst) > + && memcmp(bfd->rmt_eth_dst, flow->dl_dst, ETH_ADDR_LEN)) { > return false; > } > > diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml > index bff8fb6..ff9be17 100644 > --- a/vswitchd/vswitch.xml > +++ b/vswitchd/vswitch.xml > @@ -2081,12 +2081,27 @@ > tunnel key. > </column> > > - <column name="bfd" key="bfd_dst_mac"> > + <column name="bfd" key="bfd_local_src_mac"> > Set to an Ethernet address in the form > > <var>xx</var>:<var>xx</var>:<var>xx</var>:<var>xx</var>:<var>xx</var>:<var>xx</var> > - to set the MAC used as destination for transmitted BFD packets and > - expected as destination for received BFD packets. The default is > - <code>00:23:20:00:00:01</code>. > + to set the MAC used as source for transmitted BFD packets. The > + default is the mac address of the BFD enabled interface. > + </column> > + > + <column name="bfd" key="bfd_local_dst_mac"> > + Set to an Ethernet address in the form > + > <var>xx</var>:<var>xx</var>:<var>xx</var>:<var>xx</var>:<var>xx</var>:<var>xx</var> > + to set the MAC used as destination for transmitted BFD packets. The > + default is <code>00:23:20:00:00:01</code>. > + </column> > + > + <column name="bfd" key="bfd_remoe_dst_mac"> > + Set to an Ethernet address in the form > + > <var>xx</var>:<var>xx</var>:<var>xx</var>:<var>xx</var>:<var>xx</var>:<var>xx</var> > + to set the MAC used for checking the destination of received BFD > packets. > + Packets with different destination MAC will not be considered as > BFD packets. > + If not specified the destination MAC address of received BFD packets > + are not checked. > </column> > > <column name="bfd" key="bfd_src_ip"> > -- > 1.7.9.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