]> git.proxmox.com Git - ovs.git/blame - datapath/datapath.h
vlog: Change the default timestamp structure.
[ovs.git] / datapath / datapath.h
CommitLineData
a14bc59f 1/*
a9a29d22 2 * Copyright (c) 2007-2011 Nicira Networks.
a14bc59f 3 *
a9a29d22
JG
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of version 2 of the GNU General Public
6 * License as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
16 * 02110-1301, USA
a14bc59f
BP
17 */
18
064af421
BP
19#ifndef DATAPATH_H
20#define DATAPATH_H 1
21
22#include <asm/page.h>
23#include <linux/kernel.h>
24#include <linux/mutex.h>
064af421 25#include <linux/netdevice.h>
064af421 26#include <linux/skbuff.h>
821cb9fa 27#include <linux/u64_stats_sync.h>
dd8d6b8c
JG
28
29#include "checksum.h"
9cb8d24d 30#include "compat.h"
064af421 31#include "flow.h"
2ba9026e 32#include "dp_sysfs.h"
6e0ce48e 33#include "vlan.h"
064af421 34
f2459fe7 35struct vport;
f2459fe7 36
5eab9abc 37#define DP_MAX_PORTS 1024
6ff686f2
PS
38#define SAMPLE_ACTION_DEPTH 3
39
67a78abe
BP
40/**
41 * struct dp_stats_percpu - per-cpu packet processing statistics for a given
42 * datapath.
67a78abe
BP
43 * @n_hit: Number of received packets for which a matching flow was found in
44 * the flow table.
45 * @n_miss: Number of received packets that had no matching flow in the flow
46 * table. The sum of @n_hit and @n_miss is the number of packets that have
47 * been received by the datapath.
48 * @n_lost: Number of received packets that had no matching flow in the flow
49 * table that could not be sent to userspace (normally due to an overflow in
50 * one of the datapath's queues).
67a78abe 51 */
064af421 52struct dp_stats_percpu {
064af421
BP
53 u64 n_hit;
54 u64 n_missed;
55 u64 n_lost;
821cb9fa 56 struct u64_stats_sync sync;
064af421
BP
57};
58
72b06300
BP
59/**
60 * struct datapath - datapath for flow-based packet switching
46c6a11d 61 * @rcu: RCU callback head for deferred destruction.
254f2dc8 62 * @list_node: Element in global 'dps' list.
ed099e92 63 * @ifobj: Represents /sys/class/net/<devname>/brif. Protected by RTNL.
72b06300 64 * @n_flows: Number of flows currently in flow table.
ed099e92 65 * @table: Current flow table. Protected by genl_lock and RCU.
df2c07f4 66 * @ports: Map from port number to &struct vport. %OVSP_LOCAL port
ed099e92
BP
67 * always exists, other ports may be %NULL. Protected by RTNL and RCU.
68 * @port_list: List of all ports in @ports in arbitrary order. RTNL required
69 * to iterate or modify.
72b06300 70 * @stats_percpu: Per-CPU datapath statistics.
ed099e92
BP
71 *
72 * Context: See the comment on locking at the top of datapath.c for additional
73 * locking information.
72b06300 74 */
064af421 75struct datapath {
46c6a11d 76 struct rcu_head rcu;
254f2dc8 77 struct list_head list_node;
064af421 78 struct kobject ifobj;
064af421 79
064af421 80 /* Flow table. */
3544358a 81 struct flow_table __rcu *table;
064af421 82
064af421 83 /* Switch ports. */
e1040c77 84 struct vport __rcu *ports[DP_MAX_PORTS];
72b06300 85 struct list_head port_list;
064af421
BP
86
87 /* Stats. */
d3097eff 88 struct dp_stats_percpu __percpu *stats_percpu;
064af421
BP
89};
90
a063b0df
JG
91/**
92 * struct ovs_skb_cb - OVS data in skb CB
3976f6d5 93 * @flow: The flow associated with this packet. May be %NULL if no flow.
c3729ee4 94 * @tun_id: ID of the tunnel that encapsulated this packet. It is 0 if the
a063b0df
JG
95 * @ip_summed: Consistently stores L4 checksumming status across different
96 * kernel versions.
c3729ee4
JG
97 * @csum_start: Stores the offset from which to start checksumming independent
98 * of the transport header on all kernel versions.
b9298d3f 99 * packet was not received on a tunnel.
6e0ce48e
JG
100 * @vlan_tci: Provides a substitute for the skb->vlan_tci field on kernels
101 * before 2.6.27.
a063b0df
JG
102 */
103struct ovs_skb_cb {
3976f6d5 104 struct sw_flow *flow;
c3729ee4 105 __be64 tun_id;
dd8d6b8c 106#ifdef NEED_CSUM_NORMALIZE
659586ef 107 enum csum_type ip_summed;
c3729ee4 108 u16 csum_start;
dd8d6b8c 109#endif
6e0ce48e
JG
110#ifdef NEED_VLAN_FIELD
111 u16 vlan_tci;
112#endif
a063b0df
JG
113};
114#define OVS_CB(skb) ((struct ovs_skb_cb *)(skb)->cb)
115
856081f6
BP
116/**
117 * struct dp_upcall - metadata to include with a packet to send to userspace
df2c07f4
JP
118 * @cmd: One of %OVS_PACKET_CMD_*.
119 * @key: Becomes %OVS_PACKET_ATTR_KEY. Must be nonnull.
98403001
BP
120 * @userdata: If nonnull, its u64 value is extracted and passed to userspace as
121 * %OVS_PACKET_ATTR_USERDATA.
122 * @pid: Netlink PID to which packet should be sent. If @pid is 0 then no
123 * packet is sent and the packet is accounted in the datapath's @n_lost
124 * counter.
6ff686f2 125 */
856081f6 126struct dp_upcall_info {
982b8810 127 u8 cmd;
856081f6 128 const struct sw_flow_key *key;
98403001
BP
129 const struct nlattr *userdata;
130 u32 pid;
856081f6
BP
131};
132
850b6b3b
JG
133extern struct notifier_block ovs_dp_device_notifier;
134extern struct genl_multicast_group ovs_dp_vport_multicast_group;
135extern int (*ovs_dp_ioctl_hook)(struct net_device *dev, struct ifreq *rq, int cmd);
064af421 136
850b6b3b
JG
137void ovs_dp_process_received_packet(struct vport *, struct sk_buff *);
138void ovs_dp_detach_port(struct vport *);
139int ovs_dp_upcall(struct datapath *, struct sk_buff *,
140 const struct dp_upcall_info *);
064af421 141
850b6b3b 142const char *ovs_dp_name(const struct datapath *dp);
f14d8083
EJ
143struct sk_buff *ovs_vport_cmd_build_info(struct vport *, u32 pid, u32 seq,
144 u8 cmd);
064af421 145
850b6b3b 146int ovs_execute_actions(struct datapath *dp, struct sk_buff *skb);
064af421 147#endif /* datapath.h */