This commit adds two new options, bfd_src_ip and bfd_dst_ip
respectively, which allows user to configure the source and
destination IP address of bfd control packet. If the user
specified address cannot be parsed, the default address
will be used.
Signed-off-by: Alex Wang <alexw@nicira.com>
Acked-by: Ethan Jackson <ethan@nicira.com>
uint8_t eth_dst[ETH_ADDR_LEN];/* Ethernet destination address. */
bool eth_dst_set; /* 'eth_dst' set through database. */
uint8_t eth_dst[ETH_ADDR_LEN];/* Ethernet destination address. */
bool eth_dst_set; /* 'eth_dst' set through database. */
+ ovs_be32 ip_src; /* IPv4 source address. */
+ ovs_be32 ip_dst; /* IPv4 destination address. */
+
uint16_t udp_src; /* UDP source port. */
/* All timers in milliseconds. */
uint16_t udp_src; /* UDP source port. */
/* All timers in milliseconds. */
static struct hmap all_bfds__ = HMAP_INITIALIZER(&all_bfds__);
static struct hmap *const all_bfds OVS_GUARDED_BY(mutex) = &all_bfds__;
static struct hmap all_bfds__ = HMAP_INITIALIZER(&all_bfds__);
static struct hmap *const all_bfds OVS_GUARDED_BY(mutex) = &all_bfds__;
+static bool bfd_lookup_ip(const char *host_name, struct in_addr *)
+ OVS_REQUIRES(mutex);
static bool bfd_forwarding__(struct bfd *) OVS_REQUIRES(mutex);
static bool bfd_in_poll(const struct bfd *) OVS_REQUIRES(mutex);
static void bfd_poll(struct bfd *bfd) OVS_REQUIRES(mutex);
static bool bfd_forwarding__(struct bfd *) OVS_REQUIRES(mutex);
static bool bfd_in_poll(const struct bfd *) OVS_REQUIRES(mutex);
static void bfd_poll(struct bfd *bfd) OVS_REQUIRES(mutex);
bool need_poll = false;
bool cfg_min_rx_changed = false;
bool cpath_down, forwarding_if_rx;
bool need_poll = false;
bool cfg_min_rx_changed = false;
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)) {
uint8_t ea[ETH_ADDR_LEN];
if (ovsthread_once_start(&once)) {
bfd->eth_dst_set = false;
}
bfd->eth_dst_set = false;
}
+ ip_src = smap_get(cfg, "bfd_src_ip");
+ if (ip_src && bfd_lookup_ip(ip_src, &in_addr)) {
+ memcpy(&bfd->ip_src, &in_addr, sizeof in_addr);
+ } else {
+ bfd->ip_src = htonl(0xA9FE0100); /* 169.254.1.0. */
+ }
+
+ ip_dst = smap_get(cfg, "bfd_dst_ip");
+ if (ip_dst && bfd_lookup_ip(ip_dst, &in_addr)) {
+ memcpy(&bfd->ip_dst, &in_addr, sizeof in_addr);
+ } else {
+ bfd->ip_dst = htonl(0xA9FE0101); /* 169.254.1.1. */
+ }
+
forwarding_if_rx = smap_get_bool(cfg, "forwarding_if_rx", false);
if (bfd->forwarding_if_rx != forwarding_if_rx) {
bfd->forwarding_if_rx = forwarding_if_rx;
forwarding_if_rx = smap_get_bool(cfg, "forwarding_if_rx", false);
if (bfd->forwarding_if_rx != forwarding_if_rx) {
bfd->forwarding_if_rx = forwarding_if_rx;
ip->ip_ttl = MAXTTL;
ip->ip_tos = IPTOS_LOWDELAY | IPTOS_THROUGHPUT;
ip->ip_proto = IPPROTO_UDP;
ip->ip_ttl = MAXTTL;
ip->ip_tos = IPTOS_LOWDELAY | IPTOS_THROUGHPUT;
ip->ip_proto = IPPROTO_UDP;
- /* Use link local addresses: */
- put_16aligned_be32(&ip->ip_src, htonl(0xA9FE0100)); /* 169.254.1.0. */
- put_16aligned_be32(&ip->ip_dst, htonl(0xA9FE0101)); /* 169.254.1.1. */
+ put_16aligned_be32(&ip->ip_src, bfd->ip_src);
+ put_16aligned_be32(&ip->ip_dst, bfd->ip_dst);
ip->ip_csum = csum(ip, sizeof *ip);
udp = ofpbuf_put_zeros(p, sizeof *udp);
ip->ip_csum = csum(ip, sizeof *ip);
udp = ofpbuf_put_zeros(p, sizeof *udp);
+static bool
+bfd_lookup_ip(const char *host_name, struct in_addr *addr)
+{
+ if (!inet_aton(host_name, addr)) {
+ VLOG_ERR_RL(&rl, "\"%s\" is not a valid IP address", host_name);
+ return false;
+ }
+ return true;
+}
+
static bool
bfd_in_poll(const struct bfd *bfd) OVS_REQUIRES(mutex)
{
static bool
bfd_in_poll(const struct bfd *bfd) OVS_REQUIRES(mutex)
{
expected as destination for received BFD packets. The default is
<code>00:23:20:00:00:01</code>.
</column>
expected as destination for received BFD packets. The default is
<code>00:23:20:00:00:01</code>.
</column>
+
+ <column name="bfd" key="bfd_src_ip">
+ Set to an IPv4 address to set the IP address used as source for
+ transmitted BFD packets. The default is <code>169.254.1.0</code>.
+ </column>
+
+ <column name="bfd" key="bfd_dst_ip">
+ Set to an IPv4 address to set the IP address used as destination
+ for transmitted BFD packets. The default is <code>169.254.1.1</code>.
+ </column>
</group>
<group title="BFD Status">
</group>
<group title="BFD Status">