[ovs-dev] [PATCH] bfd: Add bfd_src_ip and bfd_dst_ip.

Alex Wang alexw at nicira.com
Fri Jan 17 19:13:37 UTC 2014


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 at nicira.com>
---
 lib/bfd.c            |   40 ++++++++++++++++++++++++++++++++++++----
 vswitchd/vswitch.xml |   12 ++++++++++++
 2 files changed, 48 insertions(+), 4 deletions(-)

diff --git a/lib/bfd.c b/lib/bfd.c
index 347444f..2a545b0 100644
--- a/lib/bfd.c
+++ b/lib/bfd.c
@@ -172,6 +172,9 @@ struct bfd {
     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. */
@@ -217,6 +220,8 @@ static struct ovs_mutex mutex = OVS_MUTEX_INITIALIZER;
 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);
@@ -313,7 +318,8 @@ bfd_configure(struct bfd *bfd, const char *name, const struct smap *cfg,
     bool need_poll = false;
     bool cfg_min_rx_changed = false;
     bool cpath_down, forwarding_if_rx;
-    const char *hwaddr;
+    const char *hwaddr, *ip_src, *ip_dst;
+    struct in_addr in_addr;
     uint8_t ea[ETH_ADDR_LEN];
 
     if (ovsthread_once_start(&once)) {
@@ -347,6 +353,9 @@ bfd_configure(struct bfd *bfd, const char *name, const struct smap *cfg,
         bfd->in_decay = false;
         bfd->flap_count = 0;
 
+        bfd->ip_src = htonl(0xA9FE0100); /* 169.254.1.0. */
+        bfd->ip_dst = htonl(0xA9FE0101); /* 169.254.1.1. */
+
         /* RFC 5881 section 4
          * The source port MUST be in the range 49152 through 65535.  The same
          * UDP source port number MUST be used for all BFD Control packets
@@ -416,6 +425,20 @@ bfd_configure(struct bfd *bfd, const char *name, const struct smap *cfg,
         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;
@@ -563,9 +586,8 @@ bfd_put_packet(struct bfd *bfd, struct ofpbuf *p,
     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);
@@ -857,6 +879,16 @@ bfd_forwarding__(struct bfd *bfd) OVS_REQUIRES(mutex)
 
 /* Helpers. */
 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)
 {
     return (bfd->flags & FLAG_POLL) != 0;
diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml
index 5fd82fc..28d8eb5 100644
--- a/vswitchd/vswitch.xml
+++ b/vswitchd/vswitch.xml
@@ -2004,6 +2004,18 @@
 	  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, e.g. 192.168.0.123, 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, e.g. 192.168.0.123, 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">
-- 
1.7.9.5




More information about the dev mailing list