2
0
mirror of https://github.com/openvswitch/ovs synced 2025-08-31 14:25:26 +00:00

Abstract everything that uses ofp_phy_port, add OF1.1 support.

Reviewed-by: Simon Horman <horms@verge.net.au>
Signed-off-by: Ben Pfaff <blp@nicira.com>
This commit is contained in:
Ben Pfaff
2012-02-15 16:33:04 -08:00
parent 08f94c0e1a
commit 9e1fd49b0c
16 changed files with 1449 additions and 432 deletions

View File

@@ -77,8 +77,8 @@ static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(30, 300);
static void queue_tx(struct lswitch *, struct rconn *, struct ofpbuf *);
static void send_features_request(struct lswitch *, struct rconn *);
static void process_switch_features(struct lswitch *,
struct ofp_switch_features *);
static enum ofperr process_switch_features(struct lswitch *,
struct ofp_switch_features *);
static void process_packet_in(struct lswitch *, struct rconn *,
const struct ofp_packet_in *);
static void process_echo_request(struct lswitch *, struct rconn *,
@@ -347,27 +347,32 @@ queue_tx(struct lswitch *sw, struct rconn *rconn, struct ofpbuf *b)
}
}
static void
static enum ofperr
process_switch_features(struct lswitch *sw, struct ofp_switch_features *osf)
{
size_t n_ports;
size_t i;
struct ofputil_switch_features features;
struct ofputil_phy_port port;
enum ofperr error;
struct ofpbuf b;
sw->datapath_id = ntohll(osf->datapath_id);
error = ofputil_decode_switch_features(osf, &features, &b);
if (error) {
VLOG_ERR("received invalid switch feature reply (%s)",
ofperr_to_string(error));
return error;
}
n_ports = (ntohs(osf->header.length) - sizeof *osf) / sizeof *osf->ports;
for (i = 0; i < n_ports; i++) {
struct ofp_phy_port *opp = &osf->ports[i];
struct lswitch_port *lp;
sw->datapath_id = features.datapath_id;
opp->name[OFP_MAX_PORT_NAME_LEN - 1] = '\0';
lp = shash_find_data(&sw->queue_names, opp->name);
while (!ofputil_pull_switch_features_port(&b, &port)) {
struct lswitch_port *lp = shash_find_data(&sw->queue_names, port.name);
if (lp && hmap_node_is_null(&lp->hmap_node)) {
lp->port_no = ntohs(opp->port_no);
lp->port_no = port.port_no;
hmap_insert(&sw->queue_numbers, &lp->hmap_node,
hash_int(lp->port_no, 0));
}
}
return 0;
}
static uint16_t