Respin "Make vconns keep track of their names and include them in log messages."
[sliver-openvswitch.git] / lib / vconn.c
index 6dfba22..3e06dc3 100644 (file)
@@ -32,7 +32,7 @@
  */
 
 #include <config.h>
-#include "vconn.h"
+#include "vconn-provider.h"
 #include <assert.h>
 #include <errno.h>
 #include <inttypes.h>
@@ -65,6 +65,11 @@ static struct vconn_class *vconn_classes[] = {
     &punix_vconn_class,
 };
 
+/* High rate limit because most of the rate-limiting here is individual
+ * OpenFlow messages going over the vconn.  If those are enabled then we
+ * really need to see them. */
+static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(600, 600);
+
 /* Check the validity of the vconn class structures. */
 static void
 check_vconn_classes(void)
@@ -169,6 +174,7 @@ vconn_open(const char *name, struct vconn **vconnp)
             if (!retval) {
                 assert(vconn->connect_status != EAGAIN
                        || vconn->class->connect);
+                vconn->name = xstrdup(name);
                 *vconnp = vconn;
             }
             return retval;
@@ -205,7 +211,9 @@ void
 vconn_close(struct vconn *vconn)
 {
     if (vconn != NULL) {
+        char *name = vconn->name;
         (vconn->class->close)(vconn);
+        free(name);
     }
 }
 
@@ -282,15 +290,15 @@ vconn_recv(struct vconn *vconn, struct buffer **msgp)
 
             if (VLOG_IS_DBG_ENABLED()) {
                 char *s = ofp_to_string((*msgp)->data, (*msgp)->size, 1);
-                VLOG_DBG("received: %s", s);
+                VLOG_DBG_RL(&rl, "%s: received: %s", vconn->name, s);
                 free(s);
             }
 
             oh = buffer_at_assert(*msgp, 0, sizeof *oh);
             if (oh->version != OFP_VERSION) {
-                VLOG_ERR("received OpenFlow version %02"PRIx8" "
-                         "!= expected %02x",
-                         oh->version, OFP_VERSION);
+                VLOG_ERR_RL(&rl, "%s: received OpenFlow version %02"PRIx8" "
+                            "!= expected %02x",
+                            vconn->name, oh->version, OFP_VERSION);
                 buffer_delete(*msgp);
                 *msgp = NULL;
                 return EPROTO;
@@ -327,7 +335,7 @@ vconn_send(struct vconn *vconn, struct buffer *msg)
             char *s = ofp_to_string(msg->data, msg->size, 1);
             retval = (vconn->class->send)(vconn, msg);
             if (retval != EAGAIN) {
-                VLOG_DBG("sent (%s): %s", strerror(retval), s);
+                VLOG_DBG_RL(&rl, "%s: sent (%s): %s", vconn->name, strerror(retval), s);
             }
             free(s);
         }
@@ -342,7 +350,6 @@ vconn_send_block(struct vconn *vconn, struct buffer *msg)
     int retval;
     while ((retval = vconn_send(vconn, msg)) == EAGAIN) {
         vconn_send_wait(vconn);
-        VLOG_DBG("blocking on vconn send");
         poll_block();
     }
     return retval;
@@ -355,7 +362,6 @@ vconn_recv_block(struct vconn *vconn, struct buffer **msgp)
     int retval;
     while ((retval = vconn_recv(vconn, msgp)) == EAGAIN) {
         vconn_recv_wait(vconn);
-        VLOG_DBG("blocking on vconn receive");
         poll_block();
     }
     return retval;
@@ -394,8 +400,8 @@ vconn_transact(struct vconn *vconn, struct buffer *request,
             return 0;
         }
 
-        VLOG_DBG("received reply with xid %08"PRIx32" != expected %08"PRIx32,
-                 recv_xid, send_xid);
+        VLOG_DBG_RL(&rl, "%s: received reply with xid %08"PRIx32" != expected "
+                    "%08"PRIx32, vconn->name, recv_xid, send_xid);
         buffer_delete(reply);
     }
 }
@@ -500,7 +506,7 @@ make_add_flow(const struct flow *flow, uint32_t buffer_id,
     ofm->header.version = OFP_VERSION;
     ofm->header.type = OFPT_FLOW_MOD;
     ofm->header.length = htons(size);
-    ofm->match.wildcards = htons(0);
+    ofm->match.wildcards = htonl(0);
     ofm->match.in_port = flow->in_port;
     memcpy(ofm->match.dl_src, flow->dl_src, sizeof ofm->match.dl_src);
     memcpy(ofm->match.dl_dst, flow->dl_dst, sizeof ofm->match.dl_dst);
@@ -599,3 +605,14 @@ make_echo_reply(const struct ofp_header *rq)
     reply->type = OFPT_ECHO_REPLY;
     return out;
 }
+
+void
+vconn_init(struct vconn *vconn, struct vconn_class *class, int connect_status,
+           uint32_t ip, const char *name)
+{
+    vconn->class = class;
+    vconn->connect_status = connect_status;
+    vconn->ip = ip;
+    vconn->name = xstrdup(name);
+}
+