brcompat: Mark ovs-brcompat as deprecated.
[sliver-openvswitch.git] / vswitchd / ovs-brcompatd.c
index 41aabe4..f98d3f5 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008, 2009, 2010, 2011 Nicira Networks
+/* Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -76,7 +76,7 @@ static char *appctl_program;
 static char *vsctl_program;
 
 /* Options that we should generally pass to ovs-vsctl. */
-#define VSCTL_OPTIONS "--timeout=5", "-vANY:console:WARN"
+#define VSCTL_OPTIONS "--timeout=5", "-vconsole:warn"
 
 /* Netlink socket to bridge compatibility kernel module. */
 static struct nl_sock *brc_sock;
@@ -280,25 +280,25 @@ parse_command(struct ofpbuf *buffer, uint32_t *seq, const char **br_name,
     return 0;
 }
 
-/* Composes and returns a reply to a request made by the datapath with Netlink
- * sequence number 'seq' and error code 'error'.  The caller may add additional
- * attributes to the message, then it may send it with send_reply(). */
+/* Composes and returns a reply to a request made by the datapath with error
+ * code 'error'.  The caller may add additional attributes to the message, then
+ * it may send it with send_reply(). */
 static struct ofpbuf *
-compose_reply(uint32_t seq, int error)
+compose_reply(int error)
 {
     struct ofpbuf *reply = ofpbuf_new(4096);
     nl_msg_put_genlmsghdr(reply, 32, brc_family, NLM_F_REQUEST,
                           BRC_GENL_C_DP_RESULT, 1);
-    ((struct nlmsghdr *) reply->data)->nlmsg_seq = seq;
     nl_msg_put_u32(reply, BRC_GENL_A_ERR_CODE, error);
     return reply;
 }
 
-/* Sends 'reply' to the datapath and frees it. */
+/* Sends 'reply' to the datapath, using sequence number 'nlmsg_seq', and frees
+ * it. */
 static void
-send_reply(struct ofpbuf *reply)
+send_reply(struct ofpbuf *reply, uint32_t nlmsg_seq)
 {
-    int retval = nl_sock_send(brc_sock, reply, false);
+    int retval = nl_sock_send_seq(brc_sock, reply, nlmsg_seq, false);
     if (retval) {
         VLOG_WARN_RL(&rl, "replying to brcompat request: %s",
                      strerror(retval));
@@ -311,7 +311,7 @@ send_reply(struct ofpbuf *reply)
 static void
 send_simple_reply(uint32_t seq, int error)
 {
-    send_reply(compose_reply(seq, error));
+    send_reply(compose_reply(error), seq);
 }
 
 static int
@@ -456,7 +456,7 @@ handle_fdb_query_cmd(struct ofpbuf *buffer)
     uint32_t seq;
     int error;
 
-    /* Parse the command received from brcompat_mod. */
+    /* Parse the command received from brcompat. */
     error = parse_command(buffer, &seq, &linux_name, NULL, &count, &skip);
     if (error) {
         return error;
@@ -555,10 +555,10 @@ handle_fdb_query_cmd(struct ofpbuf *buffer)
     free(output);
 
     /* Compose and send reply to datapath. */
-    reply = compose_reply(seq, 0);
+    reply = compose_reply(0);
     nl_msg_put_unspec(reply, BRC_GENL_A_FDB_DATA,
                       query_data.data, query_data.size);
-    send_reply(reply);
+    send_reply(reply, seq);
 
     /* Free memory. */
     ofpbuf_uninit(&query_data);
@@ -594,10 +594,10 @@ send_ifindex_reply(uint32_t seq, char *output)
     }
 
     /* Compose and send reply. */
-    reply = compose_reply(seq, 0);
+    reply = compose_reply(0);
     nl_msg_put_unspec(reply, BRC_GENL_A_IFINDEXES,
                       indices, n_indices * sizeof *indices);
-    send_reply(reply);
+    send_reply(reply, seq);
 
     /* Free memory. */
     free(indices);
@@ -654,56 +654,53 @@ handle_get_ports_cmd(struct ofpbuf *buffer)
     return 0;
 }
 
-static struct ofpbuf *
-brc_recv_update__(void)
+static bool
+brc_recv_update__(struct ofpbuf *buffer)
 {
     for (;;) {
-        struct ofpbuf *buffer;
-        int retval;
-
-        retval = nl_sock_recv(brc_sock, &buffer, false);
+        int retval = nl_sock_recv(brc_sock, buffer, false);
         switch (retval) {
         case 0:
             if (nl_msg_nlmsgerr(buffer, NULL)
                 || nl_msg_nlmsghdr(buffer)->nlmsg_type == NLMSG_DONE) {
                 break;
             }
-            return buffer;
+            return true;
 
         case ENOBUFS:
             break;
 
         case EAGAIN:
-            return NULL;
+            return false;
 
         default:
             VLOG_WARN_RL(&rl, "brc_recv_update: %s", strerror(retval));
-            return NULL;
+            return false;
         }
-        ofpbuf_delete(buffer);
     }
 }
 
 static void
 brc_recv_update(void)
 {
-    struct ofpbuf *buffer;
     struct genlmsghdr *genlmsghdr;
+    uint64_t buffer_stub[1024 / 8];
+    struct ofpbuf buffer;
 
-    buffer = brc_recv_update__();
-    if (!buffer) {
-        return;
+    ofpbuf_use_stub(&buffer, buffer_stub, sizeof buffer_stub);
+    if (!brc_recv_update__(&buffer)) {
+        goto error;
     }
 
-    genlmsghdr = nl_msg_genlmsghdr(buffer);
+    genlmsghdr = nl_msg_genlmsghdr(&buffer);
     if (!genlmsghdr) {
         VLOG_WARN_RL(&rl, "received packet too short for generic NetLink");
         goto error;
     }
 
-    if (nl_msg_nlmsghdr(buffer)->nlmsg_type != brc_family) {
+    if (nl_msg_nlmsghdr(&buffer)->nlmsg_type != brc_family) {
         VLOG_DBG_RL(&rl, "received type (%"PRIu16") != brcompat family (%d)",
-                nl_msg_nlmsghdr(buffer)->nlmsg_type, brc_family);
+                nl_msg_nlmsghdr(&buffer)->nlmsg_type, brc_family);
         goto error;
     }
 
@@ -729,31 +726,31 @@ brc_recv_update(void)
 
     switch (genlmsghdr->cmd) {
     case BRC_GENL_C_DP_ADD:
-        handle_bridge_cmd(buffer, true);
+        handle_bridge_cmd(&buffer, true);
         break;
 
     case BRC_GENL_C_DP_DEL:
-        handle_bridge_cmd(buffer, false);
+        handle_bridge_cmd(&buffer, false);
         break;
 
     case BRC_GENL_C_PORT_ADD:
-        handle_port_cmd(buffer, true);
+        handle_port_cmd(&buffer, true);
         break;
 
     case BRC_GENL_C_PORT_DEL:
-        handle_port_cmd(buffer, false);
+        handle_port_cmd(&buffer, false);
         break;
 
     case BRC_GENL_C_FDB_QUERY:
-        handle_fdb_query_cmd(buffer);
+        handle_fdb_query_cmd(&buffer);
         break;
 
     case BRC_GENL_C_GET_BRIDGES:
-        handle_get_bridges_cmd(buffer);
+        handle_get_bridges_cmd(&buffer);
         break;
 
     case BRC_GENL_C_GET_PORTS:
-        handle_get_ports_cmd(buffer);
+        handle_get_ports_cmd(&buffer);
         break;
 
     default:
@@ -763,7 +760,7 @@ brc_recv_update(void)
     }
 
 error:
-    ofpbuf_delete(buffer);
+    ofpbuf_uninit(&buffer);
 }
 
 static void
@@ -808,6 +805,8 @@ main(int argc, char *argv[])
     set_program_name(argv[0]);
     vlog_set_levels(&VLM_reconnect, VLF_ANY_FACILITY, VLL_WARN);
 
+    VLOG_WARN("Bridge compatibility is deprecated and may be removed "
+              "no earlier than February 2013");
     parse_options(argc, argv);
     signal(SIGPIPE, SIG_IGN);
     process_init();