X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=datapath%2Fdatapath.h;h=64920de9b309936546c442e02877f65e86ebf731;hb=8e04c6e10c28e42c715eb9fef749554c123bddbc;hp=ee40d8f45fd1fb7f8dfa20c310e22a976a7b6f2b;hpb=9872172a0a87c6e8300813de613b9267a73f0547;p=sliver-openvswitch.git diff --git a/datapath/datapath.h b/datapath/datapath.h index ee40d8f45..64920de9b 100644 --- a/datapath/datapath.h +++ b/datapath/datapath.h @@ -26,10 +26,9 @@ #include #include -#include "checksum.h" #include "compat.h" #include "flow.h" -#include "tunnel.h" +#include "flow_table.h" #include "vlan.h" #include "vport.h" @@ -61,9 +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. - * @table: Current flow table. Protected by genl_lock and RCU. + * @table: flow table. * @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. * @@ -75,7 +74,7 @@ struct datapath { struct list_head list_node; /* Flow table. */ - struct flow_table __rcu *table; + struct flow_table table; /* Switch ports. */ struct hlist_head *ports; @@ -92,26 +91,14 @@ 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 - * kernel versions. - * @csum_start: Stores the offset from which to start checksumming independent - * of the transport header on all kernel versions. - * packet was not received on a tunnel. - * @vlan_tci: Provides a substitute for the skb->vlan_tci field on kernels - * before 2.6.27. */ 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; - u16 csum_start; -#endif -#ifdef NEED_VLAN_FIELD - u16 vlan_tci; -#endif }; #define OVS_CB(skb) ((struct ovs_skb_cb *)(skb)->cb) @@ -141,9 +128,22 @@ 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 +163,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 +188,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 */