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. */
bfd_set_state(bfd, STATE_DOWN, DIAG_NONE);
- memcpy(bfd->eth_dst, eth_addr_bfd, ETH_ADDR_LEN);
-
bfd_status_changed(bfd);
}
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");
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);
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;
}
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">