/*
- * Copyright (c) 2008, 2009, 2010, 2011 Nicira Networks.
+ * Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira Networks.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
#include "hmap.h"
#include "mac-learning.h"
#include "ofpbuf.h"
+#include "ofp-errors.h"
#include "ofp-parse.h"
#include "ofp-print.h"
#include "ofp-util.h"
sw->max_idle = cfg->max_idle;
sw->datapath_id = 0;
sw->last_features_request = time_now() - 1;
- sw->ml = cfg->mode == LSW_LEARN ? mac_learning_create() : NULL;
+ sw->ml = (cfg->mode == LSW_LEARN
+ ? mac_learning_create(MAC_ENTRY_DEFAULT_IDLE_TIME)
+ : NULL);
sw->action_normal = cfg->mode == LSW_NORMAL;
flow_wildcards_init_exact(&sw->wc);
case OFPUTIL_NXT_ROLE_REPLY:
case OFPUTIL_NXT_FLOW_MOD_TABLE_ID:
case OFPUTIL_NXT_SET_FLOW_FORMAT:
+ case OFPUTIL_NXT_SET_PACKET_IN_FORMAT:
+ case OFPUTIL_NXT_PACKET_IN:
case OFPUTIL_NXT_FLOW_MOD:
case OFPUTIL_NXT_FLOW_REMOVED:
+ case OFPUTIL_NXT_FLOW_AGE:
+ case OFPUTIL_NXT_SET_ASYNC_CONFIG:
case OFPUTIL_NXST_FLOW_REQUEST:
case OFPUTIL_NXST_AGGREGATE_REQUEST:
case OFPUTIL_NXST_FLOW_REPLY:
struct ofp_action_header actions[2];
size_t actions_len;
+ struct ofputil_packet_out po;
+
size_t pkt_ofs, pkt_len;
struct ofpbuf pkt;
struct flow flow;
}
assert(actions_len <= sizeof actions);
+ /* Prepare packet_out in case we need one. */
+ po.buffer_id = ntohl(opi->buffer_id);
+ if (po.buffer_id == UINT32_MAX) {
+ po.packet = pkt.data;
+ po.packet_len = pkt.size;
+ } else {
+ po.packet = NULL;
+ po.packet_len = 0;
+ }
+ po.in_port = in_port;
+ po.actions = (union ofp_action *) actions;
+ po.n_actions = actions_len / sizeof *actions;
+
/* Send the packet, and possibly the whole flow, to the output port. */
if (sw->max_idle >= 0 && (!sw->ml || out_port != OFPP_FLOOD)) {
struct ofpbuf *buffer;
/* If the switch didn't buffer the packet, we need to send a copy. */
if (ntohl(opi->buffer_id) == UINT32_MAX && actions_len > 0) {
- queue_tx(sw, rconn,
- make_packet_out(&pkt, UINT32_MAX, in_port,
- actions, actions_len / sizeof *actions));
+ queue_tx(sw, rconn, ofputil_encode_packet_out(&po));
}
} else {
/* We don't know that MAC, or we don't set up flows. Send along the
* packet without setting up a flow. */
if (ntohl(opi->buffer_id) != UINT32_MAX || actions_len > 0) {
- queue_tx(sw, rconn,
- make_packet_out(&pkt, ntohl(opi->buffer_id), in_port,
- actions, actions_len / sizeof *actions));
+ queue_tx(sw, rconn, ofputil_encode_packet_out(&po));
}
}
}