rtbsd: support RTM_IFANNOUNCE messages
authorThadeu Lima de Souza Cascardo <cascardo@redhat.com>
Fri, 31 Jul 2015 17:35:01 +0000 (14:35 -0300)
committerBen Pfaff <blp@nicira.com>
Sun, 2 Aug 2015 18:57:35 +0000 (11:57 -0700)
When devices are created, they are announced using RTM_IFANNOUNCE messages using
PF_ROUTE.

Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@redhat.com>
Signed-off-by: Ben Pfaff <blp@nicira.com>
lib/rtbsd.c

index 8fc88e4..33fb9fd 100644 (file)
@@ -124,8 +124,15 @@ rtbsd_notifier_run(void)
         if (retval >= 0) {
             /* received packet from PF_ROUTE socket
              * XXX check for bad packets */
-            if (msg.ifm_type == RTM_IFINFO) {
+            switch (msg.ifm_type) {
+            case RTM_IFINFO:
+            /* Since RTM_IFANNOUNCE messages are smaller than RTM_IFINFO
+             * messages, the same buffer may be used. */
+            case RTM_IFANNOUNCE:
                 rtbsd_report_change(&msg);
+                break;
+            default:
+                break;
             }
         } else if (errno == EAGAIN) {
             ovs_mutex_unlock(&rtbsd_mutex);
@@ -161,14 +168,25 @@ rtbsd_report_change(const struct if_msghdr *msg)
 {
     struct rtbsd_notifier *notifier;
     struct rtbsd_change change;
+    const struct if_announcemsghdr *ahdr;
 
     COVERAGE_INC(rtbsd_changed);
 
     change.msg_type = msg->ifm_type; //XXX
-    change.if_index = msg->ifm_index;
-    if_indextoname(msg->ifm_index, change.if_name);
     change.master_ifindex = 0; //XXX
 
+    switch (msg->ifm_type) {
+    case RTM_IFINFO:
+        change.if_index = msg->ifm_index;
+        if_indextoname(msg->ifm_index, change.if_name);
+        break;
+    case RTM_IFANNOUNCE:
+        ahdr = (const struct if_announcemsghdr *) msg;
+        change.if_index = ahdr->ifan_index;
+        strncpy(change.if_name, ahdr->ifan_name, IF_NAMESIZE);
+        break;
+    }
+
     LIST_FOR_EACH (notifier, node, &all_notifiers) {
         notifier->cb(&change, notifier->aux);
     }