diff options
| author | Ben Pfaff <blp@nicira.com> | 2010-07-20 11:10:45 -0700 |
|---|---|---|
| committer | Ben Pfaff <blp@nicira.com> | 2010-07-20 11:10:45 -0700 |
| commit | 81f3cad4d38768c35dce97e63ba9dd3225e5d59f (patch) | |
| tree | df8f3f5124734db1d19ee70cef2a5f43bd15e064 /lib/ofp-util.c | |
| parent | 52f4c6fa0d9170ccde68b71910be7fc825ba447d (diff) | |
| download | openvswitch-81f3cad4d38768c35dce97e63ba9dd3225e5d59f.tar.gz | |
learning-switch: Break packet-in processing into two steps.
Diffstat (limited to 'lib/ofp-util.c')
| -rw-r--r-- | lib/ofp-util.c | 37 |
1 files changed, 23 insertions, 14 deletions
diff --git a/lib/ofp-util.c b/lib/ofp-util.c index 16a3eeeeb..cedeb6702 100644 --- a/lib/ofp-util.c +++ b/lib/ofp-util.c @@ -186,14 +186,19 @@ make_add_simple_flow(const flow_t *flow, uint32_t buffer_id, uint16_t out_port, uint16_t idle_timeout) { - struct ofp_action_output *oao; - struct ofpbuf *buffer = make_add_flow(flow, buffer_id, idle_timeout, - sizeof *oao); - oao = ofpbuf_put_zeros(buffer, sizeof *oao); - oao->type = htons(OFPAT_OUTPUT); - oao->len = htons(sizeof *oao); - oao->port = htons(out_port); - return buffer; + if (out_port != OFPP_NONE) { + struct ofp_action_output *oao; + struct ofpbuf *buffer; + + buffer = make_add_flow(flow, buffer_id, idle_timeout, sizeof *oao); + oao = ofpbuf_put_zeros(buffer, sizeof *oao); + oao->type = htons(OFPAT_OUTPUT); + oao->len = htons(sizeof *oao); + oao->port = htons(out_port); + return buffer; + } else { + return make_add_flow(flow, buffer_id, idle_timeout, 0); + } } struct ofpbuf * @@ -259,12 +264,16 @@ struct ofpbuf * make_buffered_packet_out(uint32_t buffer_id, uint16_t in_port, uint16_t out_port) { - struct ofp_action_output action; - action.type = htons(OFPAT_OUTPUT); - action.len = htons(sizeof action); - action.port = htons(out_port); - return make_packet_out(NULL, buffer_id, in_port, - (struct ofp_action_header *) &action, 1); + if (out_port != OFPP_NONE) { + struct ofp_action_output action; + action.type = htons(OFPAT_OUTPUT); + action.len = htons(sizeof action); + action.port = htons(out_port); + return make_packet_out(NULL, buffer_id, in_port, + (struct ofp_action_header *) &action, 1); + } else { + return make_packet_out(NULL, buffer_id, in_port, NULL, 0); + } } /* Creates and returns an OFPT_ECHO_REQUEST message with an empty payload. */ |
