X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=datapath%2Fdatapath.h;h=91c8e1e23f12d8ed7c069f9fdfb98d0627510a96;hb=9fe3b9a2eeace9689def807e78e35c79e4b1814b;hp=36accfdf6a25a04ab4af138ca6f5091bd58cce82;hpb=c3827f619a38d3d202020838e1f92860046a3dbe;p=openvswitch diff --git a/datapath/datapath.h b/datapath/datapath.h index 36accfdf..91c8e1e2 100644 --- a/datapath/datapath.h +++ b/datapath/datapath.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2010 Nicira Networks. + * Copyright (c) 2009, 2010, 2011 Nicira Networks. * Distributed under the terms of the GNU GPL version 2. * * Significant portions of this file may be copied from parts of the Linux @@ -19,11 +19,12 @@ #include #include #include + +#include "checksum.h" #include "flow.h" #include "dp_sysfs.h" struct vport; -struct dp_port; /* Mask for the priority bits in a vlan header. If we ever merge upstream * then this should go into include/linux/if_vlan.h. */ @@ -58,6 +59,7 @@ struct dp_stats_percpu { /** * struct datapath - datapath for flow-based packet switching + * @rcu: RCU callback head for deferred destruction. * @mutex: Mutual exclusion for ioctls. * @dp_idx: Datapath number (index into the dps[] array in datapath.c). * @ifobj: Represents /sys/class/net//brif. @@ -65,9 +67,9 @@ struct dp_stats_percpu { * @queues: %DP_N_QUEUES sets of queued packets for userspace to handle. * @waitqueue: Waitqueue, for waiting for new packets in @queues. * @n_flows: Number of flows currently in flow table. - * @table: Current flow table (RCU protected). + * @table: Current flow table. * @n_ports: Number of ports currently in @ports. - * @ports: Map from port number to &struct dp_port. %ODPP_LOCAL port + * @ports: Map from port number to &struct vport. %ODPP_LOCAL port * always exists, other ports may be %NULL. * @port_list: List of all ports in @ports in arbitrary order. * @stats_percpu: Per-CPU datapath statistics. @@ -76,6 +78,7 @@ struct dp_stats_percpu { * sampling a given packet. */ struct datapath { + struct rcu_head rcu; struct mutex mutex; int dp_idx; struct kobject ifobj; @@ -87,90 +90,67 @@ struct datapath { wait_queue_head_t waitqueue; /* Flow table. */ - struct tbl *table; + struct tbl __rcu *table; /* Switch ports. */ unsigned int n_ports; - struct dp_port *ports[DP_MAX_PORTS]; + struct vport __rcu *ports[DP_MAX_PORTS]; struct list_head port_list; /* Stats. */ - struct dp_stats_percpu *stats_percpu; + struct dp_stats_percpu __percpu *stats_percpu; /* sFlow Sampling */ unsigned int sflow_probability; }; -/** - * struct dp_port - one port within a datapath - * @port_no: Index into @dp's @ports array. - * @dp: Datapath to which this port belongs. - * @vport: The network device attached to this port. The contents depends on - * the device and should be accessed only through the vport_* functions. - * @kobj: Represents /sys/class/net//brport. - * @linkname: The name of the link from /sys/class/net//brif to this - * &struct dp_port. (We keep this around so that we can delete it if the - * device gets renamed.) Set to the null string when no link exists. - * @node: Element in @dp's @port_list. - * @sflow_pool: Number of packets that were candidates for sFlow sampling, - * regardless of whether they were actually chosen and sent down to userspace. - */ -struct dp_port { - u16 port_no; - struct datapath *dp; - struct vport *vport; - struct kobject kobj; - char linkname[IFNAMSIZ]; - struct list_head node; - atomic_t sflow_pool; -}; - -enum csum_type { - OVS_CSUM_NONE = 0, - OVS_CSUM_UNNECESSARY = 1, - OVS_CSUM_COMPLETE = 2, - OVS_CSUM_PARTIAL = 3, -}; - /** * struct ovs_skb_cb - OVS data in skb CB - * @dp_port: The datapath port on which the skb entered the switch. + * @vport: The datapath port on which the skb entered the switch. * @flow: The flow associated with this packet. May be %NULL if no flow. * @ip_summed: Consistently stores L4 checksumming status across different * kernel versions. - * @tun_id: ID (in network byte order) of the tunnel that encapsulated this - * packet. It is 0 if the packet was not received on a tunnel. + * @tun_id: ID of the tunnel that encapsulated this packet. It is 0 if the + * packet was not received on a tunnel. */ struct ovs_skb_cb { - struct dp_port *dp_port; + struct vport *vport; struct sw_flow *flow; +#ifdef NEED_CSUM_NORMALIZE enum csum_type ip_summed; - __be32 tun_id; +#endif + __be64 tun_id; }; #define OVS_CB(skb) ((struct ovs_skb_cb *)(skb)->cb) +/** + * struct dp_upcall - metadata to include with a packet to send to userspace + * @type: One of %_ODPL_*_NR. + * @key: Becomes %ODP_PACKET_ATTR_KEY. Must be nonnull. + * @userdata: Becomes %ODP_PACKET_ATTR_USERDATA if nonzero. + * @sample_pool: Becomes %ODP_PACKET_ATTR_SAMPLE_POOL if nonzero. + * @actions: Becomes %ODP_PACKET_ATTR_ACTIONS if nonnull. + * @actions_len: Number of bytes in @actions. +*/ +struct dp_upcall_info { + u32 type; + const struct sw_flow_key *key; + u64 userdata; + u32 sample_pool; + const struct nlattr *actions; + u32 actions_len; +}; + extern struct notifier_block dp_device_notifier; extern int (*dp_ioctl_hook)(struct net_device *dev, struct ifreq *rq, int cmd); -void dp_process_received_packet(struct dp_port *, struct sk_buff *); -int dp_detach_port(struct dp_port *); -int dp_output_control(struct datapath *, struct sk_buff *, int, u32 arg); +void dp_process_received_packet(struct vport *, struct sk_buff *); +int dp_detach_port(struct vport *); +int dp_upcall(struct datapath *, struct sk_buff *, const struct dp_upcall_info *); int dp_min_mtu(const struct datapath *dp); void set_internal_devs_mtu(const struct datapath *dp); struct datapath *get_dp(int dp_idx); const char *dp_name(const struct datapath *dp); -#if defined(CONFIG_XEN) && defined(HAVE_PROTO_DATA_VALID) -int vswitch_skb_checksum_setup(struct sk_buff *skb); -#else -static inline int vswitch_skb_checksum_setup(struct sk_buff *skb) -{ - return 0; -} -#endif - -void compute_ip_summed(struct sk_buff *skb, bool xmit); -void forward_ip_summed(struct sk_buff *skb); - #endif /* datapath.h */