Skip to content

Commit

Permalink
bfd: Add configuration for setting and matching mac address.
Browse files Browse the repository at this point in the history
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 for transmitted
BFD packets.  The "bfd_remote_dst_mac" configure the matching
of MAC address on received BFD packets.

Signed-off-by: Alex Wang <alexw@nicira.com>
Acked-by: Ethan Jackson <ethan@nicira.com>
  • Loading branch information
yew011 committed Aug 14, 2014
1 parent 4e3b125 commit f07c2fb
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 18 deletions.
47 changes: 33 additions & 14 deletions lib/bfd.c
Expand Up @@ -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. */
Expand Down Expand Up @@ -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);
}

Expand Down Expand Up @@ -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");
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
}

Expand Down
23 changes: 19 additions & 4 deletions vswitchd/vswitch.xml
Expand Up @@ -2013,12 +2013,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">
Expand Down

0 comments on commit f07c2fb

Please sign in to comment.