X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=datapath%2Fdatapath.h;h=064211dbccf0f3766e29464a82498039c79f2382;hb=a91da17ea6f910863c2a771ebfa4100bbad3f481;hp=01e729605b2bd7b7139fbf2b6cda66ae1540d876;hpb=09538fdc5765afad5c5419483e688d1de4fd5aea;p=sliver-openvswitch.git diff --git a/datapath/datapath.h b/datapath/datapath.h index 01e729605..064211dbc 100644 --- a/datapath/datapath.h +++ b/datapath/datapath.h @@ -29,7 +29,6 @@ #include "checksum.h" #include "compat.h" #include "flow.h" -#include "tunnel.h" #include "vlan.h" #include "vport.h" @@ -61,10 +60,9 @@ struct dp_stats_percpu { * struct datapath - datapath for flow-based packet switching * @rcu: RCU callback head for deferred destruction. * @list_node: Element in global 'dps' list. - * @n_flows: Number of flows currently in flow table. - * @table: Current flow table. Protected by genl_lock and RCU. + * @table: Current flow table. Protected by ovs_mutex and RCU. * @ports: Hash table for ports. %OVSP_LOCAL port always exists. Protected by - * RTNL and RCU. + * ovs_mutex and RCU. * @stats_percpu: Per-CPU datapath statistics. * @net: Reference to net namespace. * @@ -93,6 +91,7 @@ struct datapath { /** * struct ovs_skb_cb - OVS data in skb CB * @flow: The flow associated with this packet. May be %NULL if no flow. + * @pkt_key: The flow information extracted from the packet. Must be nonnull. * @tun_key: Key for the tunnel that encapsulated this packet. NULL if the * packet is not being tunneled. * @ip_summed: Consistently stores L4 checksumming status across different @@ -105,6 +104,7 @@ struct datapath { */ struct ovs_skb_cb { struct sw_flow *flow; + struct sw_flow_key *pkt_key; struct ovs_key_ipv4_tunnel *tun_key; #ifdef NEED_CSUM_NORMALIZE enum csum_type ip_summed; @@ -141,9 +141,23 @@ struct dp_upcall_info { */ struct ovs_net { struct list_head dps; + struct vport_net vport_net; + struct work_struct dp_notify_work; }; extern int ovs_net_id; +void ovs_lock(void); +void ovs_unlock(void); + +#ifdef CONFIG_LOCKDEP +int lockdep_ovsl_is_held(void); +#else +#define lockdep_ovsl_is_held() 1 +#endif + +#define ASSERT_OVSL() WARN_ON(unlikely(!lockdep_ovsl_is_held())) +#define ovsl_dereference(p) \ + rcu_dereference_protected(p, lockdep_ovsl_is_held()) static inline struct net *ovs_dp_get_net(struct datapath *dp) { @@ -163,15 +177,15 @@ static inline struct vport *ovs_vport_rcu(const struct datapath *dp, int port_no return ovs_lookup_vport(dp, port_no); } -static inline struct vport *ovs_vport_rtnl_rcu(const struct datapath *dp, int port_no) +static inline struct vport *ovs_vport_ovsl_rcu(const struct datapath *dp, int port_no) { - WARN_ON_ONCE(!rcu_read_lock_held() && !rtnl_is_locked()); + WARN_ON_ONCE(!rcu_read_lock_held() && !lockdep_ovsl_is_held()); return ovs_lookup_vport(dp, port_no); } -static inline struct vport *ovs_vport_rtnl(const struct datapath *dp, int port_no) +static inline struct vport *ovs_vport_ovsl(const struct datapath *dp, int port_no) { - ASSERT_RTNL(); + ASSERT_OVSL(); return ovs_lookup_vport(dp, port_no); } @@ -188,4 +202,9 @@ struct sk_buff *ovs_vport_cmd_build_info(struct vport *, u32 portid, u32 seq, u8 cmd); int ovs_execute_actions(struct datapath *dp, struct sk_buff *skb); +void ovs_dp_notify_wq(struct work_struct *work); + +#define OVS_NLERR(fmt, ...) \ + pr_info_once("netlink: " fmt, ##__VA_ARGS__) + #endif /* datapath.h */