Looks Good.

Ethan

On Wed, Jun 8, 2011 at 14:04, Ben Pfaff <[email protected]> wrote:
> 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 |   42 ++++++++++++++++++++++++++++--------------
>  lib/dpif.h |    2 ++
>  2 files changed, 30 insertions(+), 14 deletions(-)
>
> diff --git a/lib/dpif.c b/lib/dpif.c
> index 1106d6b..4e3788d 100644
> --- a/lib/dpif.c
> +++ b/lib/dpif.c
> @@ -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;
>  }
> diff --git a/lib/dpif.h b/lib/dpif.h
> index 60e3cb4..4a71153 100644
> --- a/lib/dpif.h
> +++ b/lib/dpif.h
> @@ -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
> --
> 1.7.4.4
>
> _______________________________________________
> dev mailing list
> [email protected]
> http://openvswitch.org/mailman/listinfo/dev
>
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev

Reply via email to