flow_dissector.c 26 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013
  1. #include <linux/kernel.h>
  2. #include <linux/skbuff.h>
  3. #include <linux/export.h>
  4. #include <linux/ip.h>
  5. #include <linux/ipv6.h>
  6. #include <linux/if_vlan.h>
  7. #include <net/ip.h>
  8. #include <net/ipv6.h>
  9. #include <net/gre.h>
  10. #include <net/pptp.h>
  11. #include <linux/igmp.h>
  12. #include <linux/icmp.h>
  13. #include <linux/sctp.h>
  14. #include <linux/dccp.h>
  15. #include <linux/if_tunnel.h>
  16. #include <linux/if_pppox.h>
  17. #include <linux/ppp_defs.h>
  18. #include <linux/stddef.h>
  19. #include <linux/if_ether.h>
  20. #include <linux/mpls.h>
  21. #include <net/flow_dissector.h>
  22. #include <scsi/fc/fc_fcoe.h>
  23. static void dissector_set_key(struct flow_dissector *flow_dissector,
  24. enum flow_dissector_key_id key_id)
  25. {
  26. flow_dissector->used_keys |= (1 << key_id);
  27. }
  28. void skb_flow_dissector_init(struct flow_dissector *flow_dissector,
  29. const struct flow_dissector_key *key,
  30. unsigned int key_count)
  31. {
  32. unsigned int i;
  33. memset(flow_dissector, 0, sizeof(*flow_dissector));
  34. for (i = 0; i < key_count; i++, key++) {
  35. /* User should make sure that every key target offset is withing
  36. * boundaries of unsigned short.
  37. */
  38. BUG_ON(key->offset > USHRT_MAX);
  39. BUG_ON(dissector_uses_key(flow_dissector,
  40. key->key_id));
  41. dissector_set_key(flow_dissector, key->key_id);
  42. flow_dissector->offset[key->key_id] = key->offset;
  43. }
  44. /* Ensure that the dissector always includes control and basic key.
  45. * That way we are able to avoid handling lack of these in fast path.
  46. */
  47. BUG_ON(!dissector_uses_key(flow_dissector,
  48. FLOW_DISSECTOR_KEY_CONTROL));
  49. BUG_ON(!dissector_uses_key(flow_dissector,
  50. FLOW_DISSECTOR_KEY_BASIC));
  51. }
  52. EXPORT_SYMBOL(skb_flow_dissector_init);
  53. /**
  54. * __skb_flow_get_ports - extract the upper layer ports and return them
  55. * @skb: sk_buff to extract the ports from
  56. * @thoff: transport header offset
  57. * @ip_proto: protocol for which to get port offset
  58. * @data: raw buffer pointer to the packet, if NULL use skb->data
  59. * @hlen: packet header length, if @data is NULL use skb_headlen(skb)
  60. *
  61. * The function will try to retrieve the ports at offset thoff + poff where poff
  62. * is the protocol port offset returned from proto_ports_offset
  63. */
  64. __be32 __skb_flow_get_ports(const struct sk_buff *skb, int thoff, u8 ip_proto,
  65. void *data, int hlen)
  66. {
  67. int poff = proto_ports_offset(ip_proto);
  68. if (!data) {
  69. data = skb->data;
  70. hlen = skb_headlen(skb);
  71. }
  72. if (poff >= 0) {
  73. __be32 *ports, _ports;
  74. ports = __skb_header_pointer(skb, thoff + poff,
  75. sizeof(_ports), data, hlen, &_ports);
  76. if (ports)
  77. return *ports;
  78. }
  79. return 0;
  80. }
  81. EXPORT_SYMBOL(__skb_flow_get_ports);
  82. /**
  83. * __skb_flow_dissect - extract the flow_keys struct and return it
  84. * @skb: sk_buff to extract the flow from, can be NULL if the rest are specified
  85. * @flow_dissector: list of keys to dissect
  86. * @target_container: target structure to put dissected values into
  87. * @data: raw buffer pointer to the packet, if NULL use skb->data
  88. * @proto: protocol for which to get the flow, if @data is NULL use skb->protocol
  89. * @nhoff: network header offset, if @data is NULL use skb_network_offset(skb)
  90. * @hlen: packet header length, if @data is NULL use skb_headlen(skb)
  91. *
  92. * The function will try to retrieve individual keys into target specified
  93. * by flow_dissector from either the skbuff or a raw buffer specified by the
  94. * rest parameters.
  95. *
  96. * Caller must take care of zeroing target container memory.
  97. */
  98. bool __skb_flow_dissect(const struct sk_buff *skb,
  99. struct flow_dissector *flow_dissector,
  100. void *target_container,
  101. void *data, __be16 proto, int nhoff, int hlen,
  102. unsigned int flags)
  103. {
  104. struct flow_dissector_key_control *key_control;
  105. struct flow_dissector_key_basic *key_basic;
  106. struct flow_dissector_key_addrs *key_addrs;
  107. struct flow_dissector_key_ports *key_ports;
  108. struct flow_dissector_key_tags *key_tags;
  109. struct flow_dissector_key_vlan *key_vlan;
  110. struct flow_dissector_key_keyid *key_keyid;
  111. bool skip_vlan = false;
  112. u8 ip_proto = 0;
  113. bool ret = false;
  114. if (!data) {
  115. data = skb->data;
  116. proto = skb_vlan_tag_present(skb) ?
  117. skb->vlan_proto : skb->protocol;
  118. nhoff = skb_network_offset(skb);
  119. hlen = skb_headlen(skb);
  120. }
  121. /* It is ensured by skb_flow_dissector_init() that control key will
  122. * be always present.
  123. */
  124. key_control = skb_flow_dissector_target(flow_dissector,
  125. FLOW_DISSECTOR_KEY_CONTROL,
  126. target_container);
  127. /* It is ensured by skb_flow_dissector_init() that basic key will
  128. * be always present.
  129. */
  130. key_basic = skb_flow_dissector_target(flow_dissector,
  131. FLOW_DISSECTOR_KEY_BASIC,
  132. target_container);
  133. if (dissector_uses_key(flow_dissector,
  134. FLOW_DISSECTOR_KEY_ETH_ADDRS)) {
  135. struct ethhdr *eth = eth_hdr(skb);
  136. struct flow_dissector_key_eth_addrs *key_eth_addrs;
  137. key_eth_addrs = skb_flow_dissector_target(flow_dissector,
  138. FLOW_DISSECTOR_KEY_ETH_ADDRS,
  139. target_container);
  140. memcpy(key_eth_addrs, &eth->h_dest, sizeof(*key_eth_addrs));
  141. }
  142. again:
  143. switch (proto) {
  144. case htons(ETH_P_IP): {
  145. const struct iphdr *iph;
  146. struct iphdr _iph;
  147. ip:
  148. iph = __skb_header_pointer(skb, nhoff, sizeof(_iph), data, hlen, &_iph);
  149. if (!iph || iph->ihl < 5)
  150. goto out_bad;
  151. nhoff += iph->ihl * 4;
  152. ip_proto = iph->protocol;
  153. if (dissector_uses_key(flow_dissector,
  154. FLOW_DISSECTOR_KEY_IPV4_ADDRS)) {
  155. key_addrs = skb_flow_dissector_target(flow_dissector,
  156. FLOW_DISSECTOR_KEY_IPV4_ADDRS,
  157. target_container);
  158. memcpy(&key_addrs->v4addrs, &iph->saddr,
  159. sizeof(key_addrs->v4addrs));
  160. key_control->addr_type = FLOW_DISSECTOR_KEY_IPV4_ADDRS;
  161. }
  162. if (ip_is_fragment(iph)) {
  163. key_control->flags |= FLOW_DIS_IS_FRAGMENT;
  164. if (iph->frag_off & htons(IP_OFFSET)) {
  165. goto out_good;
  166. } else {
  167. key_control->flags |= FLOW_DIS_FIRST_FRAG;
  168. if (!(flags & FLOW_DISSECTOR_F_PARSE_1ST_FRAG))
  169. goto out_good;
  170. }
  171. }
  172. if (flags & FLOW_DISSECTOR_F_STOP_AT_L3)
  173. goto out_good;
  174. break;
  175. }
  176. case htons(ETH_P_IPV6): {
  177. const struct ipv6hdr *iph;
  178. struct ipv6hdr _iph;
  179. ipv6:
  180. iph = __skb_header_pointer(skb, nhoff, sizeof(_iph), data, hlen, &_iph);
  181. if (!iph)
  182. goto out_bad;
  183. ip_proto = iph->nexthdr;
  184. nhoff += sizeof(struct ipv6hdr);
  185. if (dissector_uses_key(flow_dissector,
  186. FLOW_DISSECTOR_KEY_IPV6_ADDRS)) {
  187. key_addrs = skb_flow_dissector_target(flow_dissector,
  188. FLOW_DISSECTOR_KEY_IPV6_ADDRS,
  189. target_container);
  190. memcpy(&key_addrs->v6addrs, &iph->saddr,
  191. sizeof(key_addrs->v6addrs));
  192. key_control->addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
  193. }
  194. if ((dissector_uses_key(flow_dissector,
  195. FLOW_DISSECTOR_KEY_FLOW_LABEL) ||
  196. (flags & FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL)) &&
  197. ip6_flowlabel(iph)) {
  198. __be32 flow_label = ip6_flowlabel(iph);
  199. if (dissector_uses_key(flow_dissector,
  200. FLOW_DISSECTOR_KEY_FLOW_LABEL)) {
  201. key_tags = skb_flow_dissector_target(flow_dissector,
  202. FLOW_DISSECTOR_KEY_FLOW_LABEL,
  203. target_container);
  204. key_tags->flow_label = ntohl(flow_label);
  205. }
  206. if (flags & FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL)
  207. goto out_good;
  208. }
  209. if (flags & FLOW_DISSECTOR_F_STOP_AT_L3)
  210. goto out_good;
  211. break;
  212. }
  213. case htons(ETH_P_8021AD):
  214. case htons(ETH_P_8021Q): {
  215. const struct vlan_hdr *vlan;
  216. if (skb_vlan_tag_present(skb))
  217. proto = skb->protocol;
  218. if (!skb_vlan_tag_present(skb) ||
  219. proto == cpu_to_be16(ETH_P_8021Q) ||
  220. proto == cpu_to_be16(ETH_P_8021AD)) {
  221. struct vlan_hdr _vlan;
  222. vlan = __skb_header_pointer(skb, nhoff, sizeof(_vlan),
  223. data, hlen, &_vlan);
  224. if (!vlan)
  225. goto out_bad;
  226. proto = vlan->h_vlan_encapsulated_proto;
  227. nhoff += sizeof(*vlan);
  228. if (skip_vlan)
  229. goto again;
  230. }
  231. skip_vlan = true;
  232. if (dissector_uses_key(flow_dissector,
  233. FLOW_DISSECTOR_KEY_VLAN)) {
  234. key_vlan = skb_flow_dissector_target(flow_dissector,
  235. FLOW_DISSECTOR_KEY_VLAN,
  236. target_container);
  237. if (skb_vlan_tag_present(skb)) {
  238. key_vlan->vlan_id = skb_vlan_tag_get_id(skb);
  239. key_vlan->vlan_priority =
  240. (skb_vlan_tag_get_prio(skb) >> VLAN_PRIO_SHIFT);
  241. } else {
  242. key_vlan->vlan_id = ntohs(vlan->h_vlan_TCI) &
  243. VLAN_VID_MASK;
  244. key_vlan->vlan_priority =
  245. (ntohs(vlan->h_vlan_TCI) &
  246. VLAN_PRIO_MASK) >> VLAN_PRIO_SHIFT;
  247. }
  248. }
  249. goto again;
  250. }
  251. case htons(ETH_P_PPP_SES): {
  252. struct {
  253. struct pppoe_hdr hdr;
  254. __be16 proto;
  255. } *hdr, _hdr;
  256. hdr = __skb_header_pointer(skb, nhoff, sizeof(_hdr), data, hlen, &_hdr);
  257. if (!hdr)
  258. goto out_bad;
  259. proto = hdr->proto;
  260. nhoff += PPPOE_SES_HLEN;
  261. switch (proto) {
  262. case htons(PPP_IP):
  263. goto ip;
  264. case htons(PPP_IPV6):
  265. goto ipv6;
  266. default:
  267. goto out_bad;
  268. }
  269. }
  270. case htons(ETH_P_TIPC): {
  271. struct {
  272. __be32 pre[3];
  273. __be32 srcnode;
  274. } *hdr, _hdr;
  275. hdr = __skb_header_pointer(skb, nhoff, sizeof(_hdr), data, hlen, &_hdr);
  276. if (!hdr)
  277. goto out_bad;
  278. if (dissector_uses_key(flow_dissector,
  279. FLOW_DISSECTOR_KEY_TIPC_ADDRS)) {
  280. key_addrs = skb_flow_dissector_target(flow_dissector,
  281. FLOW_DISSECTOR_KEY_TIPC_ADDRS,
  282. target_container);
  283. key_addrs->tipcaddrs.srcnode = hdr->srcnode;
  284. key_control->addr_type = FLOW_DISSECTOR_KEY_TIPC_ADDRS;
  285. }
  286. goto out_good;
  287. }
  288. case htons(ETH_P_MPLS_UC):
  289. case htons(ETH_P_MPLS_MC): {
  290. struct mpls_label *hdr, _hdr[2];
  291. mpls:
  292. hdr = __skb_header_pointer(skb, nhoff, sizeof(_hdr), data,
  293. hlen, &_hdr);
  294. if (!hdr)
  295. goto out_bad;
  296. if ((ntohl(hdr[0].entry) & MPLS_LS_LABEL_MASK) >>
  297. MPLS_LS_LABEL_SHIFT == MPLS_LABEL_ENTROPY) {
  298. if (dissector_uses_key(flow_dissector,
  299. FLOW_DISSECTOR_KEY_MPLS_ENTROPY)) {
  300. key_keyid = skb_flow_dissector_target(flow_dissector,
  301. FLOW_DISSECTOR_KEY_MPLS_ENTROPY,
  302. target_container);
  303. key_keyid->keyid = hdr[1].entry &
  304. htonl(MPLS_LS_LABEL_MASK);
  305. }
  306. goto out_good;
  307. }
  308. goto out_good;
  309. }
  310. case htons(ETH_P_FCOE):
  311. if ((hlen - nhoff) < FCOE_HEADER_LEN)
  312. goto out_bad;
  313. nhoff += FCOE_HEADER_LEN;
  314. goto out_good;
  315. default:
  316. goto out_bad;
  317. }
  318. ip_proto_again:
  319. switch (ip_proto) {
  320. case IPPROTO_GRE: {
  321. struct gre_base_hdr *hdr, _hdr;
  322. u16 gre_ver;
  323. int offset = 0;
  324. hdr = __skb_header_pointer(skb, nhoff, sizeof(_hdr), data, hlen, &_hdr);
  325. if (!hdr)
  326. goto out_bad;
  327. /* Only look inside GRE without routing */
  328. if (hdr->flags & GRE_ROUTING)
  329. break;
  330. /* Only look inside GRE for version 0 and 1 */
  331. gre_ver = ntohs(hdr->flags & GRE_VERSION);
  332. if (gre_ver > 1)
  333. break;
  334. proto = hdr->protocol;
  335. if (gre_ver) {
  336. /* Version1 must be PPTP, and check the flags */
  337. if (!(proto == GRE_PROTO_PPP && (hdr->flags & GRE_KEY)))
  338. break;
  339. }
  340. offset += sizeof(struct gre_base_hdr);
  341. if (hdr->flags & GRE_CSUM)
  342. offset += sizeof(((struct gre_full_hdr *)0)->csum) +
  343. sizeof(((struct gre_full_hdr *)0)->reserved1);
  344. if (hdr->flags & GRE_KEY) {
  345. const __be32 *keyid;
  346. __be32 _keyid;
  347. keyid = __skb_header_pointer(skb, nhoff + offset, sizeof(_keyid),
  348. data, hlen, &_keyid);
  349. if (!keyid)
  350. goto out_bad;
  351. if (dissector_uses_key(flow_dissector,
  352. FLOW_DISSECTOR_KEY_GRE_KEYID)) {
  353. key_keyid = skb_flow_dissector_target(flow_dissector,
  354. FLOW_DISSECTOR_KEY_GRE_KEYID,
  355. target_container);
  356. if (gre_ver == 0)
  357. key_keyid->keyid = *keyid;
  358. else
  359. key_keyid->keyid = *keyid & GRE_PPTP_KEY_MASK;
  360. }
  361. offset += sizeof(((struct gre_full_hdr *)0)->key);
  362. }
  363. if (hdr->flags & GRE_SEQ)
  364. offset += sizeof(((struct pptp_gre_header *)0)->seq);
  365. if (gre_ver == 0) {
  366. if (proto == htons(ETH_P_TEB)) {
  367. const struct ethhdr *eth;
  368. struct ethhdr _eth;
  369. eth = __skb_header_pointer(skb, nhoff + offset,
  370. sizeof(_eth),
  371. data, hlen, &_eth);
  372. if (!eth)
  373. goto out_bad;
  374. proto = eth->h_proto;
  375. offset += sizeof(*eth);
  376. /* Cap headers that we access via pointers at the
  377. * end of the Ethernet header as our maximum alignment
  378. * at that point is only 2 bytes.
  379. */
  380. if (NET_IP_ALIGN)
  381. hlen = (nhoff + offset);
  382. }
  383. } else { /* version 1, must be PPTP */
  384. u8 _ppp_hdr[PPP_HDRLEN];
  385. u8 *ppp_hdr;
  386. if (hdr->flags & GRE_ACK)
  387. offset += sizeof(((struct pptp_gre_header *)0)->ack);
  388. ppp_hdr = skb_header_pointer(skb, nhoff + offset,
  389. sizeof(_ppp_hdr), _ppp_hdr);
  390. if (!ppp_hdr)
  391. goto out_bad;
  392. switch (PPP_PROTOCOL(ppp_hdr)) {
  393. case PPP_IP:
  394. proto = htons(ETH_P_IP);
  395. break;
  396. case PPP_IPV6:
  397. proto = htons(ETH_P_IPV6);
  398. break;
  399. default:
  400. /* Could probably catch some more like MPLS */
  401. break;
  402. }
  403. offset += PPP_HDRLEN;
  404. }
  405. nhoff += offset;
  406. key_control->flags |= FLOW_DIS_ENCAPSULATION;
  407. if (flags & FLOW_DISSECTOR_F_STOP_AT_ENCAP)
  408. goto out_good;
  409. goto again;
  410. }
  411. case NEXTHDR_HOP:
  412. case NEXTHDR_ROUTING:
  413. case NEXTHDR_DEST: {
  414. u8 _opthdr[2], *opthdr;
  415. if (proto != htons(ETH_P_IPV6))
  416. break;
  417. opthdr = __skb_header_pointer(skb, nhoff, sizeof(_opthdr),
  418. data, hlen, &_opthdr);
  419. if (!opthdr)
  420. goto out_bad;
  421. ip_proto = opthdr[0];
  422. nhoff += (opthdr[1] + 1) << 3;
  423. goto ip_proto_again;
  424. }
  425. case NEXTHDR_FRAGMENT: {
  426. struct frag_hdr _fh, *fh;
  427. if (proto != htons(ETH_P_IPV6))
  428. break;
  429. fh = __skb_header_pointer(skb, nhoff, sizeof(_fh),
  430. data, hlen, &_fh);
  431. if (!fh)
  432. goto out_bad;
  433. key_control->flags |= FLOW_DIS_IS_FRAGMENT;
  434. nhoff += sizeof(_fh);
  435. ip_proto = fh->nexthdr;
  436. if (!(fh->frag_off & htons(IP6_OFFSET))) {
  437. key_control->flags |= FLOW_DIS_FIRST_FRAG;
  438. if (flags & FLOW_DISSECTOR_F_PARSE_1ST_FRAG)
  439. goto ip_proto_again;
  440. }
  441. goto out_good;
  442. }
  443. case IPPROTO_IPIP:
  444. proto = htons(ETH_P_IP);
  445. key_control->flags |= FLOW_DIS_ENCAPSULATION;
  446. if (flags & FLOW_DISSECTOR_F_STOP_AT_ENCAP)
  447. goto out_good;
  448. goto ip;
  449. case IPPROTO_IPV6:
  450. proto = htons(ETH_P_IPV6);
  451. key_control->flags |= FLOW_DIS_ENCAPSULATION;
  452. if (flags & FLOW_DISSECTOR_F_STOP_AT_ENCAP)
  453. goto out_good;
  454. goto ipv6;
  455. case IPPROTO_MPLS:
  456. proto = htons(ETH_P_MPLS_UC);
  457. goto mpls;
  458. default:
  459. break;
  460. }
  461. if (dissector_uses_key(flow_dissector,
  462. FLOW_DISSECTOR_KEY_PORTS)) {
  463. key_ports = skb_flow_dissector_target(flow_dissector,
  464. FLOW_DISSECTOR_KEY_PORTS,
  465. target_container);
  466. key_ports->ports = __skb_flow_get_ports(skb, nhoff, ip_proto,
  467. data, hlen);
  468. }
  469. out_good:
  470. ret = true;
  471. out_bad:
  472. key_basic->n_proto = proto;
  473. key_basic->ip_proto = ip_proto;
  474. key_control->thoff = (u16)nhoff;
  475. return ret;
  476. }
  477. EXPORT_SYMBOL(__skb_flow_dissect);
  478. static u32 hashrnd __read_mostly;
  479. static __always_inline void __flow_hash_secret_init(void)
  480. {
  481. net_get_random_once(&hashrnd, sizeof(hashrnd));
  482. }
  483. static __always_inline u32 __flow_hash_words(const u32 *words, u32 length,
  484. u32 keyval)
  485. {
  486. return jhash2(words, length, keyval);
  487. }
  488. static inline const u32 *flow_keys_hash_start(const struct flow_keys *flow)
  489. {
  490. const void *p = flow;
  491. BUILD_BUG_ON(FLOW_KEYS_HASH_OFFSET % sizeof(u32));
  492. return (const u32 *)(p + FLOW_KEYS_HASH_OFFSET);
  493. }
  494. static inline size_t flow_keys_hash_length(const struct flow_keys *flow)
  495. {
  496. size_t diff = FLOW_KEYS_HASH_OFFSET + sizeof(flow->addrs);
  497. BUILD_BUG_ON((sizeof(*flow) - FLOW_KEYS_HASH_OFFSET) % sizeof(u32));
  498. BUILD_BUG_ON(offsetof(typeof(*flow), addrs) !=
  499. sizeof(*flow) - sizeof(flow->addrs));
  500. switch (flow->control.addr_type) {
  501. case FLOW_DISSECTOR_KEY_IPV4_ADDRS:
  502. diff -= sizeof(flow->addrs.v4addrs);
  503. break;
  504. case FLOW_DISSECTOR_KEY_IPV6_ADDRS:
  505. diff -= sizeof(flow->addrs.v6addrs);
  506. break;
  507. case FLOW_DISSECTOR_KEY_TIPC_ADDRS:
  508. diff -= sizeof(flow->addrs.tipcaddrs);
  509. break;
  510. }
  511. return (sizeof(*flow) - diff) / sizeof(u32);
  512. }
  513. __be32 flow_get_u32_src(const struct flow_keys *flow)
  514. {
  515. switch (flow->control.addr_type) {
  516. case FLOW_DISSECTOR_KEY_IPV4_ADDRS:
  517. return flow->addrs.v4addrs.src;
  518. case FLOW_DISSECTOR_KEY_IPV6_ADDRS:
  519. return (__force __be32)ipv6_addr_hash(
  520. &flow->addrs.v6addrs.src);
  521. case FLOW_DISSECTOR_KEY_TIPC_ADDRS:
  522. return flow->addrs.tipcaddrs.srcnode;
  523. default:
  524. return 0;
  525. }
  526. }
  527. EXPORT_SYMBOL(flow_get_u32_src);
  528. __be32 flow_get_u32_dst(const struct flow_keys *flow)
  529. {
  530. switch (flow->control.addr_type) {
  531. case FLOW_DISSECTOR_KEY_IPV4_ADDRS:
  532. return flow->addrs.v4addrs.dst;
  533. case FLOW_DISSECTOR_KEY_IPV6_ADDRS:
  534. return (__force __be32)ipv6_addr_hash(
  535. &flow->addrs.v6addrs.dst);
  536. default:
  537. return 0;
  538. }
  539. }
  540. EXPORT_SYMBOL(flow_get_u32_dst);
  541. static inline void __flow_hash_consistentify(struct flow_keys *keys)
  542. {
  543. int addr_diff, i;
  544. switch (keys->control.addr_type) {
  545. case FLOW_DISSECTOR_KEY_IPV4_ADDRS:
  546. addr_diff = (__force u32)keys->addrs.v4addrs.dst -
  547. (__force u32)keys->addrs.v4addrs.src;
  548. if ((addr_diff < 0) ||
  549. (addr_diff == 0 &&
  550. ((__force u16)keys->ports.dst <
  551. (__force u16)keys->ports.src))) {
  552. swap(keys->addrs.v4addrs.src, keys->addrs.v4addrs.dst);
  553. swap(keys->ports.src, keys->ports.dst);
  554. }
  555. break;
  556. case FLOW_DISSECTOR_KEY_IPV6_ADDRS:
  557. addr_diff = memcmp(&keys->addrs.v6addrs.dst,
  558. &keys->addrs.v6addrs.src,
  559. sizeof(keys->addrs.v6addrs.dst));
  560. if ((addr_diff < 0) ||
  561. (addr_diff == 0 &&
  562. ((__force u16)keys->ports.dst <
  563. (__force u16)keys->ports.src))) {
  564. for (i = 0; i < 4; i++)
  565. swap(keys->addrs.v6addrs.src.s6_addr32[i],
  566. keys->addrs.v6addrs.dst.s6_addr32[i]);
  567. swap(keys->ports.src, keys->ports.dst);
  568. }
  569. break;
  570. }
  571. }
  572. static inline u32 __flow_hash_from_keys(struct flow_keys *keys, u32 keyval)
  573. {
  574. u32 hash;
  575. __flow_hash_consistentify(keys);
  576. hash = __flow_hash_words(flow_keys_hash_start(keys),
  577. flow_keys_hash_length(keys), keyval);
  578. if (!hash)
  579. hash = 1;
  580. return hash;
  581. }
  582. u32 flow_hash_from_keys(struct flow_keys *keys)
  583. {
  584. __flow_hash_secret_init();
  585. return __flow_hash_from_keys(keys, hashrnd);
  586. }
  587. EXPORT_SYMBOL(flow_hash_from_keys);
  588. static inline u32 ___skb_get_hash(const struct sk_buff *skb,
  589. struct flow_keys *keys, u32 keyval)
  590. {
  591. skb_flow_dissect_flow_keys(skb, keys,
  592. FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL);
  593. return __flow_hash_from_keys(keys, keyval);
  594. }
  595. struct _flow_keys_digest_data {
  596. __be16 n_proto;
  597. u8 ip_proto;
  598. u8 padding;
  599. __be32 ports;
  600. __be32 src;
  601. __be32 dst;
  602. };
  603. void make_flow_keys_digest(struct flow_keys_digest *digest,
  604. const struct flow_keys *flow)
  605. {
  606. struct _flow_keys_digest_data *data =
  607. (struct _flow_keys_digest_data *)digest;
  608. BUILD_BUG_ON(sizeof(*data) > sizeof(*digest));
  609. memset(digest, 0, sizeof(*digest));
  610. data->n_proto = flow->basic.n_proto;
  611. data->ip_proto = flow->basic.ip_proto;
  612. data->ports = flow->ports.ports;
  613. data->src = flow->addrs.v4addrs.src;
  614. data->dst = flow->addrs.v4addrs.dst;
  615. }
  616. EXPORT_SYMBOL(make_flow_keys_digest);
  617. static struct flow_dissector flow_keys_dissector_symmetric __read_mostly;
  618. u32 __skb_get_hash_symmetric(struct sk_buff *skb)
  619. {
  620. struct flow_keys keys;
  621. __flow_hash_secret_init();
  622. memset(&keys, 0, sizeof(keys));
  623. __skb_flow_dissect(skb, &flow_keys_dissector_symmetric, &keys,
  624. NULL, 0, 0, 0,
  625. FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL);
  626. return __flow_hash_from_keys(&keys, hashrnd);
  627. }
  628. EXPORT_SYMBOL_GPL(__skb_get_hash_symmetric);
  629. /**
  630. * __skb_get_hash: calculate a flow hash
  631. * @skb: sk_buff to calculate flow hash from
  632. *
  633. * This function calculates a flow hash based on src/dst addresses
  634. * and src/dst port numbers. Sets hash in skb to non-zero hash value
  635. * on success, zero indicates no valid hash. Also, sets l4_hash in skb
  636. * if hash is a canonical 4-tuple hash over transport ports.
  637. */
  638. void __skb_get_hash(struct sk_buff *skb)
  639. {
  640. struct flow_keys keys;
  641. u32 hash;
  642. __flow_hash_secret_init();
  643. hash = ___skb_get_hash(skb, &keys, hashrnd);
  644. __skb_set_sw_hash(skb, hash, flow_keys_have_l4(&keys));
  645. }
  646. EXPORT_SYMBOL(__skb_get_hash);
  647. __u32 skb_get_hash_perturb(const struct sk_buff *skb, u32 perturb)
  648. {
  649. struct flow_keys keys;
  650. return ___skb_get_hash(skb, &keys, perturb);
  651. }
  652. EXPORT_SYMBOL(skb_get_hash_perturb);
  653. __u32 __skb_get_hash_flowi6(struct sk_buff *skb, const struct flowi6 *fl6)
  654. {
  655. struct flow_keys keys;
  656. memset(&keys, 0, sizeof(keys));
  657. memcpy(&keys.addrs.v6addrs.src, &fl6->saddr,
  658. sizeof(keys.addrs.v6addrs.src));
  659. memcpy(&keys.addrs.v6addrs.dst, &fl6->daddr,
  660. sizeof(keys.addrs.v6addrs.dst));
  661. keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
  662. keys.ports.src = fl6->fl6_sport;
  663. keys.ports.dst = fl6->fl6_dport;
  664. keys.keyid.keyid = fl6->fl6_gre_key;
  665. keys.tags.flow_label = (__force u32)fl6->flowlabel;
  666. keys.basic.ip_proto = fl6->flowi6_proto;
  667. __skb_set_sw_hash(skb, flow_hash_from_keys(&keys),
  668. flow_keys_have_l4(&keys));
  669. return skb->hash;
  670. }
  671. EXPORT_SYMBOL(__skb_get_hash_flowi6);
  672. __u32 __skb_get_hash_flowi4(struct sk_buff *skb, const struct flowi4 *fl4)
  673. {
  674. struct flow_keys keys;
  675. memset(&keys, 0, sizeof(keys));
  676. keys.addrs.v4addrs.src = fl4->saddr;
  677. keys.addrs.v4addrs.dst = fl4->daddr;
  678. keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV4_ADDRS;
  679. keys.ports.src = fl4->fl4_sport;
  680. keys.ports.dst = fl4->fl4_dport;
  681. keys.keyid.keyid = fl4->fl4_gre_key;
  682. keys.basic.ip_proto = fl4->flowi4_proto;
  683. __skb_set_sw_hash(skb, flow_hash_from_keys(&keys),
  684. flow_keys_have_l4(&keys));
  685. return skb->hash;
  686. }
  687. EXPORT_SYMBOL(__skb_get_hash_flowi4);
  688. u32 __skb_get_poff(const struct sk_buff *skb, void *data,
  689. const struct flow_keys *keys, int hlen)
  690. {
  691. u32 poff = keys->control.thoff;
  692. /* skip L4 headers for fragments after the first */
  693. if ((keys->control.flags & FLOW_DIS_IS_FRAGMENT) &&
  694. !(keys->control.flags & FLOW_DIS_FIRST_FRAG))
  695. return poff;
  696. switch (keys->basic.ip_proto) {
  697. case IPPROTO_TCP: {
  698. /* access doff as u8 to avoid unaligned access */
  699. const u8 *doff;
  700. u8 _doff;
  701. doff = __skb_header_pointer(skb, poff + 12, sizeof(_doff),
  702. data, hlen, &_doff);
  703. if (!doff)
  704. return poff;
  705. poff += max_t(u32, sizeof(struct tcphdr), (*doff & 0xF0) >> 2);
  706. break;
  707. }
  708. case IPPROTO_UDP:
  709. case IPPROTO_UDPLITE:
  710. poff += sizeof(struct udphdr);
  711. break;
  712. /* For the rest, we do not really care about header
  713. * extensions at this point for now.
  714. */
  715. case IPPROTO_ICMP:
  716. poff += sizeof(struct icmphdr);
  717. break;
  718. case IPPROTO_ICMPV6:
  719. poff += sizeof(struct icmp6hdr);
  720. break;
  721. case IPPROTO_IGMP:
  722. poff += sizeof(struct igmphdr);
  723. break;
  724. case IPPROTO_DCCP:
  725. poff += sizeof(struct dccp_hdr);
  726. break;
  727. case IPPROTO_SCTP:
  728. poff += sizeof(struct sctphdr);
  729. break;
  730. }
  731. return poff;
  732. }
  733. /**
  734. * skb_get_poff - get the offset to the payload
  735. * @skb: sk_buff to get the payload offset from
  736. *
  737. * The function will get the offset to the payload as far as it could
  738. * be dissected. The main user is currently BPF, so that we can dynamically
  739. * truncate packets without needing to push actual payload to the user
  740. * space and can analyze headers only, instead.
  741. */
  742. u32 skb_get_poff(const struct sk_buff *skb)
  743. {
  744. struct flow_keys keys;
  745. if (!skb_flow_dissect_flow_keys(skb, &keys, 0))
  746. return 0;
  747. return __skb_get_poff(skb, skb->data, &keys, skb_headlen(skb));
  748. }
  749. __u32 __get_hash_from_flowi6(const struct flowi6 *fl6, struct flow_keys *keys)
  750. {
  751. memset(keys, 0, sizeof(*keys));
  752. memcpy(&keys->addrs.v6addrs.src, &fl6->saddr,
  753. sizeof(keys->addrs.v6addrs.src));
  754. memcpy(&keys->addrs.v6addrs.dst, &fl6->daddr,
  755. sizeof(keys->addrs.v6addrs.dst));
  756. keys->control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
  757. keys->ports.src = fl6->fl6_sport;
  758. keys->ports.dst = fl6->fl6_dport;
  759. keys->keyid.keyid = fl6->fl6_gre_key;
  760. keys->tags.flow_label = (__force u32)fl6->flowlabel;
  761. keys->basic.ip_proto = fl6->flowi6_proto;
  762. return flow_hash_from_keys(keys);
  763. }
  764. EXPORT_SYMBOL(__get_hash_from_flowi6);
  765. __u32 __get_hash_from_flowi4(const struct flowi4 *fl4, struct flow_keys *keys)
  766. {
  767. memset(keys, 0, sizeof(*keys));
  768. keys->addrs.v4addrs.src = fl4->saddr;
  769. keys->addrs.v4addrs.dst = fl4->daddr;
  770. keys->control.addr_type = FLOW_DISSECTOR_KEY_IPV4_ADDRS;
  771. keys->ports.src = fl4->fl4_sport;
  772. keys->ports.dst = fl4->fl4_dport;
  773. keys->keyid.keyid = fl4->fl4_gre_key;
  774. keys->basic.ip_proto = fl4->flowi4_proto;
  775. return flow_hash_from_keys(keys);
  776. }
  777. EXPORT_SYMBOL(__get_hash_from_flowi4);
  778. static const struct flow_dissector_key flow_keys_dissector_keys[] = {
  779. {
  780. .key_id = FLOW_DISSECTOR_KEY_CONTROL,
  781. .offset = offsetof(struct flow_keys, control),
  782. },
  783. {
  784. .key_id = FLOW_DISSECTOR_KEY_BASIC,
  785. .offset = offsetof(struct flow_keys, basic),
  786. },
  787. {
  788. .key_id = FLOW_DISSECTOR_KEY_IPV4_ADDRS,
  789. .offset = offsetof(struct flow_keys, addrs.v4addrs),
  790. },
  791. {
  792. .key_id = FLOW_DISSECTOR_KEY_IPV6_ADDRS,
  793. .offset = offsetof(struct flow_keys, addrs.v6addrs),
  794. },
  795. {
  796. .key_id = FLOW_DISSECTOR_KEY_TIPC_ADDRS,
  797. .offset = offsetof(struct flow_keys, addrs.tipcaddrs),
  798. },
  799. {
  800. .key_id = FLOW_DISSECTOR_KEY_PORTS,
  801. .offset = offsetof(struct flow_keys, ports),
  802. },
  803. {
  804. .key_id = FLOW_DISSECTOR_KEY_VLAN,
  805. .offset = offsetof(struct flow_keys, vlan),
  806. },
  807. {
  808. .key_id = FLOW_DISSECTOR_KEY_FLOW_LABEL,
  809. .offset = offsetof(struct flow_keys, tags),
  810. },
  811. {
  812. .key_id = FLOW_DISSECTOR_KEY_GRE_KEYID,
  813. .offset = offsetof(struct flow_keys, keyid),
  814. },
  815. };
  816. static const struct flow_dissector_key flow_keys_dissector_symmetric_keys[] = {
  817. {
  818. .key_id = FLOW_DISSECTOR_KEY_CONTROL,
  819. .offset = offsetof(struct flow_keys, control),
  820. },
  821. {
  822. .key_id = FLOW_DISSECTOR_KEY_BASIC,
  823. .offset = offsetof(struct flow_keys, basic),
  824. },
  825. {
  826. .key_id = FLOW_DISSECTOR_KEY_IPV4_ADDRS,
  827. .offset = offsetof(struct flow_keys, addrs.v4addrs),
  828. },
  829. {
  830. .key_id = FLOW_DISSECTOR_KEY_IPV6_ADDRS,
  831. .offset = offsetof(struct flow_keys, addrs.v6addrs),
  832. },
  833. {
  834. .key_id = FLOW_DISSECTOR_KEY_PORTS,
  835. .offset = offsetof(struct flow_keys, ports),
  836. },
  837. };
  838. static const struct flow_dissector_key flow_keys_buf_dissector_keys[] = {
  839. {
  840. .key_id = FLOW_DISSECTOR_KEY_CONTROL,
  841. .offset = offsetof(struct flow_keys, control),
  842. },
  843. {
  844. .key_id = FLOW_DISSECTOR_KEY_BASIC,
  845. .offset = offsetof(struct flow_keys, basic),
  846. },
  847. };
  848. struct flow_dissector flow_keys_dissector __read_mostly;
  849. EXPORT_SYMBOL(flow_keys_dissector);
  850. struct flow_dissector flow_keys_buf_dissector __read_mostly;
  851. static int __init init_default_flow_dissectors(void)
  852. {
  853. skb_flow_dissector_init(&flow_keys_dissector,
  854. flow_keys_dissector_keys,
  855. ARRAY_SIZE(flow_keys_dissector_keys));
  856. skb_flow_dissector_init(&flow_keys_dissector_symmetric,
  857. flow_keys_dissector_symmetric_keys,
  858. ARRAY_SIZE(flow_keys_dissector_symmetric_keys));
  859. skb_flow_dissector_init(&flow_keys_buf_dissector,
  860. flow_keys_buf_dissector_keys,
  861. ARRAY_SIZE(flow_keys_buf_dissector_keys));
  862. return 0;
  863. }
  864. late_initcall_sync(init_default_flow_dissectors);