-/* Copyright (c) 2013, 2014 Nicira, Inc.
+/* Copyright (c) 2013, 2014, 2015, 2016 Nicira, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
uint32_t rmt_disc; /* bfd.RemoteDiscr. */
- uint8_t local_eth_src[ETH_ADDR_LEN]; /* Local eth src address. */
- uint8_t local_eth_dst[ETH_ADDR_LEN]; /* Local eth dst address. */
+ struct eth_addr local_eth_src; /* Local eth src address. */
+ struct eth_addr local_eth_dst; /* Local eth dst address. */
- uint8_t rmt_eth_dst[ETH_ADDR_LEN]; /* Remote eth dst address. */
+ struct eth_addr rmt_eth_dst; /* Remote eth dst address. */
ovs_be32 ip_src; /* IPv4 source address. */
ovs_be32 ip_dst; /* IPv4 destination address. */
smap_add(smap, "state", bfd_state_str(bfd->state));
smap_add(smap, "diagnostic", bfd_diag_str(bfd->diag));
smap_add_format(smap, "flap_count", "%"PRIu64, bfd->flap_count);
-
- if (bfd->state != STATE_DOWN) {
- smap_add(smap, "remote_state", bfd_state_str(bfd->rmt_state));
- smap_add(smap, "remote_diagnostic", bfd_diag_str(bfd->rmt_diag));
- }
+ smap_add(smap, "remote_state", bfd_state_str(bfd->rmt_state));
+ smap_add(smap, "remote_diagnostic", bfd_diag_str(bfd->rmt_diag));
ovs_mutex_unlock(&mutex);
}
+void
+bfd_init(void)
+{
+ unixctl_command_register("bfd/show", "[interface]", 0, 1,
+ bfd_unixctl_show, NULL);
+ unixctl_command_register("bfd/set-forwarding",
+ "[interface] normal|false|true", 1, 2,
+ bfd_unixctl_set_forwarding_override, NULL);
+}
+
/* Initializes, destroys, or reconfigures the BFD session 'bfd' (named 'name'),
* according to the database configuration contained in 'cfg'. Takes ownership
* of 'bfd', which may be NULL. Returns a BFD object which may be used as a
bfd_configure(struct bfd *bfd, const char *name, const struct smap *cfg,
struct netdev *netdev) OVS_EXCLUDED(mutex)
{
- static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER;
static atomic_count udp_src = ATOMIC_COUNT_INIT(0);
int decay_min_rx;
bool cpath_down, forwarding_if_rx;
const char *hwaddr, *ip_src, *ip_dst;
struct in_addr in_addr;
- uint8_t ea[ETH_ADDR_LEN];
-
- if (ovsthread_once_start(&once)) {
- unixctl_command_register("bfd/show", "[interface]", 0, 1,
- bfd_unixctl_show, NULL);
- unixctl_command_register("bfd/set-forwarding",
- "[interface] normal|false|true", 1, 2,
- bfd_unixctl_set_forwarding_override, NULL);
- ovsthread_once_done(&once);
- }
+ struct eth_addr ea;
if (!cfg || !smap_get_bool(cfg, "enable", false)) {
bfd_unref(bfd);
}
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);
+ if (hwaddr && eth_addr_from_string(hwaddr, &ea)) {
+ bfd->local_eth_src = ea;
} else {
- memset(bfd->local_eth_src, 0, ETH_ADDR_LEN);
+ bfd->local_eth_src = eth_addr_zero;
}
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);
+ if (hwaddr && eth_addr_from_string(hwaddr, &ea)) {
+ bfd->local_eth_dst = ea;
} else {
- memset(bfd->local_eth_dst, 0, ETH_ADDR_LEN);
+ bfd->local_eth_dst = eth_addr_zero;
}
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);
+ if (hwaddr && eth_addr_from_string(hwaddr, &ea)) {
+ bfd->rmt_eth_dst = ea;
} else {
- memset(bfd->rmt_eth_dst, 0, ETH_ADDR_LEN);
+ bfd->rmt_eth_dst = eth_addr_zero;
}
ip_src = smap_get(cfg, "bfd_src_ip");
void
bfd_put_packet(struct bfd *bfd, struct dp_packet *p,
- uint8_t eth_src[ETH_ADDR_LEN]) OVS_EXCLUDED(mutex)
+ const struct eth_addr eth_src) OVS_EXCLUDED(mutex)
{
long long int min_tx, min_rx;
struct udp_header *udp;
dp_packet_reserve(p, 2); /* Properly align after the ethernet header. */
eth = dp_packet_put_uninit(p, sizeof *eth);
- 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_src = eth_addr_is_zero(bfd->local_eth_src)
+ ? eth_src : bfd->local_eth_src;
+ eth->eth_dst = eth_addr_is_zero(bfd->local_eth_dst)
+ ? eth_addr_bfd : bfd->local_eth_dst;
eth->eth_type = htons(ETH_TYPE_IP);
ip = dp_packet_put_zeros(p, sizeof *ip);
if (!eth_addr_is_zero(bfd->rmt_eth_dst)) {
memset(&wc->masks.dl_dst, 0xff, sizeof wc->masks.dl_dst);
- if (memcmp(bfd->rmt_eth_dst, flow->dl_dst, ETH_ADDR_LEN)) {
+ if (!eth_addr_equals(bfd->rmt_eth_dst, flow->dl_dst)) {
return false;
}
}
static bool
bfd_lookup_ip(const char *host_name, struct in_addr *addr)
{
- if (!inet_pton(AF_INET, host_name, addr)) {
+ if (!ip_parse(host_name, &addr->s_addr)) {
VLOG_ERR_RL(&rl, "\"%s\" is not a valid IP address", host_name);
return false;
}
{
struct ds ds = DS_EMPTY_INITIALIZER;
- if (vlog_should_drop(THIS_MODULE, level, &rl)) {
+ if (vlog_should_drop(&this_module, level, &rl)) {
return;
}