X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;ds=sidebyside;f=ofproto%2Fofproto-provider.h;h=77553f61cbbaea4cd93119ff20608284fac81c37;hb=6567010fff1a07100db5853416de0fe5ccd9e99d;hp=782fe6929e5872c9d2e5b516dde23f3b63824f2c;hpb=15aaf59932a3fa3d6c6b914a62d1ba8515cedbf8;p=sliver-openvswitch.git diff --git a/ofproto/ofproto-provider.h b/ofproto/ofproto-provider.h index 782fe6929..77553f61c 100644 --- a/ofproto/ofproto-provider.h +++ b/ofproto/ofproto-provider.h @@ -81,10 +81,11 @@ struct ofproto { /* Datapath. */ struct hmap ports; /* Contains "struct ofport"s. */ struct shash port_by_name; - unsigned long *ofp_port_ids;/* Bitmap of used OpenFlow port numbers. */ struct simap ofp_requests; /* OpenFlow port number requests. */ uint16_t alloc_port_no; /* Last allocated OpenFlow port number. */ uint16_t max_ports; /* Max possible OpenFlow port num, plus one. */ + struct hmap ofport_usage; /* Map ofport to last used time. */ + uint64_t change_seq; /* Change sequence for netdev status. */ /* Flow tables. */ long long int eviction_group_timer; /* For rate limited reheapification. */ @@ -161,6 +162,8 @@ struct ofproto *ofproto_lookup(const char *name); struct ofport *ofproto_get_port(const struct ofproto *, ofp_port_t ofp_port); /* An OpenFlow port within a "struct ofproto". + * + * The port's name is netdev_get_name(port->netdev). * * With few exceptions, ofproto implementations may look at these fields but * should not modify them. */ @@ -170,7 +173,6 @@ struct ofport { struct netdev *netdev; struct ofputil_phy_port pp; ofp_port_t ofp_port; /* OpenFlow port number. */ - unsigned int change_seq; long long int created; /* Time created, in msec. */ int mtu; }; @@ -306,7 +308,7 @@ struct oftable { * * 'rule->ref_count' protects 'rule' from being freed. It doesn't protect the * rule from being deleted from 'cls' (that's 'cls->rwlock') and it doesn't - * protect members of 'rule' from modification (that's 'rule->rwlock'). + * protect members of 'rule' from modification (that's 'rule->mutex'). * * 'rule->mutex' protects the members of 'rule' from modification. It doesn't * protect the rule from being deleted from 'cls' (that's 'cls->rwlock') and it @@ -398,6 +400,18 @@ struct rule_actions *rule_get_actions(const struct rule *rule) struct rule_actions *rule_get_actions__(const struct rule *rule) OVS_REQUIRES(rule->mutex); +/* Returns true if 'rule' is an OpenFlow 1.3 "table-miss" rule, false + * otherwise. + * + * ("Table-miss" rules are special because a packet_in generated through one + * uses OFPR_NO_MATCH as its reason, whereas packet_ins generated by any other + * rule use OFPR_ACTION.) */ +static inline bool +rule_is_table_miss(const struct rule *rule) +{ + return rule->cr.priority == 0 && cls_rule_is_catchall(&rule->cr); +} + /* A set of actions within a "struct rule". * * @@ -415,10 +429,11 @@ struct rule_actions { * lifetime. */ struct ofpact *ofpacts; /* Sequence of "struct ofpacts". */ unsigned int ofpacts_len; /* Size of 'ofpacts', in bytes. */ - uint32_t meter_id; /* Non-zero OF meter_id, or zero. */ + uint32_t provider_meter_id; /* Datapath meter_id, or UINT32_MAX. */ }; -struct rule_actions *rule_actions_create(const struct ofpact *, size_t); +struct rule_actions *rule_actions_create(const struct ofproto *, + const struct ofpact *, size_t); void rule_actions_ref(struct rule_actions *); void rule_actions_unref(struct rule_actions *); @@ -443,7 +458,7 @@ extern unsigned flow_eviction_threshold; /* Number of upcall handler threads. Only affects the ofproto-dpif * implementation. */ -extern unsigned n_handler_threads; +extern size_t n_handlers; /* Determines which model to use for handling misses in the ofproto-dpif * implementation */ @@ -457,8 +472,7 @@ rule_from_cls_rule(const struct cls_rule *cls_rule) void ofproto_rule_expire(struct rule *rule, uint8_t reason) OVS_REQUIRES(ofproto_mutex); -void ofproto_rule_delete(struct ofproto *, struct classifier *cls, - struct rule *) +void ofproto_rule_delete(struct ofproto *, struct rule *) OVS_EXCLUDED(ofproto_mutex); void ofproto_rule_reduce_timeouts(struct rule *rule, uint16_t idle_timeout, uint16_t hard_timeout) @@ -674,16 +688,6 @@ struct ofproto_class { * Returns 0 if successful, otherwise a positive errno value. */ int (*type_run)(const char *type); - /* Performs periodic activity required on ofprotos of type 'type' - * that needs to be done with the least possible latency. - * - * This is run multiple times per main loop. An ofproto provider may - * implement it or not, according to whether it provides a performance - * boost for that ofproto implementation. - * - * Returns 0 if successful, otherwise a positive errno value. */ - int (*type_run_fast)(const char *type); - /* Causes the poll loop to wake up when a type 'type''s 'run' * function needs to be called, e.g. by calling the timer or fd * waiting functions in poll-loop.h. @@ -767,14 +771,6 @@ struct ofproto_class { * Returns 0 if successful, otherwise a positive errno value. */ int (*run)(struct ofproto *ofproto); - /* Performs periodic activity required by 'ofproto' that needs to be done - * with the least possible latency. - * - * This is run multiple times per main loop. An ofproto provider may - * implement it or not, according to whether it provides a performance - * boost for that ofproto implementation. */ - int (*run_fast)(struct ofproto *ofproto); - /* Causes the poll loop to wake up when 'ofproto''s 'run' function needs to * be called, e.g. by calling the timer or fd waiting functions in * poll-loop.h. */ @@ -787,6 +783,12 @@ struct ofproto_class { void (*get_memory_usage)(const struct ofproto *ofproto, struct simap *usage); + /* Adds some memory usage statistics for the implementation of 'type' + * into 'usage', for use with memory_report(). + * + * This function is optional. */ + void (*type_get_memory_usage)(const char *type, struct simap *usage); + /* Every "struct rule" in 'ofproto' is about to be deleted, one by one. * This function may prepare for that, for example by clearing state in * advance. It should *not* actually delete any "struct rule"s from @@ -1518,6 +1520,16 @@ struct ofproto_class { int (*get_stp_port_status)(struct ofport *ofport, struct ofproto_port_stp_status *s); + /* Retrieves spanning tree protocol (STP) port statistics of 'ofport'. + * + * Stores STP state for 'ofport' in 's'. If the 'enabled' member is + * false, the other member values are not meaningful. + * + * EOPNOTSUPP as a return value indicates that this ofproto_class does not + * support STP, as does a null pointer. */ + int (*get_stp_port_stats)(struct ofport *ofport, + struct ofproto_port_stp_stats *s); + /* Registers meta-data associated with the 'n_qdscp' Qualities of Service * 'queues' attached to 'ofport'. This data is not intended to be * sufficient to implement QoS. Instead, providers may use this @@ -1649,10 +1661,9 @@ struct ofproto_class { * implementation. * * If '*id' is a value other than UINT32_MAX, modifies the existing meter - * with that meter provider ID to have configuration 'config'. On failure, - * the existing meter configuration is left intact. Regardless of success, - * any change to '*id' updates the provider meter id used for this - * meter. */ + * with that meter provider ID to have configuration 'config', while + * leaving '*id' unchanged. On failure, the existing meter configuration + * is left intact. */ enum ofperr (*meter_set)(struct ofproto *ofproto, ofproto_meter_id *id, const struct ofputil_meter_config *config);