Guru,

Please find my comment below,

  Jarno

On Mar 20, 2014, at 6:13 PM, Gurucharan Shetty <shet...@nicira.com> wrote:

> Commit 03fbdf8d9c80a (lib/flow: Retain ODPP_NONE on flow_extract())
> replaced packet metadata initialization function by a macro.
> Visual studio does not like nested structure initialization that
> is done in that macro.
> 
> This commit, reverts the above mentioned commit partially by
> re-introducing the metadata initialization function.
> 
> CC: Jarno Rajahalme <jrajaha...@nicira.com>
> Signed-off-by: Gurucharan Shetty <gshe...@nicira.com>
> ---
> lib/packets.c                 |   22 ++++++++++++++++++++++
> lib/packets.h                 |    8 +++++---
> ofproto/ofproto-dpif-upcall.c |    3 ++-
> ofproto/ofproto-dpif.c        |    5 ++++-
> 4 files changed, 33 insertions(+), 5 deletions(-)
> 
> diff --git a/lib/packets.c b/lib/packets.c
> index 65ba3f6..0143de6 100644
> --- a/lib/packets.c
> +++ b/lib/packets.c
> @@ -976,3 +976,25 @@ packet_format_tcp_flags(struct ds *s, uint16_t tcp_flags)
>         ds_put_cstr(s, "[800]");
>     }
> }
> +
> +void pkt_metadata_init(struct pkt_metadata *md, const struct flow_tnl *tnl,
> +                       const uint32_t skb_priority,
> +                       const uint32_t pkt_mark,
> +                       const union flow_in_port *in_port)
> +{
> +    if (tnl) {
> +        memcpy(&md->tunnel, tnl, sizeof(md->tunnel));
> +    } else {
> +        memset(&md->tunnel, 0, sizeof(md->tunnel));
> +    }
> +
> +    md->skb_priority = skb_priority;
> +    md->pkt_mark = pkt_mark;
> +    md->in_port.odp_port = in_port ? in_port->odp_port : 0;
> +}
> +
> +void pkt_metadata_from_flow(struct pkt_metadata *md, const struct flow *flow)
> +{
> +    pkt_metadata_init(md, &flow->tunnel, flow->skb_priority,
> +                           flow->pkt_mark, &flow->in_port);
> +}
> diff --git a/lib/packets.h b/lib/packets.h
> index 18a3b17..16fa66c 100644
> --- a/lib/packets.h
> +++ b/lib/packets.h
> @@ -42,9 +42,11 @@ struct pkt_metadata {
> #define PKT_METADATA_INITIALIZER(PORT) \
>     (struct pkt_metadata){ { 0, 0, 0, 0, 0, 0}, 0, 0, {(PORT)} }
> 
> -#define PKT_METADATA_INITIALIZER_FLOW(FLOW) \
> -    (struct pkt_metadata){ (FLOW)->tunnel, (FLOW)->skb_priority, \
> -            (FLOW)->pkt_mark, (FLOW)->in_port }
> +void pkt_metadata_init(struct pkt_metadata *md, const struct flow_tnl *tnl,
> +                       const uint32_t skb_priority,
> +                       const uint32_t pkt_mark,
> +                       const union flow_in_port *in_port);
> +void pkt_metadata_from_flow(struct pkt_metadata *md, const struct flow 
> *flow);
> 

IMO this would better match the macro, can you try this one instead:

static inline struct pkt_metadata pkt_metadata_from_flow(const struct flow 
*flow)
{
    struct pkt_metadata md;

    md.tunnel = flow->tunnel;
    md.skb_priority = flow->skb_priority;
    md.pkt_mark = flow->pkt_mark;
    md.in_port = flow->in_port;

    return md;
}

I did not try this myself, hopefully no typos above. If this works, then the 
changes in packets.c are not necessary, and both call sites change to something 
like:

> -            struct pkt_metadata md = PKT_METADATA_INITIALIZER_FLOW(&flow);
> +            struct pkt_metadata md = pkt_metadata_from_flow(&flow);


Regards,

  Jarno


> bool dpid_from_string(const char *s, uint64_t *dpidp);
> 
> diff --git a/ofproto/ofproto-dpif-upcall.c b/ofproto/ofproto-dpif-upcall.c
> index 0048943..0c19dc0 100644
> --- a/ofproto/ofproto-dpif-upcall.c
> +++ b/ofproto/ofproto-dpif-upcall.c
> @@ -1016,8 +1016,9 @@ handle_upcalls(struct handler *handler, struct list 
> *upcalls)
>         type = classify_upcall(upcall);
>         if (type == MISS_UPCALL) {
>             uint32_t hash;
> -            struct pkt_metadata md = PKT_METADATA_INITIALIZER_FLOW(&flow);
> +            struct pkt_metadata md;
> 
> +            pkt_metadata_from_flow(&md, &flow);
>             flow_extract(packet, &md, &miss->flow);
>             hash = flow_hash(&miss->flow, 0);
>             existing_miss = flow_miss_find(&misses, ofproto, &miss->flow,
> diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
> index 8ce439d..e33ad5e 100644
> --- a/ofproto/ofproto-dpif.c
> +++ b/ofproto/ofproto-dpif.c
> @@ -3876,10 +3876,13 @@ parse_flow_and_packet(int argc, const char *argv[],
>         if (!packet->size) {
>             flow_compose(packet, flow);
>         } else {
> -            struct pkt_metadata md = PKT_METADATA_INITIALIZER_FLOW(flow);
> +            union flow_in_port in_port = flow->in_port;
> +            struct pkt_metadata md;
> 
>             /* Use the metadata from the flow and the packet argument
>              * to reconstruct the flow. */
> +            pkt_metadata_init(&md, NULL, flow->skb_priority,
> +                              flow->pkt_mark, &in_port);
>             flow_extract(packet, &md, flow);
>         }
>     }
> -- 
> 1.7.9.5
> 

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to