From: Ethan Jackson <ethan@nicira.com>
Date: Fri, 14 Jan 2011 00:40:42 +0000 (-0800)
Subject: route-table: Process route messages more selectively.
X-Git-Tag: v1.1.0~487
X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=db2dede403921e8935b53a07c9e908c05edd4c85;p=sliver-openvswitch.git

route-table: Process route messages more selectively.

This commit cleans up the routing table by preventing it from
processing messages which are not relevant for our purposes.
---

diff --git a/lib/route-table.c b/lib/route-table.c
index dd215f75f..440db8fd4 100644
--- a/lib/route-table.c
+++ b/lib/route-table.c
@@ -46,6 +46,7 @@ struct route_data {
 /* A digested version of a route message sent down by the kernel to indicate
  * that a route has changed. */
 struct route_table_msg {
+    bool relevant;        /* Should this message be processed? */
     int nlmsg_type;       /* e.g. RTM_NEWROUTE, RTM_DELROUTE. */
     struct route_data rd; /* Data parsed from this message. */
 };
@@ -232,6 +233,16 @@ route_table_parse(struct ofpbuf *buf, struct route_table_msg *change)
         }
 
         memset(change, 0, sizeof *change);
+        change->relevant = true;
+
+        if (rtm->rtm_scope == RT_SCOPE_NOWHERE) {
+            change->relevant = false;
+        }
+
+        if (rtm->rtm_type != RTN_UNICAST &&
+            rtm->rtm_type != RTN_LOCAL) {
+            change->relevant = false;
+        }
 
         change->nlmsg_type     = nlmsg->nlmsg_type;
         change->rd.rtm_dst_len = rtm->rtm_dst_len;
@@ -254,6 +265,8 @@ route_table_change(const struct route_table_msg *change, void *aux OVS_UNUSED)
     if (!change) {
         VLOG_DBG_RL(&rl, "received NULL change message");
         route_table_reset();
+    } else if (!change->relevant) {
+        VLOG_DBG_RL(&rl, "ignoring irrelevant change message");
     } else if (change->nlmsg_type == RTM_NEWROUTE) {
         if (!route_node_lookup(&change->rd)) {
             struct route_node *rn;