X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=ofproto%2Fofproto-provider.h;h=28223fea78ff04318590bd95348e02c6258008a7;hb=63be20bee256f305801c0674b29e5773355d2379;hp=77ca498cd28ea236782ae28f8597a76b1f5fef67;hpb=b90d6ee54a3dea81da58e6e10640fcd165dfb659;p=sliver-openvswitch.git diff --git a/ofproto/ofproto-provider.h b/ofproto/ofproto-provider.h index 77ca498cd..28223fea7 100644 --- a/ofproto/ofproto-provider.h +++ b/ofproto/ofproto-provider.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2010, 2011, 2012, 2013 Nicira, Inc. + * Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -43,6 +43,7 @@ #include "ofp-util.h" #include "ofproto/ofproto.h" #include "ovs-atomic.h" +#include "ovs-rcu.h" #include "ovs-thread.h" #include "shash.h" #include "simap.h" @@ -374,7 +375,7 @@ struct rule { /* OpenFlow actions. See struct rule_actions for more thread-safety * notes. */ - struct rule_actions *actions OVS_GUARDED; + OVSRCU_TYPE(struct rule_actions *) actions; /* In owning meter's 'rules' list. An empty list if there is no meter. */ struct list meter_list_node OVS_GUARDED_BY(ofproto_mutex); @@ -398,18 +399,16 @@ struct rule { /* Must hold 'mutex' for both read/write, 'ofproto_mutex' not needed. */ long long int modified OVS_GUARDED; /* Time of last modification. */ - - /* XXX: Currently updated by provider without protection. */ - long long int used OVS_GUARDED; /* Last use; time created if never used. */ }; void ofproto_rule_ref(struct rule *); void ofproto_rule_unref(struct rule *); -struct rule_actions *rule_get_actions(const struct rule *rule) - OVS_EXCLUDED(rule->mutex); -struct rule_actions *rule_get_actions__(const struct rule *rule) - OVS_REQUIRES(rule->mutex); +static inline struct rule_actions * +rule_get_actions(const struct rule *rule) +{ + return ovsrcu_get(struct rule_actions *, &rule->actions); +} /* Returns true if 'rule' is an OpenFlow 1.3 "table-miss" rule, false * otherwise. @@ -434,8 +433,6 @@ rule_is_table_miss(const struct rule *rule) * 'rule' is the rule for which 'rule->actions == actions') or that owns a * reference to 'actions->ref_count' (or both). */ struct rule_actions { - struct ovs_refcount ref_count; - /* These members are immutable: they do not change during the struct's * lifetime. */ struct ofpact *ofpacts; /* Sequence of "struct ofpacts". */ @@ -445,8 +442,7 @@ struct rule_actions { 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 *); +void rule_actions_destroy(struct rule_actions *); /* A set of rules to which an OpenFlow operation applies. */ struct rule_collection { @@ -467,14 +463,15 @@ void rule_collection_destroy(struct rule_collection *); * ofproto-dpif implementation. */ extern unsigned ofproto_flow_limit; +/* Maximum idle time (in ms) for flows to be cached in the datapath. + * Revalidators may expire flows more quickly than the configured value based + * on system load and other factors. This variable is subject to change. */ +extern unsigned ofproto_max_idle; + /* Number of upcall handler and revalidator threads. Only affects the * ofproto-dpif implementation. */ extern size_t n_handlers, n_revalidators; -/* Determines which model to use for handling misses in the ofproto-dpif - * implementation */ -extern enum ofproto_flow_miss_model flow_miss_model; - static inline struct rule * rule_from_cls_rule(const struct cls_rule *cls_rule) { @@ -944,8 +941,9 @@ struct ofproto_class { void (*port_reconfigured)(struct ofport *ofport, enum ofputil_port_config old_config); - /* Looks up a port named 'devname' in 'ofproto'. On success, initializes - * '*port' appropriately. + /* Looks up a port named 'devname' in 'ofproto'. On success, returns 0 and + * initializes '*port' appropriately. Otherwise, returns a positive errno + * value. * * The caller owns the data in 'port' and must free it with * ofproto_port_destroy() when it is no longer needed. */ @@ -1287,7 +1285,7 @@ struct ofproto_class { * in '*byte_count'. UINT64_MAX indicates that the packet count or byte * count is unknown. */ void (*rule_get_stats)(struct rule *rule, uint64_t *packet_count, - uint64_t *byte_count) + uint64_t *byte_count, long long int *used) /* OVS_EXCLUDED(ofproto_mutex) */; /* Applies the actions in 'rule' to 'packet'. (This implements sending