projects
/
openvswitch
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
New action NXAST_RESUBMIT_TABLE.
[openvswitch]
/
ofproto
/
ofproto.c
diff --git
a/ofproto/ofproto.c
b/ofproto/ofproto.c
index 8054d05cd130f76503fc469669078a4278f534e8..2dd3c9f71287d0380b41fd3dd48fe48c89acedc9 100644
(file)
--- a/
ofproto/ofproto.c
+++ b/
ofproto/ofproto.c
@@
-289,7
+289,9
@@
ofproto_create(const char *datapath_name, const char *datapath_type,
struct ofproto **ofprotop)
{
const struct ofproto_class *class;
struct ofproto **ofprotop)
{
const struct ofproto_class *class;
+ struct classifier *table;
struct ofproto *ofproto;
struct ofproto *ofproto;
+ int n_tables;
int error;
*ofprotop = NULL;
int error;
*ofprotop = NULL;
@@
-337,14
+339,20
@@
ofproto_create(const char *datapath_name, const char *datapath_type,
list_init(&ofproto->pending);
hmap_init(&ofproto->deletions);
list_init(&ofproto->pending);
hmap_init(&ofproto->deletions);
- error = ofproto->ofproto_class->construct(ofproto);
+ error = ofproto->ofproto_class->construct(ofproto
, &n_tables
);
if (error) {
VLOG_ERR("failed to open datapath %s: %s",
datapath_name, strerror(error));
ofproto_destroy__(ofproto);
return error;
}
if (error) {
VLOG_ERR("failed to open datapath %s: %s",
datapath_name, strerror(error));
ofproto_destroy__(ofproto);
return error;
}
- assert(ofproto->n_tables > 0);
+
+ assert(n_tables >= 1 && n_tables <= 255);
+ ofproto->n_tables = n_tables;
+ ofproto->tables = xmalloc(n_tables * sizeof *ofproto->tables);
+ OFPROTO_FOR_EACH_TABLE (table, ofproto) {
+ classifier_init(table);
+ }
ofproto->datapath_id = pick_datapath_id(ofproto);
VLOG_INFO("using datapath ID %016"PRIx64, ofproto->datapath_id);
ofproto->datapath_id = pick_datapath_id(ofproto);
VLOG_INFO("using datapath ID %016"PRIx64, ofproto->datapath_id);
@@
-667,8
+675,7
@@
ofproto_flush__(struct ofproto *ofproto)
}
group = ofopgroup_create(ofproto);
}
group = ofopgroup_create(ofproto);
- for (table = ofproto->tables; table < &ofproto->tables[ofproto->n_tables];
- table++) {
+ OFPROTO_FOR_EACH_TABLE (table, ofproto) {
struct rule *rule, *next_rule;
struct cls_cursor cursor;
struct rule *rule, *next_rule;
struct cls_cursor cursor;
@@
-687,7
+694,7
@@
ofproto_flush__(struct ofproto *ofproto)
static void
ofproto_destroy__(struct ofproto *ofproto)
{
static void
ofproto_destroy__(struct ofproto *ofproto)
{
- s
ize_t i
;
+ s
truct classifier *table
;
assert(list_is_empty(&ofproto->pending));
assert(list_is_empty(&ofproto->pending));
@@
-704,9
+711,9
@@
ofproto_destroy__(struct ofproto *ofproto)
hmap_destroy(&ofproto->ports);
shash_destroy(&ofproto->port_by_name);
hmap_destroy(&ofproto->ports);
shash_destroy(&ofproto->port_by_name);
-
for (i = 0; i < ofproto->n_tables; i++
) {
- assert(classifier_is_empty(
&ofproto->tables[i]
));
- classifier_destroy(
&ofproto->tables[i]
);
+
OFPROTO_FOR_EACH_TABLE (table, ofproto
) {
+ assert(classifier_is_empty(
table
));
+ classifier_destroy(
table
);
}
free(ofproto->tables);
}
free(ofproto->tables);
@@
-1107,16
+1114,11
@@
static struct netdev *
ofport_open(const struct ofproto_port *ofproto_port, struct ofp_phy_port *opp)
{
uint32_t curr, advertised, supported, peer;
ofport_open(const struct ofproto_port *ofproto_port, struct ofp_phy_port *opp)
{
uint32_t curr, advertised, supported, peer;
- struct netdev_options netdev_options;
enum netdev_flags flags;
struct netdev *netdev;
int error;
enum netdev_flags flags;
struct netdev *netdev;
int error;
- memset(&netdev_options, 0, sizeof netdev_options);
- netdev_options.name = ofproto_port->name;
- netdev_options.type = ofproto_port->type;
-
- error = netdev_open(&netdev_options, &netdev);
+ error = netdev_open(ofproto_port->name, ofproto_port->type, &netdev);
if (error) {
VLOG_WARN_RL(&rl, "ignoring port %s (%"PRIu16") because netdev %s "
"cannot be opened (%s)",
if (error) {
VLOG_WARN_RL(&rl, "ignoring port %s (%"PRIu16") because netdev %s "
"cannot be opened (%s)",
@@
-1953,7
+1955,7
@@
ofproto_get_all_flows(struct ofproto *p, struct ds *results)
{
struct classifier *cls;
{
struct classifier *cls;
-
for (cls = &p->tables[0]; cls < &p->tables[p->n_tables]; cls++
) {
+
OFPROTO_FOR_EACH_TABLE (cls, p
) {
struct cls_cursor cursor;
struct rule *rule;
struct cls_cursor cursor;
struct rule *rule;
@@
-2179,7
+2181,7
@@
add_flow(struct ofproto *ofproto, struct ofconn *ofconn, struct flow_mod *fm,
/* Pick table. */
if (fm->table_id == 0xff) {
uint8_t table_id;
/* Pick table. */
if (fm->table_id == 0xff) {
uint8_t table_id;
- if (ofproto->
n_tables > 1
) {
+ if (ofproto->
ofproto_class->rule_choose_table
) {
error = ofproto->ofproto_class->rule_choose_table(ofproto, &fm->cr,
&table_id);
if (error) {
error = ofproto->ofproto_class->rule_choose_table(ofproto, &fm->cr,
&table_id);
if (error) {