X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=ofproto%2Fofproto-dpif.h;h=88593ce3df56526e4b2502409430bf83022e019e;hb=7aaeab4df24b7e9460705b1dad1010eef0354c50;hp=084f3c1c0c1b88ffcc3e7bbcae10640490286712;hpb=ec7ceaed4f3e03a3e59056a3a82a08886c328ce8;p=sliver-openvswitch.git diff --git a/ofproto/ofproto-dpif.h b/ofproto/ofproto-dpif.h index 084f3c1c0..88593ce3d 100644 --- a/ofproto/ofproto-dpif.h +++ b/ofproto/ofproto-dpif.h @@ -19,16 +19,14 @@ #include "hmapx.h" #include "ofproto/ofproto-provider.h" -#include "tag.h" +#include "ovs-thread.h" #include "timer.h" #include "util.h" union user_action_cookie; - -/* Number of implemented OpenFlow tables. */ -enum { N_TABLES = 255 }; -enum { TBL_INTERNAL = N_TABLES - 1 }; /* Used for internal hidden rules. */ -BUILD_ASSERT_DECL(N_TABLES >= 2 && N_TABLES <= 255); +struct ofproto_dpif; +struct ofport_dpif; +struct dpif_backer; struct rule_dpif { struct rule up; @@ -46,126 +44,9 @@ struct rule_dpif { * packet_count or byte_count member or that can be obtained from the * datapath by, e.g., dpif_flow_get() for any subfacet. */ - uint64_t packet_count; /* Number of packets received. */ - uint64_t byte_count; /* Number of bytes received. */ - - tag_type tag; /* Caches rule_calculate_tag() result. */ - - struct list facets; /* List of "struct facet"s. */ -}; - -/* Extra information about a classifier table. - * Currently used just for optimized flow revalidation. */ -struct table_dpif { - /* If either of these is nonnull, then this table has a form that allows - * flows to be tagged to avoid revalidating most flows for the most common - * kinds of flow table changes. */ - struct cls_table *catchall_table; /* Table that wildcards all fields. */ - struct cls_table *other_table; /* Table with any other wildcard set. */ - uint32_t basis; /* Keeps each table's tags separate. */ -}; - -struct ofproto_dpif { - struct hmap_node all_ofproto_dpifs_node; /* In 'all_ofproto_dpifs'. */ - struct ofproto up; - struct dpif_backer *backer; - - /* Special OpenFlow rules. */ - struct rule_dpif *miss_rule; /* Sends flow table misses to controller. */ - struct rule_dpif *no_packet_in_rule; /* Drops flow table misses. */ - struct rule_dpif *drop_frags_rule; /* Used in OFPC_FRAG_DROP mode. */ - - /* Bridging. */ - struct netflow *netflow; - struct dpif_sflow *sflow; - struct dpif_ipfix *ipfix; - struct hmap bundles; /* Contains "struct ofbundle"s. */ - struct mac_learning *ml; - bool has_bonded_bundles; - struct mbridge *mbridge; - - /* Facets. */ - struct classifier facets; /* Contains 'struct facet's. */ - long long int consistency_rl; - - /* Revalidation. */ - struct table_dpif tables[N_TABLES]; - - /* Support for debugging async flow mods. */ - struct list completions; - - struct netdev_stats stats; /* To account packets generated and consumed in - * userspace. */ - - /* Spanning tree. */ - struct stp *stp; - long long int stp_last_tick; - - /* VLAN splinters. */ - struct hmap realdev_vid_map; /* (realdev,vid) -> vlandev. */ - struct hmap vlandev_map; /* vlandev -> (realdev,vid). */ - - /* Ports. */ - struct sset ports; /* Set of standard port names. */ - struct sset ghost_ports; /* Ports with no datapath port. */ - struct sset port_poll_set; /* Queued names for port_poll() reply. */ - int port_poll_errno; /* Last errno for port_poll() reply. */ - - /* Per ofproto's dpif stats. */ - uint64_t n_hit; - uint64_t n_missed; -}; - -struct ofport_dpif { - struct hmap_node odp_port_node; /* In dpif_backer's "odp_to_ofport_map". */ - struct ofport up; - - odp_port_t odp_port; - struct ofbundle *bundle; /* Bundle that contains this port, if any. */ - struct list bundle_node; /* In struct ofbundle's "ports" list. */ - struct cfm *cfm; /* Connectivity Fault Management, if any. */ - struct bfd *bfd; /* BFD, if any. */ - tag_type tag; /* Tag associated with this port. */ - bool may_enable; /* May be enabled in bonds. */ - bool is_tunnel; /* This port is a tunnel. */ - long long int carrier_seq; /* Carrier status changes. */ - struct ofport_dpif *peer; /* Peer if patch port. */ - - /* Spanning tree. */ - struct stp_port *stp_port; /* Spanning Tree Protocol, if any. */ - enum stp_state stp_state; /* Always STP_DISABLED if STP not in use. */ - long long int stp_state_entered; - - struct hmap priorities; /* Map of attached 'priority_to_dscp's. */ - - /* Linux VLAN device support (e.g. "eth0.10" for VLAN 10.) - * - * This is deprecated. It is only for compatibility with broken device - * drivers in old versions of Linux that do not properly support VLANs when - * VLAN devices are not used. When broken device drivers are no longer in - * widespread use, we will delete these interfaces. */ - ofp_port_t realdev_ofp_port; - int vlandev_vid; -}; - -struct ofbundle { - struct hmap_node hmap_node; /* In struct ofproto's "bundles" hmap. */ - struct ofproto_dpif *ofproto; /* Owning ofproto. */ - void *aux; /* Key supplied by ofproto's client. */ - char *name; /* Identifier for log messages. */ - - /* Configuration. */ - struct list ports; /* Contains "struct ofport"s. */ - enum port_vlan_mode vlan_mode; /* VLAN mode */ - int vlan; /* -1=trunk port, else a 12-bit VLAN ID. */ - unsigned long *trunks; /* Bitmap of trunked VLANs, if 'vlan' == -1. - * NULL if all VLANs are trunked. */ - struct lacp *lacp; /* LACP if LACP is enabled, otherwise NULL. */ - struct bond *bond; /* Nonnull iff more than one port. */ - bool use_priority_tags; /* Use 802.1p tag for frames in VLAN 0? */ - - /* Status. */ - bool floodable; /* True if no port has OFPUTIL_PC_NO_FLOOD set. */ + struct ovs_mutex stats_mutex; + uint64_t packet_count OVS_GUARDED; /* Number of packets received. */ + uint64_t byte_count OVS_GUARDED; /* Number of bytes received. */ }; static inline struct rule_dpif *rule_dpif_cast(const struct rule *rule) @@ -173,63 +54,26 @@ static inline struct rule_dpif *rule_dpif_cast(const struct rule *rule) return rule ? CONTAINER_OF(rule, struct rule_dpif, up) : NULL; } -static inline struct ofproto_dpif * -ofproto_dpif_cast(const struct ofproto *ofproto) -{ - ovs_assert(ofproto->ofproto_class == &ofproto_dpif_class); - return CONTAINER_OF(ofproto, struct ofproto_dpif, up); -} - -static inline struct ofport_dpif * -ofbundle_get_a_port(const struct ofbundle *bundle) -{ - return CONTAINER_OF(list_front(&bundle->ports), struct ofport_dpif, - bundle_node); -} - -struct ofport_dpif *get_ofp_port(const struct ofproto_dpif *, - ofp_port_t ofp_port); - -struct ofport_dpif *get_odp_port(const struct ofproto_dpif *, - odp_port_t odp_port); - -odp_port_t ofp_port_to_odp_port(const struct ofproto_dpif *, - ofp_port_t ofp_port); - struct rule_dpif *rule_dpif_lookup_in_table(struct ofproto_dpif *, const struct flow *, struct flow_wildcards *, uint8_t table_id); -tag_type rule_calculate_tag(const struct flow *flow, const struct minimask *, - uint32_t secret); - struct rule_dpif *rule_dpif_miss_rule(struct ofproto_dpif *ofproto, const struct flow *); void rule_credit_stats(struct rule_dpif *, const struct dpif_flow_stats *); -void ofproto_trace(struct ofproto_dpif *, const struct flow *, - const struct ofpbuf *packet, struct ds *); - -size_t put_userspace_action(const struct ofproto_dpif *, - struct ofpbuf *odp_actions, const struct flow *, - const union user_action_cookie *, - const size_t cookie_size); - -bool stp_should_process_flow(const struct flow *, struct flow_wildcards *); -void stp_process_packet(const struct ofport_dpif *, - const struct ofpbuf *packet); - +bool ofproto_has_vlan_splinters(const struct ofproto_dpif *); ofp_port_t vsp_realdev_to_vlandev(const struct ofproto_dpif *, ofp_port_t realdev_ofp_port, ovs_be16 vlan_tci); +bool vsp_adjust_flow(const struct ofproto_dpif *, struct flow *); + +void ofproto_dpif_send_packet_in(struct ofproto_dpif *, + struct ofputil_packet_in *pin); +void ofproto_dpif_flow_mod(struct ofproto_dpif *, struct ofputil_flow_mod *); -bool ofproto_dpif_dscp_from_priority(const struct ofport_dpif *, - uint32_t priority, uint8_t *dscp); -int ofproto_dpif_queue_to_priority(const struct ofproto_dpif *, - uint32_t queue_id, uint32_t *priority); -tag_type calculate_flow_tag(struct ofproto_dpif *, const struct flow *, - uint8_t table_id, struct rule_dpif *); +struct ofport_dpif *odp_port_to_ofport(const struct dpif_backer *, odp_port_t); #endif /* ofproto-dpif.h */