]>
Commit | Line | Data |
---|---|---|
a14bc59f | 1 | /* |
d6569377 | 2 | * Copyright (c) 2009, 2010, 2011 Nicira Networks. |
a14bc59f BP |
3 | * Distributed under the terms of the GNU GPL version 2. |
4 | * | |
5 | * Significant portions of this file may be copied from parts of the Linux | |
6 | * kernel, by Linus Torvalds and others. | |
7 | */ | |
8 | ||
064af421 BP |
9 | #ifndef FLOW_H |
10 | #define FLOW_H 1 | |
11 | ||
12 | #include <linux/kernel.h> | |
78d18dbb | 13 | #include <linux/netlink.h> |
064af421 BP |
14 | #include <linux/spinlock.h> |
15 | #include <linux/types.h> | |
16 | #include <linux/rcupdate.h> | |
401eeb92 | 17 | #include <linux/if_ether.h> |
6bfafa55 | 18 | #include <linux/jiffies.h> |
5153ef3d | 19 | #include <linux/time.h> |
064af421 BP |
20 | |
21 | #include "openvswitch/datapath-protocol.h" | |
8d5ebd83 | 22 | #include "table.h" |
064af421 BP |
23 | |
24 | struct sk_buff; | |
25 | ||
26 | struct sw_flow_actions { | |
27 | struct rcu_head rcu; | |
cdee00fd BP |
28 | u32 actions_len; |
29 | struct nlattr actions[]; | |
064af421 BP |
30 | }; |
31 | ||
36956a7d BP |
32 | struct sw_flow_key { |
33 | __be64 tun_id; /* Encapsulating tunnel ID. */ | |
d31f1109 JP |
34 | union { |
35 | struct { | |
36 | __be32 ipv4_src; /* IPv4 source address. */ | |
37 | __be32 ipv4_dst; /* IPv4 destination address. */ | |
38 | }; | |
39 | struct { | |
40 | __be32 ipv6_src[4]; /* IPv6 source address. */ | |
41 | __be32 ipv6_dst[4]; /* IPv6 source address. */ | |
42 | }; | |
43 | }; | |
36956a7d BP |
44 | u16 in_port; /* Input switch port. */ |
45 | __be16 dl_tci; /* 0 if no VLAN, VLAN_TAG_PRESENT set otherwise. */ | |
46 | __be16 dl_type; /* Ethernet frame type. */ | |
47 | __be16 tp_src; /* TCP/UDP source port. */ | |
48 | __be16 tp_dst; /* TCP/UDP destination port. */ | |
49 | u8 dl_src[ETH_ALEN]; /* Ethernet source address. */ | |
50 | u8 dl_dst[ETH_ALEN]; /* Ethernet destination address. */ | |
51 | u8 nw_proto; /* IP protocol or lower 8 bits of ARP opcode. */ | |
52 | u8 nw_tos; /* IP ToS (DSCP field, 6 bits). */ | |
bad68a99 JP |
53 | u8 arp_sha[ETH_ALEN]; /* ARP source hardware address. */ |
54 | u8 arp_tha[ETH_ALEN]; /* ARP target hardware address. */ | |
36956a7d BP |
55 | }; |
56 | ||
064af421 BP |
57 | struct sw_flow { |
58 | struct rcu_head rcu; | |
8d5ebd83 JG |
59 | struct tbl_node tbl_node; |
60 | ||
36956a7d | 61 | struct sw_flow_key key; |
e1040c77 | 62 | struct sw_flow_actions __rcu *sf_acts; |
064af421 | 63 | |
fb8c9347 JG |
64 | atomic_t refcnt; |
65 | bool dead; | |
66 | ||
064af421 | 67 | spinlock_t lock; /* Lock for values below. */ |
6bfafa55 | 68 | unsigned long used; /* Last used time (in jiffies). */ |
064af421 BP |
69 | u64 packet_count; /* Number of packets matched. */ |
70 | u64 byte_count; /* Number of bytes matched. */ | |
71 | u8 tcp_flags; /* Union of seen TCP flags. */ | |
72 | }; | |
73 | ||
401eeb92 BP |
74 | struct arp_eth_header |
75 | { | |
76 | __be16 ar_hrd; /* format of hardware address */ | |
77 | __be16 ar_pro; /* format of protocol address */ | |
78 | unsigned char ar_hln; /* length of hardware address */ | |
79 | unsigned char ar_pln; /* length of protocol address */ | |
80 | __be16 ar_op; /* ARP opcode (command) */ | |
81 | ||
82 | /* Ethernet+IPv4 specific members. */ | |
83 | unsigned char ar_sha[ETH_ALEN]; /* sender hardware address */ | |
84 | unsigned char ar_sip[4]; /* sender IP address */ | |
85 | unsigned char ar_tha[ETH_ALEN]; /* target hardware address */ | |
86 | unsigned char ar_tip[4]; /* target IP address */ | |
961703de | 87 | } __packed; |
401eeb92 | 88 | |
560e8022 JG |
89 | int flow_init(void); |
90 | void flow_exit(void); | |
064af421 | 91 | |
560e8022 | 92 | struct sw_flow *flow_alloc(void); |
064af421 | 93 | void flow_deferred_free(struct sw_flow *); |
560e8022 JG |
94 | void flow_free_tbl(struct tbl_node *); |
95 | ||
37a1300c | 96 | struct sw_flow_actions *flow_actions_alloc(const struct nlattr *); |
064af421 | 97 | void flow_deferred_free_acts(struct sw_flow_actions *); |
560e8022 | 98 | |
fb8c9347 JG |
99 | void flow_hold(struct sw_flow *); |
100 | void flow_put(struct sw_flow *); | |
101 | ||
36956a7d | 102 | int flow_extract(struct sk_buff *, u16 in_port, struct sw_flow_key *, bool *is_frag); |
064af421 | 103 | void flow_used(struct sw_flow *, struct sk_buff *); |
ec58547a | 104 | u64 flow_used_time(unsigned long flow_jiffies); |
064af421 | 105 | |
36956a7d | 106 | u32 flow_hash(const struct sw_flow_key *); |
8d5ebd83 | 107 | int flow_cmp(const struct tbl_node *, void *target); |
064af421 | 108 | |
36956a7d BP |
109 | /* By my calculations currently the longest valid nlattr-formatted flow key is |
110 | * 80 bytes long, so this leaves some safety margin. | |
111 | */ | |
112 | #define FLOW_BUFSIZE 96 | |
113 | ||
d6569377 BP |
114 | int flow_to_nlattrs(const struct sw_flow_key *, struct sk_buff *); |
115 | int flow_from_nlattrs(struct sw_flow_key *swkey, const struct nlattr *); | |
36956a7d | 116 | |
9d209493 BP |
117 | static inline struct sw_flow *flow_cast(const struct tbl_node *node) |
118 | { | |
119 | return container_of(node, struct sw_flow, tbl_node); | |
120 | } | |
121 | ||
064af421 | 122 | #endif /* flow.h */ |