dpif: Improve logging of upcalls.
authorBen Pfaff <blp@nicira.com>
Wed, 8 Jun 2011 21:03:47 +0000 (14:03 -0700)
committerBen Pfaff <blp@nicira.com>
Thu, 9 Jun 2011 16:21:24 +0000 (09:21 -0700)
The kernel now provides the entire flow key for a packet sent up to
userspace, but dpif_recv() would only log the in_port.  This change makes
userspace log the entire flow key.

This would have made a bug that I recently looked at a bit easier to
investigate.

lib/dpif.c
lib/dpif.h

index 1106d6be5486f4f36099623a0088e35de27056d2..4e3788d42e2b9c35be7e93316bbad13b4ca76d7f 100644 (file)
@@ -952,6 +952,18 @@ dpif_execute(struct dpif *dpif,
     return error;
 }
 
+/* Returns a string that represents 'type', for use in log messages. */
+const char *
+dpif_upcall_type_to_string(enum dpif_upcall_type type)
+{
+    switch (type) {
+    case DPIF_UC_MISS: return "miss";
+    case DPIF_UC_ACTION: return "action";
+    case DPIF_UC_SAMPLE: return "sample";
+    case DPIF_N_UC_TYPES: default: return "<unknown>";
+    }
+}
+
 static bool OVS_UNUSED
 is_valid_listen_mask(int listen_mask)
 {
@@ -1045,20 +1057,22 @@ dpif_recv(struct dpif *dpif, struct dpif_upcall *upcall)
 {
     int error = dpif->dpif_class->recv(dpif, upcall);
     if (!error && !VLOG_DROP_DBG(&dpmsg_rl)) {
-        struct flow flow;
-        char *s;
-
-        s = ofp_packet_to_string(upcall->packet->data,
-                                 upcall->packet->size, upcall->packet->size);
-        odp_flow_key_to_flow(upcall->key, upcall->key_len, &flow);
-
-        VLOG_DBG("%s: %s upcall on port %"PRIu16": %s", dpif_name(dpif),
-                 (upcall->type == DPIF_UC_MISS ? "miss"
-                  : upcall->type == DPIF_UC_ACTION ? "action"
-                  : upcall->type == DPIF_UC_SAMPLE ? "sample"
-                  : "<unknown>"),
-                 flow.in_port, s);
-        free(s);
+        struct ds flow;
+        char *packet;
+
+        packet = ofp_packet_to_string(upcall->packet->data,
+                                      upcall->packet->size,
+                                      upcall->packet->size);
+
+        ds_init(&flow);
+        odp_flow_key_format(upcall->key, upcall->key_len, &flow);
+
+        VLOG_DBG("%s: %s upcall:\n%s\n%s",
+                 dpif_name(dpif), dpif_upcall_type_to_string(upcall->type),
+                 ds_cstr(&flow), packet);
+
+        ds_destroy(&flow);
+        free(packet);
     }
     return error;
 }
index 60e3cb481b026b7f8525163e00c17b4456fa6f07..4a71153acaed1d72f9c228ca7240701fb78536c5 100644 (file)
@@ -160,6 +160,8 @@ enum dpif_upcall_type {
     DPIF_N_UC_TYPES
 };
 
+const char *dpif_upcall_type_to_string(enum dpif_upcall_type);
+
 /* A packet passed up from the datapath to userspace.
  *
  * If 'key' or 'actions' is nonnull, then it points into data owned by