route-table: Process route messages more selectively.
authorEthan Jackson <ethan@nicira.com>
Fri, 14 Jan 2011 00:40:42 +0000 (16:40 -0800)
committerEthan Jackson <ethan@nicira.com>
Fri, 14 Jan 2011 19:20:46 +0000 (11:20 -0800)
This commit cleans up the routing table by preventing it from
processing messages which are not relevant for our purposes.

lib/route-table.c

index dd215f7..440db8f 100644 (file)
@@ -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;