Well, it unifies both.  I changed it to "Decode and print".

On Tue, Jan 19, 2016 at 04:23:46PM -0800, Jarno Rajahalme wrote:
> Maybe the title should be “ofp-print: Print all async config messages the 
> same way.” instead?
> 
> Acked-by: Jarno Rajahalme <ja...@ovn.org>
> 
> > On Jan 18, 2016, at 11:27 PM, Ben Pfaff <b...@ovn.org> wrote:
> > 
> > We have a single function to decode all of these messages, so there's no
> > reason to do it two different ways for printing.
> > 
> > Signed-off-by: Ben Pfaff <b...@ovn.org>
> > ---
> > lib/ofp-print.c       | 117 
> > +++++++++++---------------------------------------
> > tests/ofp-print.at    |  26 +++++++++--
> > tests/ofproto-dpif.at |   6 +++
> > tests/ofproto.at      |   6 +++
> > 4 files changed, 60 insertions(+), 95 deletions(-)
> > 
> > diff --git a/lib/ofp-print.c b/lib/ofp-print.c
> > index f36335b..bedfc94 100644
> > --- a/lib/ofp-print.c
> > +++ b/lib/ofp-print.c
> > @@ -2063,108 +2063,42 @@ ofp_async_config_reason_to_string(uint32_t reason,
> > 
> > #define OFP_ASYNC_CONFIG_REASON_BUFSIZE (INT_STRLEN(int) + 1)
> > static void
> > -ofp_print_nxt_set_async_config(struct ds *string,
> > -                               const struct ofp_header *oh)
> > +ofp_print_set_async_config(struct ds *string, const struct ofp_header *oh,
> > +                           enum ofptype type)
> > {
> > -    int i, j;
> > -    enum ofpraw raw;
> > -
> > -    ofpraw_decode(&raw, oh);
> > -
> > -    if (raw == OFPRAW_OFPT13_SET_ASYNC ||
> > -        raw == OFPRAW_NXT_SET_ASYNC_CONFIG ||
> > -        raw == OFPRAW_OFPT13_GET_ASYNC_REPLY) {
> > -        const struct nx_async_config *nac = ofpmsg_body(oh);
> > -
> > -        for (i = 0; i < 2; i++) {
> > +    struct ofputil_async_cfg basis = OFPUTIL_ASYNC_CFG_INIT;
> > +    struct ofputil_async_cfg ac;
> > 
> > -            ds_put_format(string, "\n %s:\n", i == 0 ? "master" : "slave");
> > -
> > -            ds_put_cstr(string, "       PACKET_IN:");
> > -            for (j = 0; j < 32; j++) {
> > -                if (nac->packet_in_mask[i] & htonl(1u << j)) {
> > -                    char reasonbuf[OFPUTIL_PACKET_IN_REASON_BUFSIZE];
> > -                    const char *reason;
> > -
> > -                    reason = ofputil_packet_in_reason_to_string(j, 
> > reasonbuf,
> > -                                                            sizeof 
> > reasonbuf);
> > -                    ds_put_format(string, " %s", reason);
> > -                }
> > -            }
> > -            if (!nac->packet_in_mask[i]) {
> > -                ds_put_cstr(string, " (off)");
> > -            }
> > -            ds_put_char(string, '\n');
> > -
> > -            ds_put_cstr(string, "     PORT_STATUS:");
> > -            for (j = 0; j < 32; j++) {
> > -                if (nac->port_status_mask[i] & htonl(1u << j)) {
> > -                    char reasonbuf[OFP_PORT_REASON_BUFSIZE];
> > -                    const char *reason;
> > +    bool is_reply = type == OFPTYPE_GET_ASYNC_REPLY;
> > +    enum ofperr error = ofputil_decode_set_async_config(oh, is_reply,
> > +                                                        &basis, &ac);
> > +    if (error) {
> > +        ofp_print_error(string, error);
> > +        return;
> > +    }
> > 
> > -                    reason = ofp_port_reason_to_string(j, reasonbuf,
> > -                                                       sizeof reasonbuf);
> > -                    ds_put_format(string, " %s", reason);
> > -                }
> > -            }
> > -            if (!nac->port_status_mask[i]) {
> > -                ds_put_cstr(string, " (off)");
> > -            }
> > -            ds_put_char(string, '\n');
> > +    for (int i = 0; i < 2; i++) {
> > +        ds_put_format(string, "\n %s:\n", i == 0 ? "master" : "slave");
> > +        for (uint32_t type = 0; type < OAM_N_TYPES; type++) {
> > +            ds_put_format(string, "%16s:",
> > +                          ofputil_async_msg_type_to_string(type));
> > 
> > -            ds_put_cstr(string, "    FLOW_REMOVED:");
> > -            for (j = 0; j < 32; j++) {
> > -                if (nac->flow_removed_mask[i] & htonl(1u << j)) {
> > -                    char reasonbuf[OFP_FLOW_REMOVED_REASON_BUFSIZE];
> > +            uint32_t role = i == 0 ? ac.master[type] : ac.slave[type];
> > +            for (int j = 0; j < 32; j++) {
> > +                if (role & (1u << j)) {
> > +                    char reasonbuf[OFP_ASYNC_CONFIG_REASON_BUFSIZE];
> >                     const char *reason;
> > 
> > -                    reason = ofp_flow_removed_reason_to_string(j, 
> > reasonbuf,
> > -                                                           sizeof 
> > reasonbuf);
> > +                    reason = ofp_async_config_reason_to_string(
> > +                        j, type, reasonbuf, sizeof reasonbuf);
> >                     ds_put_format(string, " %s", reason);
> >                 }
> >             }
> > -            if (!nac->flow_removed_mask[i]) {
> > +            if (!role) {
> >                 ds_put_cstr(string, " (off)");
> >             }
> >             ds_put_char(string, '\n');
> >         }
> > -    } else if (raw == OFPRAW_OFPT14_SET_ASYNC ||
> > -               raw == OFPRAW_OFPT14_GET_ASYNC_REPLY) {
> > -        struct ofputil_async_cfg basis = OFPUTIL_ASYNC_CFG_INIT;
> > -        struct ofputil_async_cfg ac;
> > -
> > -        bool is_reply = raw == OFPRAW_OFPT14_GET_ASYNC_REPLY;
> > -        enum ofperr error = ofputil_decode_set_async_config(oh, is_reply,
> > -                                                            &basis, &ac);
> > -        if (error) {
> > -            ofp_print_error(string, error);
> > -            return;
> > -        }
> > -
> > -        for (i = 0; i < 2; i++) {
> > -            ds_put_format(string, "\n %s:\n", i == 0 ? "master" : "slave");
> > -            for (uint32_t type = 0; type < OAM_N_TYPES; type++) {
> > -                ds_put_format(string, "%16s:",
> > -                              ofputil_async_msg_type_to_string(type));
> > -
> > -                uint32_t role = i == 0 ? ac.master[type] : ac.slave[type];
> > -                for (j = 0; j < 32; j++) {
> > -                    if (role & (1u << j)) {
> > -                        char reasonbuf[OFP_ASYNC_CONFIG_REASON_BUFSIZE];
> > -                        const char *reason;
> > -
> > -                        reason = ofp_async_config_reason_to_string(j, type,
> > -                                                                   
> > reasonbuf,
> > -                                                           sizeof 
> > reasonbuf);
> > -                        ds_put_format(string, " %s", reason);
> > -                    }
> > -                }
> > -                if (!role) {
> > -                    ds_put_cstr(string, " (off)");
> > -                }
> > -                ds_put_char(string, '\n');
> > -            }
> > -        }
> >     }
> > }
> > 
> > @@ -3137,8 +3071,9 @@ ofp_to_string__(const struct ofp_header *oh, enum 
> > ofpraw raw,
> >     const void *msg = oh;
> > 
> >     ofp_header_to_string__(oh, raw, string);
> > -    switch (ofptype_from_ofpraw(raw)) {
> > 
> > +    enum ofptype type = ofptype_from_ofpraw(raw);
> > +    switch (type) {
> >     case OFPTYPE_GROUP_STATS_REQUEST:
> >         ofp_print_stats(string, oh);
> >         ofp_print_ofpst_group_request(string, oh);
> > @@ -3373,7 +3308,7 @@ ofp_to_string__(const struct ofp_header *oh, enum 
> > ofpraw raw,
> > 
> >     case OFPTYPE_GET_ASYNC_REPLY:
> >     case OFPTYPE_SET_ASYNC_CONFIG:
> > -        ofp_print_nxt_set_async_config(string, oh);
> > +        ofp_print_set_async_config(string, oh, type);
> >         break;
> >     case OFPTYPE_GET_ASYNC_REQUEST:
> >         break;
> > diff --git a/tests/ofp-print.at b/tests/ofp-print.at
> > index 6d508d3..c791cb2 100644
> > --- a/tests/ofp-print.at
> > +++ b/tests/ofp-print.at
> > @@ -2637,20 +2637,30 @@ AT_CLEANUP
> > 
> > AT_SETUP([OFPT_SET_ASYNC - OF1.3])
> > AT_KEYWORDS([ofp-print])
> > +dnl This message has bit 12 set for the PACKET_IN messages (master and 
> > slave).
> > +dnl Those aren't supported bits so they get silently ignored on decoding.
> > +dnl That seems reasonable because OF1.3 doesn't define any error codes for
> > +dnl OFPT_SET_ASYNC.
> > AT_CHECK([ovs-ofctl ofp-print "\
> > 04 1c 00 20 00 00 00 00 00 00 10 05 00 00 10 07 \
> > 00 00 00 03 00 00 00 07 00 00 00 00 00 00 00 03 \
> > "], [0], [dnl
> > OFPT_SET_ASYNC (OF1.3) (xid=0x0):
> >  master:
> > -       PACKET_IN: no_match invalid_ttl 12
> > +       PACKET_IN: no_match invalid_ttl
> >      PORT_STATUS: add delete
> >     FLOW_REMOVED: (off)
> > +     ROLE_STATUS: (off)
> > +    TABLE_STATUS: (off)
> > +  REQUESTFORWARD: (off)
> > 
> >  slave:
> > -       PACKET_IN: no_match action invalid_ttl 12
> > +       PACKET_IN: no_match action invalid_ttl
> >      PORT_STATUS: add delete modify
> >     FLOW_REMOVED: idle hard
> > +     ROLE_STATUS: (off)
> > +    TABLE_STATUS: (off)
> > +  REQUESTFORWARD: (off)
> > ])
> > AT_CLEANUP
> > 
> > @@ -2838,6 +2848,8 @@ AT_CLEANUP
> > 
> > AT_SETUP([NXT_SET_ASYNC_CONFIG])
> > AT_KEYWORDS([ofp-print])
> > +dnl This message has bit 12 set for the PACKET_IN messages (master and 
> > slave).
> > +dnl Those aren't supported bits so they get silently ignored on decoding.
> > AT_CHECK([ovs-ofctl ofp-print "\
> > 01 04 00 28 00 00 00 00 00 00 23 20 00 00 00 13 \
> > 00 00 10 05 00 00 10 07 00 00 00 03 00 00 00 07 \
> > @@ -2845,14 +2857,20 @@ AT_CHECK([ovs-ofctl ofp-print "\
> > "], [0], [dnl
> > NXT_SET_ASYNC_CONFIG (xid=0x0):
> >  master:
> > -       PACKET_IN: no_match invalid_ttl 12
> > +       PACKET_IN: no_match invalid_ttl
> >      PORT_STATUS: add delete
> >     FLOW_REMOVED: (off)
> > +     ROLE_STATUS: (off)
> > +    TABLE_STATUS: (off)
> > +  REQUESTFORWARD: (off)
> > 
> >  slave:
> > -       PACKET_IN: no_match action invalid_ttl 12
> > +       PACKET_IN: no_match action invalid_ttl
> >      PORT_STATUS: add delete modify
> >     FLOW_REMOVED: idle hard
> > +     ROLE_STATUS: (off)
> > +    TABLE_STATUS: (off)
> > +  REQUESTFORWARD: (off)
> > ])
> > AT_CLEANUP
> > 
> > diff --git a/tests/ofproto-dpif.at b/tests/ofproto-dpif.at
> > index 4c2a995..bc1af8f 100644
> > --- a/tests/ofproto-dpif.at
> > +++ b/tests/ofproto-dpif.at
> > @@ -2810,11 +2810,17 @@ send: OFPT_SET_ASYNC (OF1.3) (xid=0x2):
> >        PACKET_IN: (off)
> >      PORT_STATUS: (off)
> >     FLOW_REMOVED: (off)
> > +     ROLE_STATUS: (off)
> > +    TABLE_STATUS: (off)
> > +  REQUESTFORWARD: (off)
> > 
> >  slave:
> >        PACKET_IN: no_match
> >      PORT_STATUS: (off)
> >     FLOW_REMOVED: (off)
> > +     ROLE_STATUS: (off)
> > +    TABLE_STATUS: (off)
> > +  REQUESTFORWARD: (off)
> > dnl
> > OFPT_PACKET_IN (OF1.3) (xid=0x0): cookie=0x0 total_len=60 in_port=1 (via 
> > no_match) data_len=60 (unbuffered)
> > tcp,vlan_tci=0x0000,dl_src=10:11:11:11:11:11,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=10,tcp_flags=syn
> >  tcp_csum:0
> > diff --git a/tests/ofproto.at b/tests/ofproto.at
> > index ab4d254..61a6be5 100644
> > --- a/tests/ofproto.at
> > +++ b/tests/ofproto.at
> > @@ -3845,11 +3845,17 @@ OFPT_GET_ASYNC_REPLY (OF1.3):
> >        PACKET_IN: no_match action
> >      PORT_STATUS: add delete modify
> >     FLOW_REMOVED: idle hard delete
> > +     ROLE_STATUS: (off)
> > +    TABLE_STATUS: (off)
> > +  REQUESTFORWARD: (off)
> > 
> >  slave:
> >        PACKET_IN: (off)
> >      PORT_STATUS: add delete modify
> >     FLOW_REMOVED: (off)
> > +     ROLE_STATUS: (off)
> > +    TABLE_STATUS: (off)
> > +  REQUESTFORWARD: (off)
> > OFPT_BARRIER_REPLY (OF1.3):
> > ])
> > 
> > -- 
> > 2.1.3
> > 
> > _______________________________________________
> > dev mailing list
> > dev@openvswitch.org
> > http://openvswitch.org/mailman/listinfo/dev
> 
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to