summaryrefslogtreecommitdiff
path: root/lib/ofp-util.c
diff options
context:
space:
mode:
authorBen Pfaff <blp@nicira.com>2010-07-20 11:10:45 -0700
committerBen Pfaff <blp@nicira.com>2010-07-20 11:10:45 -0700
commit81f3cad4d38768c35dce97e63ba9dd3225e5d59f (patch)
treedf8f3f5124734db1d19ee70cef2a5f43bd15e064 /lib/ofp-util.c
parent52f4c6fa0d9170ccde68b71910be7fc825ba447d (diff)
downloadopenvswitch-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.c37
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. */