flow_dissector.h 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef _NET_FLOW_DISSECTOR_H
  3. #define _NET_FLOW_DISSECTOR_H
  4. #include <linux/types.h>
  5. #include <linux/in6.h>
  6. #include <uapi/linux/if_ether.h>
  7. /**
  8. * struct flow_dissector_key_control:
  9. * @thoff: Transport header offset
  10. */
  11. struct flow_dissector_key_control {
  12. u16 thoff;
  13. u16 addr_type;
  14. u32 flags;
  15. };
  16. #define FLOW_DIS_IS_FRAGMENT BIT(0)
  17. #define FLOW_DIS_FIRST_FRAG BIT(1)
  18. #define FLOW_DIS_ENCAPSULATION BIT(2)
  19. enum flow_dissect_ret {
  20. FLOW_DISSECT_RET_OUT_GOOD,
  21. FLOW_DISSECT_RET_OUT_BAD,
  22. FLOW_DISSECT_RET_PROTO_AGAIN,
  23. FLOW_DISSECT_RET_IPPROTO_AGAIN,
  24. FLOW_DISSECT_RET_CONTINUE,
  25. };
  26. /**
  27. * struct flow_dissector_key_basic:
  28. * @thoff: Transport header offset
  29. * @n_proto: Network header protocol (eg. IPv4/IPv6)
  30. * @ip_proto: Transport header protocol (eg. TCP/UDP)
  31. */
  32. struct flow_dissector_key_basic {
  33. __be16 n_proto;
  34. u8 ip_proto;
  35. u8 padding;
  36. };
  37. struct flow_dissector_key_tags {
  38. u32 flow_label;
  39. };
  40. struct flow_dissector_key_vlan {
  41. u16 vlan_id:12,
  42. vlan_priority:3;
  43. u16 padding;
  44. };
  45. struct flow_dissector_key_mpls {
  46. u32 mpls_ttl:8,
  47. mpls_bos:1,
  48. mpls_tc:3,
  49. mpls_label:20;
  50. };
  51. struct flow_dissector_key_keyid {
  52. __be32 keyid;
  53. };
  54. /**
  55. * struct flow_dissector_key_ipv4_addrs:
  56. * @src: source ip address
  57. * @dst: destination ip address
  58. */
  59. struct flow_dissector_key_ipv4_addrs {
  60. /* (src,dst) must be grouped, in the same way than in IP header */
  61. __be32 src;
  62. __be32 dst;
  63. };
  64. /**
  65. * struct flow_dissector_key_ipv6_addrs:
  66. * @src: source ip address
  67. * @dst: destination ip address
  68. */
  69. struct flow_dissector_key_ipv6_addrs {
  70. /* (src,dst) must be grouped, in the same way than in IP header */
  71. struct in6_addr src;
  72. struct in6_addr dst;
  73. };
  74. /**
  75. * struct flow_dissector_key_tipc:
  76. * @key: source node address combined with selector
  77. */
  78. struct flow_dissector_key_tipc {
  79. __be32 key;
  80. };
  81. /**
  82. * struct flow_dissector_key_addrs:
  83. * @v4addrs: IPv4 addresses
  84. * @v6addrs: IPv6 addresses
  85. */
  86. struct flow_dissector_key_addrs {
  87. union {
  88. struct flow_dissector_key_ipv4_addrs v4addrs;
  89. struct flow_dissector_key_ipv6_addrs v6addrs;
  90. struct flow_dissector_key_tipc tipckey;
  91. };
  92. };
  93. /**
  94. * flow_dissector_key_arp:
  95. * @ports: Operation, source and target addresses for an ARP header
  96. * for Ethernet hardware addresses and IPv4 protocol addresses
  97. * sip: Sender IP address
  98. * tip: Target IP address
  99. * op: Operation
  100. * sha: Sender hardware address
  101. * tpa: Target hardware address
  102. */
  103. struct flow_dissector_key_arp {
  104. __u32 sip;
  105. __u32 tip;
  106. __u8 op;
  107. unsigned char sha[ETH_ALEN];
  108. unsigned char tha[ETH_ALEN];
  109. };
  110. /**
  111. * flow_dissector_key_tp_ports:
  112. * @ports: port numbers of Transport header
  113. * src: source port number
  114. * dst: destination port number
  115. */
  116. struct flow_dissector_key_ports {
  117. union {
  118. __be32 ports;
  119. struct {
  120. __be16 src;
  121. __be16 dst;
  122. };
  123. };
  124. };
  125. /**
  126. * flow_dissector_key_icmp:
  127. * @ports: type and code of ICMP header
  128. * icmp: ICMP type (high) and code (low)
  129. * type: ICMP type
  130. * code: ICMP code
  131. */
  132. struct flow_dissector_key_icmp {
  133. union {
  134. __be16 icmp;
  135. struct {
  136. u8 type;
  137. u8 code;
  138. };
  139. };
  140. };
  141. /**
  142. * struct flow_dissector_key_eth_addrs:
  143. * @src: source Ethernet address
  144. * @dst: destination Ethernet address
  145. */
  146. struct flow_dissector_key_eth_addrs {
  147. /* (dst,src) must be grouped, in the same way than in ETH header */
  148. unsigned char dst[ETH_ALEN];
  149. unsigned char src[ETH_ALEN];
  150. };
  151. /**
  152. * struct flow_dissector_key_tcp:
  153. * @flags: flags
  154. */
  155. struct flow_dissector_key_tcp {
  156. __be16 flags;
  157. };
  158. /**
  159. * struct flow_dissector_key_ip:
  160. * @tos: tos
  161. * @ttl: ttl
  162. */
  163. struct flow_dissector_key_ip {
  164. __u8 tos;
  165. __u8 ttl;
  166. };
  167. enum flow_dissector_key_id {
  168. FLOW_DISSECTOR_KEY_CONTROL, /* struct flow_dissector_key_control */
  169. FLOW_DISSECTOR_KEY_BASIC, /* struct flow_dissector_key_basic */
  170. FLOW_DISSECTOR_KEY_IPV4_ADDRS, /* struct flow_dissector_key_ipv4_addrs */
  171. FLOW_DISSECTOR_KEY_IPV6_ADDRS, /* struct flow_dissector_key_ipv6_addrs */
  172. FLOW_DISSECTOR_KEY_PORTS, /* struct flow_dissector_key_ports */
  173. FLOW_DISSECTOR_KEY_ICMP, /* struct flow_dissector_key_icmp */
  174. FLOW_DISSECTOR_KEY_ETH_ADDRS, /* struct flow_dissector_key_eth_addrs */
  175. FLOW_DISSECTOR_KEY_TIPC, /* struct flow_dissector_key_tipc */
  176. FLOW_DISSECTOR_KEY_ARP, /* struct flow_dissector_key_arp */
  177. FLOW_DISSECTOR_KEY_VLAN, /* struct flow_dissector_key_flow_vlan */
  178. FLOW_DISSECTOR_KEY_FLOW_LABEL, /* struct flow_dissector_key_flow_tags */
  179. FLOW_DISSECTOR_KEY_GRE_KEYID, /* struct flow_dissector_key_keyid */
  180. FLOW_DISSECTOR_KEY_MPLS_ENTROPY, /* struct flow_dissector_key_keyid */
  181. FLOW_DISSECTOR_KEY_ENC_KEYID, /* struct flow_dissector_key_keyid */
  182. FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS, /* struct flow_dissector_key_ipv4_addrs */
  183. FLOW_DISSECTOR_KEY_ENC_IPV6_ADDRS, /* struct flow_dissector_key_ipv6_addrs */
  184. FLOW_DISSECTOR_KEY_ENC_CONTROL, /* struct flow_dissector_key_control */
  185. FLOW_DISSECTOR_KEY_ENC_PORTS, /* struct flow_dissector_key_ports */
  186. FLOW_DISSECTOR_KEY_MPLS, /* struct flow_dissector_key_mpls */
  187. FLOW_DISSECTOR_KEY_TCP, /* struct flow_dissector_key_tcp */
  188. FLOW_DISSECTOR_KEY_IP, /* struct flow_dissector_key_ip */
  189. FLOW_DISSECTOR_KEY_MAX,
  190. };
  191. #define FLOW_DISSECTOR_F_PARSE_1ST_FRAG BIT(0)
  192. #define FLOW_DISSECTOR_F_STOP_AT_L3 BIT(1)
  193. #define FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL BIT(2)
  194. #define FLOW_DISSECTOR_F_STOP_AT_ENCAP BIT(3)
  195. struct flow_dissector_key {
  196. enum flow_dissector_key_id key_id;
  197. size_t offset; /* offset of struct flow_dissector_key_*
  198. in target the struct */
  199. };
  200. struct flow_dissector {
  201. unsigned int used_keys; /* each bit repesents presence of one key id */
  202. unsigned short int offset[FLOW_DISSECTOR_KEY_MAX];
  203. };
  204. struct flow_keys {
  205. struct flow_dissector_key_control control;
  206. #define FLOW_KEYS_HASH_START_FIELD basic
  207. struct flow_dissector_key_basic basic;
  208. struct flow_dissector_key_tags tags;
  209. struct flow_dissector_key_vlan vlan;
  210. struct flow_dissector_key_keyid keyid;
  211. struct flow_dissector_key_ports ports;
  212. struct flow_dissector_key_addrs addrs;
  213. };
  214. #define FLOW_KEYS_HASH_OFFSET \
  215. offsetof(struct flow_keys, FLOW_KEYS_HASH_START_FIELD)
  216. __be32 flow_get_u32_src(const struct flow_keys *flow);
  217. __be32 flow_get_u32_dst(const struct flow_keys *flow);
  218. extern struct flow_dissector flow_keys_dissector;
  219. extern struct flow_dissector flow_keys_buf_dissector;
  220. /* struct flow_keys_digest:
  221. *
  222. * This structure is used to hold a digest of the full flow keys. This is a
  223. * larger "hash" of a flow to allow definitively matching specific flows where
  224. * the 32 bit skb->hash is not large enough. The size is limited to 16 bytes so
  225. * that it can by used in CB of skb (see sch_choke for an example).
  226. */
  227. #define FLOW_KEYS_DIGEST_LEN 16
  228. struct flow_keys_digest {
  229. u8 data[FLOW_KEYS_DIGEST_LEN];
  230. };
  231. void make_flow_keys_digest(struct flow_keys_digest *digest,
  232. const struct flow_keys *flow);
  233. static inline bool flow_keys_have_l4(const struct flow_keys *keys)
  234. {
  235. return (keys->ports.ports || keys->tags.flow_label);
  236. }
  237. u32 flow_hash_from_keys(struct flow_keys *keys);
  238. static inline bool dissector_uses_key(const struct flow_dissector *flow_dissector,
  239. enum flow_dissector_key_id key_id)
  240. {
  241. return flow_dissector->used_keys & (1 << key_id);
  242. }
  243. static inline void *skb_flow_dissector_target(struct flow_dissector *flow_dissector,
  244. enum flow_dissector_key_id key_id,
  245. void *target_container)
  246. {
  247. return ((char *)target_container) + flow_dissector->offset[key_id];
  248. }
  249. #endif