mirror of
https://github.com/openvswitch/ovs
synced 2025-09-02 23:35:27 +00:00
ofp-util: Allow decoding of Open Flow 1.1 and 1.2 Packet Out Messages
Signed-off-by: Simon Horman <horms@verge.net.au> Signed-off-by: Ben Pfaff <blp@nicira.com>
This commit is contained in:
@@ -2149,13 +2149,31 @@ ofputil_decode_packet_out(struct ofputil_packet_out *po,
|
|||||||
const struct ofp_header *oh,
|
const struct ofp_header *oh,
|
||||||
struct ofpbuf *ofpacts)
|
struct ofpbuf *ofpacts)
|
||||||
{
|
{
|
||||||
|
enum ofperr bad_in_port_err;
|
||||||
enum ofpraw raw;
|
enum ofpraw raw;
|
||||||
struct ofpbuf b;
|
struct ofpbuf b;
|
||||||
|
|
||||||
ofpbuf_use_const(&b, oh, ntohs(oh->length));
|
ofpbuf_use_const(&b, oh, ntohs(oh->length));
|
||||||
raw = ofpraw_pull_assert(&b);
|
raw = ofpraw_pull_assert(&b);
|
||||||
|
|
||||||
if (raw == OFPRAW_OFPT10_PACKET_OUT) {
|
if (raw == OFPRAW_OFPT11_PACKET_OUT) {
|
||||||
|
enum ofperr error;
|
||||||
|
const struct ofp11_packet_out *opo = ofpbuf_pull(&b, sizeof *opo);
|
||||||
|
|
||||||
|
po->buffer_id = ntohl(opo->buffer_id);
|
||||||
|
error = ofputil_port_from_ofp11(opo->in_port, &po->in_port);
|
||||||
|
if (error) {
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
error = ofpacts_pull_openflow11_actions(&b, ntohs(opo->actions_len),
|
||||||
|
ofpacts);
|
||||||
|
if (error) {
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
bad_in_port_err = OFPERR_OFPBMC_BAD_VALUE;
|
||||||
|
} else if (raw == OFPRAW_OFPT10_PACKET_OUT) {
|
||||||
enum ofperr error;
|
enum ofperr error;
|
||||||
const struct ofp_packet_out *opo = ofpbuf_pull(&b, sizeof *opo);
|
const struct ofp_packet_out *opo = ofpbuf_pull(&b, sizeof *opo);
|
||||||
|
|
||||||
@@ -2166,6 +2184,8 @@ ofputil_decode_packet_out(struct ofputil_packet_out *po,
|
|||||||
if (error) {
|
if (error) {
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bad_in_port_err = OFPERR_NXBRC_BAD_IN_PORT;
|
||||||
} else {
|
} else {
|
||||||
NOT_REACHED();
|
NOT_REACHED();
|
||||||
}
|
}
|
||||||
@@ -2174,7 +2194,7 @@ ofputil_decode_packet_out(struct ofputil_packet_out *po,
|
|||||||
&& po->in_port != OFPP_NONE && po->in_port != OFPP_CONTROLLER) {
|
&& po->in_port != OFPP_NONE && po->in_port != OFPP_CONTROLLER) {
|
||||||
VLOG_WARN_RL(&bad_ofmsg_rl, "packet-out has bad input port %#"PRIx16,
|
VLOG_WARN_RL(&bad_ofmsg_rl, "packet-out has bad input port %#"PRIx16,
|
||||||
po->in_port);
|
po->in_port);
|
||||||
return OFPERR_NXBRC_BAD_IN_PORT;
|
return bad_in_port_err;
|
||||||
}
|
}
|
||||||
|
|
||||||
po->ofpacts = ofpacts->data;
|
po->ofpacts = ofpacts->data;
|
||||||
|
@@ -406,7 +406,7 @@ OFPT_PORT_STATUS (OF1.1) (xid=0x0): MOD: 3(eth0): addr:50:54:00:00:00:01
|
|||||||
])
|
])
|
||||||
AT_CLEANUP
|
AT_CLEANUP
|
||||||
|
|
||||||
AT_SETUP([OFPT_PACKET_OUT])
|
AT_SETUP([OFPT_PACKET_OUT - OF1.0])
|
||||||
AT_KEYWORDS([ofp-print])
|
AT_KEYWORDS([ofp-print])
|
||||||
AT_CHECK([ovs-ofctl ofp-print "\
|
AT_CHECK([ovs-ofctl ofp-print "\
|
||||||
01 0d 00 54 00 00 00 00 00 00 01 14 00 01 00 08 \
|
01 0d 00 54 00 00 00 00 00 00 01 14 00 01 00 08 \
|
||||||
@@ -420,6 +420,17 @@ OFPT_PACKET_OUT (xid=0x0): in_port=1 actions=output:3 buffer=0x00000114
|
|||||||
])
|
])
|
||||||
AT_CLEANUP
|
AT_CLEANUP
|
||||||
|
|
||||||
|
AT_SETUP([OFPT_PACKET_OUT - OF1.1])
|
||||||
|
AT_KEYWORDS([ofp-print])
|
||||||
|
AT_CHECK([ovs-ofctl ofp-print "\
|
||||||
|
03 0d 00 28 88 58 df c5 ff ff ff 00 ff ff ff fe \
|
||||||
|
00 10 00 00 00 00 00 00 00 00 00 10 ff ff ff fb \
|
||||||
|
05 dc 00 00 00 00 00 00 \
|
||||||
|
"], [0], [dnl
|
||||||
|
OFPT_PACKET_OUT (OF1.2) (xid=0x8858dfc5): in_port=LOCAL actions=FLOOD buffer=0xffffff00
|
||||||
|
])
|
||||||
|
AT_CLEANUP
|
||||||
|
|
||||||
# The flow is formatted with cls_rule_format() for the low-verbosity case.
|
# The flow is formatted with cls_rule_format() for the low-verbosity case.
|
||||||
AT_SETUP([OFPT_FLOW_MOD - OF1.0 - low verbosity])
|
AT_SETUP([OFPT_FLOW_MOD - OF1.0 - low verbosity])
|
||||||
AT_KEYWORDS([ofp-print])
|
AT_KEYWORDS([ofp-print])
|
||||||
|
Reference in New Issue
Block a user