[ovs-dev] [PATCH 25/26] route-table: Add route_table_get_mtu()

Simon Horman horms at verge.net.au
Sun Jun 3 23:26:10 UTC 2012


This is to be used by an implementation of MSS clamping which
requires access to the mtu of interfaces.

Cc: Jesse Gross <jesse at nicira.com>
Cc: Kyle Mestery <kmestery at cisco.com>
Signed-off-by: Simon Horman <horms at verge.net.au>

---

* v5
Initial posting
---
 lib/route-table.c | 53 ++++++++++++++++++++++++++++++++++++++++++-----------
 lib/route-table.h |  1 +
 2 files changed, 43 insertions(+), 11 deletions(-)

diff --git a/lib/route-table.c b/lib/route-table.c
index 63a09f2..cde9ee4 100644
--- a/lib/route-table.c
+++ b/lib/route-table.c
@@ -62,6 +62,7 @@ struct name_node {
     uint32_t ifi_index;    /* Kernel interface index. */
 
     char ifname[IFNAMSIZ]; /* Interface name. */
+    int mtu;               /* Current MTU */
 };
 
 static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 20);
@@ -92,6 +93,7 @@ static int name_table_reset(void);
 static void name_table_change(const struct rtnetlink_link_change *, void *);
 static void name_map_clear(void);
 static struct name_node *name_node_lookup(int ifi_index);
+static struct name_node *name_node_lookup_by_ip(ovs_be32 ip);
 
 /* Populates 'name' with the name of the interface traffic destined for 'ip'
  * is likely to egress out of (see route_table_get_ifindex).
@@ -100,23 +102,30 @@ static struct name_node *name_node_lookup(int ifi_index);
 bool
 route_table_get_name(ovs_be32 ip, char name[IFNAMSIZ])
 {
-    int ifindex;
+    struct name_node *nn = name_node_lookup_by_ip(ip);
 
-    if (!name_table_valid) {
-        name_table_reset();
+    if (!nn) {
+        ovs_strlcpy(name, nn->ifname, IFNAMSIZ);
+        return true;
     }
 
-    if (route_table_get_ifindex(ip, &ifindex)) {
-        struct name_node *nn;
+    return false;
+}
 
-        nn = name_node_lookup(ifindex);
-        if (nn) {
-            ovs_strlcpy(name, nn->ifname, IFNAMSIZ);
-            return true;
-        }
+/* Returns the MTU of the interface traffic destined for 'ip'
+ * is likely to egress out of (see route_table_get_ifindex).
+ *
+ * Returns a the MTU if successful, otherwise 0. */
+int
+route_table_get_mtu(ovs_be32 ip)
+{
+    struct name_node *nn = name_node_lookup_by_ip(ip);
+
+    if (nn && nn->mtu > 0) {
+        return nn->mtu;
     }
 
-    return false;
+    return 0;
 }
 
 /* Populates 'ifindex' with the interface index traffic destined for 'ip' is
@@ -450,6 +459,7 @@ name_table_reset(void)
 
             nn = xzalloc(sizeof *nn);
             nn->ifi_index = change.ifi_index;
+            nn->mtu = change.mtu;
             ovs_strlcpy(nn->ifname, change.ifname, IFNAMSIZ);
             hmap_insert(&name_map, &nn->node, hash_int(nn->ifi_index, 0));
         }
@@ -482,6 +492,27 @@ name_node_lookup(int ifi_index)
     return NULL;
 }
 
+static struct name_node *
+name_node_lookup_by_ip(ovs_be32 ip)
+{
+    int ifindex;
+
+    if (!name_table_valid) {
+        name_table_reset();
+    }
+
+    if (route_table_get_ifindex(ip, &ifindex)) {
+        struct name_node *nn;
+
+        nn = name_node_lookup(ifindex);
+        if (nn) {
+            return nn;
+        }
+    }
+
+    return NULL;
+}
+
 static void
 name_map_clear(void)
 {
diff --git a/lib/route-table.h b/lib/route-table.h
index 1479249..264c199 100644
--- a/lib/route-table.h
+++ b/lib/route-table.h
@@ -25,6 +25,7 @@
 
 bool route_table_get_ifindex(ovs_be32 ip, int *ifindex);
 bool route_table_get_name(ovs_be32 ip, char name[IFNAMSIZ]);
+int route_table_get_mtu(ovs_be32 ip);
 void route_table_register(void);
 void route_table_unregister(void);
 void route_table_run(void);
-- 
1.7.10.2.484.gcd07cc5




More information about the dev mailing list