flow_dissector.c 43 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610
  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/dsa.h>
  8. #include <net/dst_metadata.h>
  9. #include <net/ip.h>
  10. #include <net/ipv6.h>
  11. #include <net/gre.h>
  12. #include <net/pptp.h>
  13. #include <net/tipc.h>
  14. #include <linux/igmp.h>
  15. #include <linux/icmp.h>
  16. #include <linux/sctp.h>
  17. #include <linux/dccp.h>
  18. #include <linux/if_tunnel.h>
  19. #include <linux/if_pppox.h>
  20. #include <linux/ppp_defs.h>
  21. #include <linux/stddef.h>
  22. #include <linux/if_ether.h>
  23. #include <linux/mpls.h>
  24. #include <linux/tcp.h>
  25. #include <net/flow_dissector.h>
  26. #include <scsi/fc/fc_fcoe.h>
  27. #include <uapi/linux/batadv_packet.h>
  28. #include <linux/bpf.h>
  29. static DEFINE_MUTEX(flow_dissector_mutex);
  30. static void dissector_set_key(struct flow_dissector *flow_dissector,
  31. enum flow_dissector_key_id key_id)
  32. {
  33. flow_dissector->used_keys |= (1 << key_id);
  34. }
  35. void skb_flow_dissector_init(struct flow_dissector *flow_dissector,
  36. const struct flow_dissector_key *key,
  37. unsigned int key_count)
  38. {
  39. unsigned int i;
  40. memset(flow_dissector, 0, sizeof(*flow_dissector));
  41. for (i = 0; i < key_count; i++, key++) {
  42. /* User should make sure that every key target offset is withing
  43. * boundaries of unsigned short.
  44. */
  45. BUG_ON(key->offset > USHRT_MAX);
  46. BUG_ON(dissector_uses_key(flow_dissector,
  47. key->key_id));
  48. dissector_set_key(flow_dissector, key->key_id);
  49. flow_dissector->offset[key->key_id] = key->offset;
  50. }
  51. /* Ensure that the dissector always includes control and basic key.
  52. * That way we are able to avoid handling lack of these in fast path.
  53. */
  54. BUG_ON(!dissector_uses_key(flow_dissector,
  55. FLOW_DISSECTOR_KEY_CONTROL));
  56. BUG_ON(!dissector_uses_key(flow_dissector,
  57. FLOW_DISSECTOR_KEY_BASIC));
  58. }
  59. EXPORT_SYMBOL(skb_flow_dissector_init);
  60. int skb_flow_dissector_bpf_prog_attach(const union bpf_attr *attr,
  61. struct bpf_prog *prog)
  62. {
  63. struct bpf_prog *attached;
  64. struct net *net;
  65. net = current->nsproxy->net_ns;
  66. mutex_lock(&flow_dissector_mutex);
  67. attached = rcu_dereference_protected(net->flow_dissector_prog,
  68. lockdep_is_held(&flow_dissector_mutex));
  69. if (attached) {
  70. /* Only one BPF program can be attached at a time */
  71. mutex_unlock(&flow_dissector_mutex);
  72. return -EEXIST;
  73. }
  74. rcu_assign_pointer(net->flow_dissector_prog, prog);
  75. mutex_unlock(&flow_dissector_mutex);
  76. return 0;
  77. }
  78. int skb_flow_dissector_bpf_prog_detach(const union bpf_attr *attr)
  79. {
  80. struct bpf_prog *attached;
  81. struct net *net;
  82. net = current->nsproxy->net_ns;
  83. mutex_lock(&flow_dissector_mutex);
  84. attached = rcu_dereference_protected(net->flow_dissector_prog,
  85. lockdep_is_held(&flow_dissector_mutex));
  86. if (!attached) {
  87. mutex_unlock(&flow_dissector_mutex);
  88. return -ENOENT;
  89. }
  90. bpf_prog_put(attached);
  91. RCU_INIT_POINTER(net->flow_dissector_prog, NULL);
  92. mutex_unlock(&flow_dissector_mutex);
  93. return 0;
  94. }
  95. /**
  96. * skb_flow_get_be16 - extract be16 entity
  97. * @skb: sk_buff to extract from
  98. * @poff: offset to extract at
  99. * @data: raw buffer pointer to the packet
  100. * @hlen: packet header length
  101. *
  102. * The function will try to retrieve a be32 entity at
  103. * offset poff
  104. */
  105. static __be16 skb_flow_get_be16(const struct sk_buff *skb, int poff,
  106. void *data, int hlen)
  107. {
  108. __be16 *u, _u;
  109. u = __skb_header_pointer(skb, poff, sizeof(_u), data, hlen, &_u);
  110. if (u)
  111. return *u;
  112. return 0;
  113. }
  114. /**
  115. * __skb_flow_get_ports - extract the upper layer ports and return them
  116. * @skb: sk_buff to extract the ports from
  117. * @thoff: transport header offset
  118. * @ip_proto: protocol for which to get port offset
  119. * @data: raw buffer pointer to the packet, if NULL use skb->data
  120. * @hlen: packet header length, if @data is NULL use skb_headlen(skb)
  121. *
  122. * The function will try to retrieve the ports at offset thoff + poff where poff
  123. * is the protocol port offset returned from proto_ports_offset
  124. */
  125. __be32 __skb_flow_get_ports(const struct sk_buff *skb, int thoff, u8 ip_proto,
  126. void *data, int hlen)
  127. {
  128. int poff = proto_ports_offset(ip_proto);
  129. if (!data) {
  130. data = skb->data;
  131. hlen = skb_headlen(skb);
  132. }
  133. if (poff >= 0) {
  134. __be32 *ports, _ports;
  135. ports = __skb_header_pointer(skb, thoff + poff,
  136. sizeof(_ports), data, hlen, &_ports);
  137. if (ports)
  138. return *ports;
  139. }
  140. return 0;
  141. }
  142. EXPORT_SYMBOL(__skb_flow_get_ports);
  143. static void
  144. skb_flow_dissect_set_enc_addr_type(enum flow_dissector_key_id type,
  145. struct flow_dissector *flow_dissector,
  146. void *target_container)
  147. {
  148. struct flow_dissector_key_control *ctrl;
  149. if (!dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_ENC_CONTROL))
  150. return;
  151. ctrl = skb_flow_dissector_target(flow_dissector,
  152. FLOW_DISSECTOR_KEY_ENC_CONTROL,
  153. target_container);
  154. ctrl->addr_type = type;
  155. }
  156. void
  157. skb_flow_dissect_tunnel_info(const struct sk_buff *skb,
  158. struct flow_dissector *flow_dissector,
  159. void *target_container)
  160. {
  161. struct ip_tunnel_info *info;
  162. struct ip_tunnel_key *key;
  163. /* A quick check to see if there might be something to do. */
  164. if (!dissector_uses_key(flow_dissector,
  165. FLOW_DISSECTOR_KEY_ENC_KEYID) &&
  166. !dissector_uses_key(flow_dissector,
  167. FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS) &&
  168. !dissector_uses_key(flow_dissector,
  169. FLOW_DISSECTOR_KEY_ENC_IPV6_ADDRS) &&
  170. !dissector_uses_key(flow_dissector,
  171. FLOW_DISSECTOR_KEY_ENC_CONTROL) &&
  172. !dissector_uses_key(flow_dissector,
  173. FLOW_DISSECTOR_KEY_ENC_PORTS) &&
  174. !dissector_uses_key(flow_dissector,
  175. FLOW_DISSECTOR_KEY_ENC_IP) &&
  176. !dissector_uses_key(flow_dissector,
  177. FLOW_DISSECTOR_KEY_ENC_OPTS))
  178. return;
  179. info = skb_tunnel_info(skb);
  180. if (!info)
  181. return;
  182. key = &info->key;
  183. switch (ip_tunnel_info_af(info)) {
  184. case AF_INET:
  185. skb_flow_dissect_set_enc_addr_type(FLOW_DISSECTOR_KEY_IPV4_ADDRS,
  186. flow_dissector,
  187. target_container);
  188. if (dissector_uses_key(flow_dissector,
  189. FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS)) {
  190. struct flow_dissector_key_ipv4_addrs *ipv4;
  191. ipv4 = skb_flow_dissector_target(flow_dissector,
  192. FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS,
  193. target_container);
  194. ipv4->src = key->u.ipv4.src;
  195. ipv4->dst = key->u.ipv4.dst;
  196. }
  197. break;
  198. case AF_INET6:
  199. skb_flow_dissect_set_enc_addr_type(FLOW_DISSECTOR_KEY_IPV6_ADDRS,
  200. flow_dissector,
  201. target_container);
  202. if (dissector_uses_key(flow_dissector,
  203. FLOW_DISSECTOR_KEY_ENC_IPV6_ADDRS)) {
  204. struct flow_dissector_key_ipv6_addrs *ipv6;
  205. ipv6 = skb_flow_dissector_target(flow_dissector,
  206. FLOW_DISSECTOR_KEY_ENC_IPV6_ADDRS,
  207. target_container);
  208. ipv6->src = key->u.ipv6.src;
  209. ipv6->dst = key->u.ipv6.dst;
  210. }
  211. break;
  212. }
  213. if (dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_ENC_KEYID)) {
  214. struct flow_dissector_key_keyid *keyid;
  215. keyid = skb_flow_dissector_target(flow_dissector,
  216. FLOW_DISSECTOR_KEY_ENC_KEYID,
  217. target_container);
  218. keyid->keyid = tunnel_id_to_key32(key->tun_id);
  219. }
  220. if (dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_ENC_PORTS)) {
  221. struct flow_dissector_key_ports *tp;
  222. tp = skb_flow_dissector_target(flow_dissector,
  223. FLOW_DISSECTOR_KEY_ENC_PORTS,
  224. target_container);
  225. tp->src = key->tp_src;
  226. tp->dst = key->tp_dst;
  227. }
  228. if (dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_ENC_IP)) {
  229. struct flow_dissector_key_ip *ip;
  230. ip = skb_flow_dissector_target(flow_dissector,
  231. FLOW_DISSECTOR_KEY_ENC_IP,
  232. target_container);
  233. ip->tos = key->tos;
  234. ip->ttl = key->ttl;
  235. }
  236. if (dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_ENC_OPTS)) {
  237. struct flow_dissector_key_enc_opts *enc_opt;
  238. enc_opt = skb_flow_dissector_target(flow_dissector,
  239. FLOW_DISSECTOR_KEY_ENC_OPTS,
  240. target_container);
  241. if (info->options_len) {
  242. enc_opt->len = info->options_len;
  243. ip_tunnel_info_opts_get(enc_opt->data, info);
  244. enc_opt->dst_opt_type = info->key.tun_flags &
  245. TUNNEL_OPTIONS_PRESENT;
  246. }
  247. }
  248. }
  249. EXPORT_SYMBOL(skb_flow_dissect_tunnel_info);
  250. static enum flow_dissect_ret
  251. __skb_flow_dissect_mpls(const struct sk_buff *skb,
  252. struct flow_dissector *flow_dissector,
  253. void *target_container, void *data, int nhoff, int hlen)
  254. {
  255. struct flow_dissector_key_keyid *key_keyid;
  256. struct mpls_label *hdr, _hdr[2];
  257. u32 entry, label;
  258. if (!dissector_uses_key(flow_dissector,
  259. FLOW_DISSECTOR_KEY_MPLS_ENTROPY) &&
  260. !dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_MPLS))
  261. return FLOW_DISSECT_RET_OUT_GOOD;
  262. hdr = __skb_header_pointer(skb, nhoff, sizeof(_hdr), data,
  263. hlen, &_hdr);
  264. if (!hdr)
  265. return FLOW_DISSECT_RET_OUT_BAD;
  266. entry = ntohl(hdr[0].entry);
  267. label = (entry & MPLS_LS_LABEL_MASK) >> MPLS_LS_LABEL_SHIFT;
  268. if (dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_MPLS)) {
  269. struct flow_dissector_key_mpls *key_mpls;
  270. key_mpls = skb_flow_dissector_target(flow_dissector,
  271. FLOW_DISSECTOR_KEY_MPLS,
  272. target_container);
  273. key_mpls->mpls_label = label;
  274. key_mpls->mpls_ttl = (entry & MPLS_LS_TTL_MASK)
  275. >> MPLS_LS_TTL_SHIFT;
  276. key_mpls->mpls_tc = (entry & MPLS_LS_TC_MASK)
  277. >> MPLS_LS_TC_SHIFT;
  278. key_mpls->mpls_bos = (entry & MPLS_LS_S_MASK)
  279. >> MPLS_LS_S_SHIFT;
  280. }
  281. if (label == MPLS_LABEL_ENTROPY) {
  282. key_keyid = skb_flow_dissector_target(flow_dissector,
  283. FLOW_DISSECTOR_KEY_MPLS_ENTROPY,
  284. target_container);
  285. key_keyid->keyid = hdr[1].entry & htonl(MPLS_LS_LABEL_MASK);
  286. }
  287. return FLOW_DISSECT_RET_OUT_GOOD;
  288. }
  289. static enum flow_dissect_ret
  290. __skb_flow_dissect_arp(const struct sk_buff *skb,
  291. struct flow_dissector *flow_dissector,
  292. void *target_container, void *data, int nhoff, int hlen)
  293. {
  294. struct flow_dissector_key_arp *key_arp;
  295. struct {
  296. unsigned char ar_sha[ETH_ALEN];
  297. unsigned char ar_sip[4];
  298. unsigned char ar_tha[ETH_ALEN];
  299. unsigned char ar_tip[4];
  300. } *arp_eth, _arp_eth;
  301. const struct arphdr *arp;
  302. struct arphdr _arp;
  303. if (!dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_ARP))
  304. return FLOW_DISSECT_RET_OUT_GOOD;
  305. arp = __skb_header_pointer(skb, nhoff, sizeof(_arp), data,
  306. hlen, &_arp);
  307. if (!arp)
  308. return FLOW_DISSECT_RET_OUT_BAD;
  309. if (arp->ar_hrd != htons(ARPHRD_ETHER) ||
  310. arp->ar_pro != htons(ETH_P_IP) ||
  311. arp->ar_hln != ETH_ALEN ||
  312. arp->ar_pln != 4 ||
  313. (arp->ar_op != htons(ARPOP_REPLY) &&
  314. arp->ar_op != htons(ARPOP_REQUEST)))
  315. return FLOW_DISSECT_RET_OUT_BAD;
  316. arp_eth = __skb_header_pointer(skb, nhoff + sizeof(_arp),
  317. sizeof(_arp_eth), data,
  318. hlen, &_arp_eth);
  319. if (!arp_eth)
  320. return FLOW_DISSECT_RET_OUT_BAD;
  321. key_arp = skb_flow_dissector_target(flow_dissector,
  322. FLOW_DISSECTOR_KEY_ARP,
  323. target_container);
  324. memcpy(&key_arp->sip, arp_eth->ar_sip, sizeof(key_arp->sip));
  325. memcpy(&key_arp->tip, arp_eth->ar_tip, sizeof(key_arp->tip));
  326. /* Only store the lower byte of the opcode;
  327. * this covers ARPOP_REPLY and ARPOP_REQUEST.
  328. */
  329. key_arp->op = ntohs(arp->ar_op) & 0xff;
  330. ether_addr_copy(key_arp->sha, arp_eth->ar_sha);
  331. ether_addr_copy(key_arp->tha, arp_eth->ar_tha);
  332. return FLOW_DISSECT_RET_OUT_GOOD;
  333. }
  334. static enum flow_dissect_ret
  335. __skb_flow_dissect_gre(const struct sk_buff *skb,
  336. struct flow_dissector_key_control *key_control,
  337. struct flow_dissector *flow_dissector,
  338. void *target_container, void *data,
  339. __be16 *p_proto, int *p_nhoff, int *p_hlen,
  340. unsigned int flags)
  341. {
  342. struct flow_dissector_key_keyid *key_keyid;
  343. struct gre_base_hdr *hdr, _hdr;
  344. int offset = 0;
  345. u16 gre_ver;
  346. hdr = __skb_header_pointer(skb, *p_nhoff, sizeof(_hdr),
  347. data, *p_hlen, &_hdr);
  348. if (!hdr)
  349. return FLOW_DISSECT_RET_OUT_BAD;
  350. /* Only look inside GRE without routing */
  351. if (hdr->flags & GRE_ROUTING)
  352. return FLOW_DISSECT_RET_OUT_GOOD;
  353. /* Only look inside GRE for version 0 and 1 */
  354. gre_ver = ntohs(hdr->flags & GRE_VERSION);
  355. if (gre_ver > 1)
  356. return FLOW_DISSECT_RET_OUT_GOOD;
  357. *p_proto = hdr->protocol;
  358. if (gre_ver) {
  359. /* Version1 must be PPTP, and check the flags */
  360. if (!(*p_proto == GRE_PROTO_PPP && (hdr->flags & GRE_KEY)))
  361. return FLOW_DISSECT_RET_OUT_GOOD;
  362. }
  363. offset += sizeof(struct gre_base_hdr);
  364. if (hdr->flags & GRE_CSUM)
  365. offset += FIELD_SIZEOF(struct gre_full_hdr, csum) +
  366. FIELD_SIZEOF(struct gre_full_hdr, reserved1);
  367. if (hdr->flags & GRE_KEY) {
  368. const __be32 *keyid;
  369. __be32 _keyid;
  370. keyid = __skb_header_pointer(skb, *p_nhoff + offset,
  371. sizeof(_keyid),
  372. data, *p_hlen, &_keyid);
  373. if (!keyid)
  374. return FLOW_DISSECT_RET_OUT_BAD;
  375. if (dissector_uses_key(flow_dissector,
  376. FLOW_DISSECTOR_KEY_GRE_KEYID)) {
  377. key_keyid = skb_flow_dissector_target(flow_dissector,
  378. FLOW_DISSECTOR_KEY_GRE_KEYID,
  379. target_container);
  380. if (gre_ver == 0)
  381. key_keyid->keyid = *keyid;
  382. else
  383. key_keyid->keyid = *keyid & GRE_PPTP_KEY_MASK;
  384. }
  385. offset += FIELD_SIZEOF(struct gre_full_hdr, key);
  386. }
  387. if (hdr->flags & GRE_SEQ)
  388. offset += FIELD_SIZEOF(struct pptp_gre_header, seq);
  389. if (gre_ver == 0) {
  390. if (*p_proto == htons(ETH_P_TEB)) {
  391. const struct ethhdr *eth;
  392. struct ethhdr _eth;
  393. eth = __skb_header_pointer(skb, *p_nhoff + offset,
  394. sizeof(_eth),
  395. data, *p_hlen, &_eth);
  396. if (!eth)
  397. return FLOW_DISSECT_RET_OUT_BAD;
  398. *p_proto = eth->h_proto;
  399. offset += sizeof(*eth);
  400. /* Cap headers that we access via pointers at the
  401. * end of the Ethernet header as our maximum alignment
  402. * at that point is only 2 bytes.
  403. */
  404. if (NET_IP_ALIGN)
  405. *p_hlen = *p_nhoff + offset;
  406. }
  407. } else { /* version 1, must be PPTP */
  408. u8 _ppp_hdr[PPP_HDRLEN];
  409. u8 *ppp_hdr;
  410. if (hdr->flags & GRE_ACK)
  411. offset += FIELD_SIZEOF(struct pptp_gre_header, ack);
  412. ppp_hdr = __skb_header_pointer(skb, *p_nhoff + offset,
  413. sizeof(_ppp_hdr),
  414. data, *p_hlen, _ppp_hdr);
  415. if (!ppp_hdr)
  416. return FLOW_DISSECT_RET_OUT_BAD;
  417. switch (PPP_PROTOCOL(ppp_hdr)) {
  418. case PPP_IP:
  419. *p_proto = htons(ETH_P_IP);
  420. break;
  421. case PPP_IPV6:
  422. *p_proto = htons(ETH_P_IPV6);
  423. break;
  424. default:
  425. /* Could probably catch some more like MPLS */
  426. break;
  427. }
  428. offset += PPP_HDRLEN;
  429. }
  430. *p_nhoff += offset;
  431. key_control->flags |= FLOW_DIS_ENCAPSULATION;
  432. if (flags & FLOW_DISSECTOR_F_STOP_AT_ENCAP)
  433. return FLOW_DISSECT_RET_OUT_GOOD;
  434. return FLOW_DISSECT_RET_PROTO_AGAIN;
  435. }
  436. /**
  437. * __skb_flow_dissect_batadv() - dissect batman-adv header
  438. * @skb: sk_buff to with the batman-adv header
  439. * @key_control: flow dissectors control key
  440. * @data: raw buffer pointer to the packet, if NULL use skb->data
  441. * @p_proto: pointer used to update the protocol to process next
  442. * @p_nhoff: pointer used to update inner network header offset
  443. * @hlen: packet header length
  444. * @flags: any combination of FLOW_DISSECTOR_F_*
  445. *
  446. * ETH_P_BATMAN packets are tried to be dissected. Only
  447. * &struct batadv_unicast packets are actually processed because they contain an
  448. * inner ethernet header and are usually followed by actual network header. This
  449. * allows the flow dissector to continue processing the packet.
  450. *
  451. * Return: FLOW_DISSECT_RET_PROTO_AGAIN when &struct batadv_unicast was found,
  452. * FLOW_DISSECT_RET_OUT_GOOD when dissector should stop after encapsulation,
  453. * otherwise FLOW_DISSECT_RET_OUT_BAD
  454. */
  455. static enum flow_dissect_ret
  456. __skb_flow_dissect_batadv(const struct sk_buff *skb,
  457. struct flow_dissector_key_control *key_control,
  458. void *data, __be16 *p_proto, int *p_nhoff, int hlen,
  459. unsigned int flags)
  460. {
  461. struct {
  462. struct batadv_unicast_packet batadv_unicast;
  463. struct ethhdr eth;
  464. } *hdr, _hdr;
  465. hdr = __skb_header_pointer(skb, *p_nhoff, sizeof(_hdr), data, hlen,
  466. &_hdr);
  467. if (!hdr)
  468. return FLOW_DISSECT_RET_OUT_BAD;
  469. if (hdr->batadv_unicast.version != BATADV_COMPAT_VERSION)
  470. return FLOW_DISSECT_RET_OUT_BAD;
  471. if (hdr->batadv_unicast.packet_type != BATADV_UNICAST)
  472. return FLOW_DISSECT_RET_OUT_BAD;
  473. *p_proto = hdr->eth.h_proto;
  474. *p_nhoff += sizeof(*hdr);
  475. key_control->flags |= FLOW_DIS_ENCAPSULATION;
  476. if (flags & FLOW_DISSECTOR_F_STOP_AT_ENCAP)
  477. return FLOW_DISSECT_RET_OUT_GOOD;
  478. return FLOW_DISSECT_RET_PROTO_AGAIN;
  479. }
  480. static void
  481. __skb_flow_dissect_tcp(const struct sk_buff *skb,
  482. struct flow_dissector *flow_dissector,
  483. void *target_container, void *data, int thoff, int hlen)
  484. {
  485. struct flow_dissector_key_tcp *key_tcp;
  486. struct tcphdr *th, _th;
  487. if (!dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_TCP))
  488. return;
  489. th = __skb_header_pointer(skb, thoff, sizeof(_th), data, hlen, &_th);
  490. if (!th)
  491. return;
  492. if (unlikely(__tcp_hdrlen(th) < sizeof(_th)))
  493. return;
  494. key_tcp = skb_flow_dissector_target(flow_dissector,
  495. FLOW_DISSECTOR_KEY_TCP,
  496. target_container);
  497. key_tcp->flags = (*(__be16 *) &tcp_flag_word(th) & htons(0x0FFF));
  498. }
  499. static void
  500. __skb_flow_dissect_ipv4(const struct sk_buff *skb,
  501. struct flow_dissector *flow_dissector,
  502. void *target_container, void *data, const struct iphdr *iph)
  503. {
  504. struct flow_dissector_key_ip *key_ip;
  505. if (!dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_IP))
  506. return;
  507. key_ip = skb_flow_dissector_target(flow_dissector,
  508. FLOW_DISSECTOR_KEY_IP,
  509. target_container);
  510. key_ip->tos = iph->tos;
  511. key_ip->ttl = iph->ttl;
  512. }
  513. static void
  514. __skb_flow_dissect_ipv6(const struct sk_buff *skb,
  515. struct flow_dissector *flow_dissector,
  516. void *target_container, void *data, const struct ipv6hdr *iph)
  517. {
  518. struct flow_dissector_key_ip *key_ip;
  519. if (!dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_IP))
  520. return;
  521. key_ip = skb_flow_dissector_target(flow_dissector,
  522. FLOW_DISSECTOR_KEY_IP,
  523. target_container);
  524. key_ip->tos = ipv6_get_dsfield(iph);
  525. key_ip->ttl = iph->hop_limit;
  526. }
  527. /* Maximum number of protocol headers that can be parsed in
  528. * __skb_flow_dissect
  529. */
  530. #define MAX_FLOW_DISSECT_HDRS 15
  531. static bool skb_flow_dissect_allowed(int *num_hdrs)
  532. {
  533. ++*num_hdrs;
  534. return (*num_hdrs <= MAX_FLOW_DISSECT_HDRS);
  535. }
  536. static void __skb_flow_bpf_to_target(const struct bpf_flow_keys *flow_keys,
  537. struct flow_dissector *flow_dissector,
  538. void *target_container)
  539. {
  540. struct flow_dissector_key_control *key_control;
  541. struct flow_dissector_key_basic *key_basic;
  542. struct flow_dissector_key_addrs *key_addrs;
  543. struct flow_dissector_key_ports *key_ports;
  544. key_control = skb_flow_dissector_target(flow_dissector,
  545. FLOW_DISSECTOR_KEY_CONTROL,
  546. target_container);
  547. key_control->thoff = flow_keys->thoff;
  548. if (flow_keys->is_frag)
  549. key_control->flags |= FLOW_DIS_IS_FRAGMENT;
  550. if (flow_keys->is_first_frag)
  551. key_control->flags |= FLOW_DIS_FIRST_FRAG;
  552. if (flow_keys->is_encap)
  553. key_control->flags |= FLOW_DIS_ENCAPSULATION;
  554. key_basic = skb_flow_dissector_target(flow_dissector,
  555. FLOW_DISSECTOR_KEY_BASIC,
  556. target_container);
  557. key_basic->n_proto = flow_keys->n_proto;
  558. key_basic->ip_proto = flow_keys->ip_proto;
  559. if (flow_keys->addr_proto == ETH_P_IP &&
  560. dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_IPV4_ADDRS)) {
  561. key_addrs = skb_flow_dissector_target(flow_dissector,
  562. FLOW_DISSECTOR_KEY_IPV4_ADDRS,
  563. target_container);
  564. key_addrs->v4addrs.src = flow_keys->ipv4_src;
  565. key_addrs->v4addrs.dst = flow_keys->ipv4_dst;
  566. key_control->addr_type = FLOW_DISSECTOR_KEY_IPV4_ADDRS;
  567. } else if (flow_keys->addr_proto == ETH_P_IPV6 &&
  568. dissector_uses_key(flow_dissector,
  569. FLOW_DISSECTOR_KEY_IPV6_ADDRS)) {
  570. key_addrs = skb_flow_dissector_target(flow_dissector,
  571. FLOW_DISSECTOR_KEY_IPV6_ADDRS,
  572. target_container);
  573. memcpy(&key_addrs->v6addrs, &flow_keys->ipv6_src,
  574. sizeof(key_addrs->v6addrs));
  575. key_control->addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
  576. }
  577. if (dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_PORTS)) {
  578. key_ports = skb_flow_dissector_target(flow_dissector,
  579. FLOW_DISSECTOR_KEY_PORTS,
  580. target_container);
  581. key_ports->src = flow_keys->sport;
  582. key_ports->dst = flow_keys->dport;
  583. }
  584. }
  585. /**
  586. * __skb_flow_dissect - extract the flow_keys struct and return it
  587. * @skb: sk_buff to extract the flow from, can be NULL if the rest are specified
  588. * @flow_dissector: list of keys to dissect
  589. * @target_container: target structure to put dissected values into
  590. * @data: raw buffer pointer to the packet, if NULL use skb->data
  591. * @proto: protocol for which to get the flow, if @data is NULL use skb->protocol
  592. * @nhoff: network header offset, if @data is NULL use skb_network_offset(skb)
  593. * @hlen: packet header length, if @data is NULL use skb_headlen(skb)
  594. *
  595. * The function will try to retrieve individual keys into target specified
  596. * by flow_dissector from either the skbuff or a raw buffer specified by the
  597. * rest parameters.
  598. *
  599. * Caller must take care of zeroing target container memory.
  600. */
  601. bool __skb_flow_dissect(const struct sk_buff *skb,
  602. struct flow_dissector *flow_dissector,
  603. void *target_container,
  604. void *data, __be16 proto, int nhoff, int hlen,
  605. unsigned int flags)
  606. {
  607. struct flow_dissector_key_control *key_control;
  608. struct flow_dissector_key_basic *key_basic;
  609. struct flow_dissector_key_addrs *key_addrs;
  610. struct flow_dissector_key_ports *key_ports;
  611. struct flow_dissector_key_icmp *key_icmp;
  612. struct flow_dissector_key_tags *key_tags;
  613. struct flow_dissector_key_vlan *key_vlan;
  614. enum flow_dissect_ret fdret;
  615. enum flow_dissector_key_id dissector_vlan = FLOW_DISSECTOR_KEY_MAX;
  616. struct bpf_prog *attached = NULL;
  617. int num_hdrs = 0;
  618. u8 ip_proto = 0;
  619. bool ret;
  620. if (!data) {
  621. data = skb->data;
  622. proto = skb_vlan_tag_present(skb) ?
  623. skb->vlan_proto : skb->protocol;
  624. nhoff = skb_network_offset(skb);
  625. hlen = skb_headlen(skb);
  626. #if IS_ENABLED(CONFIG_NET_DSA)
  627. if (unlikely(skb->dev && netdev_uses_dsa(skb->dev))) {
  628. const struct dsa_device_ops *ops;
  629. int offset;
  630. ops = skb->dev->dsa_ptr->tag_ops;
  631. if (ops->flow_dissect &&
  632. !ops->flow_dissect(skb, &proto, &offset)) {
  633. hlen -= offset;
  634. nhoff += offset;
  635. }
  636. }
  637. #endif
  638. }
  639. /* It is ensured by skb_flow_dissector_init() that control key will
  640. * be always present.
  641. */
  642. key_control = skb_flow_dissector_target(flow_dissector,
  643. FLOW_DISSECTOR_KEY_CONTROL,
  644. target_container);
  645. /* It is ensured by skb_flow_dissector_init() that basic key will
  646. * be always present.
  647. */
  648. key_basic = skb_flow_dissector_target(flow_dissector,
  649. FLOW_DISSECTOR_KEY_BASIC,
  650. target_container);
  651. rcu_read_lock();
  652. if (skb) {
  653. if (skb->dev)
  654. attached = rcu_dereference(dev_net(skb->dev)->flow_dissector_prog);
  655. else if (skb->sk)
  656. attached = rcu_dereference(sock_net(skb->sk)->flow_dissector_prog);
  657. else
  658. WARN_ON_ONCE(1);
  659. }
  660. if (attached) {
  661. /* Note that even though the const qualifier is discarded
  662. * throughout the execution of the BPF program, all changes(the
  663. * control block) are reverted after the BPF program returns.
  664. * Therefore, __skb_flow_dissect does not alter the skb.
  665. */
  666. struct bpf_flow_keys flow_keys = {};
  667. struct bpf_skb_data_end cb_saved;
  668. struct bpf_skb_data_end *cb;
  669. u32 result;
  670. cb = (struct bpf_skb_data_end *)skb->cb;
  671. /* Save Control Block */
  672. memcpy(&cb_saved, cb, sizeof(cb_saved));
  673. memset(cb, 0, sizeof(cb_saved));
  674. /* Pass parameters to the BPF program */
  675. cb->qdisc_cb.flow_keys = &flow_keys;
  676. flow_keys.nhoff = nhoff;
  677. bpf_compute_data_pointers((struct sk_buff *)skb);
  678. result = BPF_PROG_RUN(attached, skb);
  679. /* Restore state */
  680. memcpy(cb, &cb_saved, sizeof(cb_saved));
  681. __skb_flow_bpf_to_target(&flow_keys, flow_dissector,
  682. target_container);
  683. key_control->thoff = min_t(u16, key_control->thoff, skb->len);
  684. rcu_read_unlock();
  685. return result == BPF_OK;
  686. }
  687. rcu_read_unlock();
  688. if (dissector_uses_key(flow_dissector,
  689. FLOW_DISSECTOR_KEY_ETH_ADDRS)) {
  690. struct ethhdr *eth = eth_hdr(skb);
  691. struct flow_dissector_key_eth_addrs *key_eth_addrs;
  692. key_eth_addrs = skb_flow_dissector_target(flow_dissector,
  693. FLOW_DISSECTOR_KEY_ETH_ADDRS,
  694. target_container);
  695. memcpy(key_eth_addrs, &eth->h_dest, sizeof(*key_eth_addrs));
  696. }
  697. proto_again:
  698. fdret = FLOW_DISSECT_RET_CONTINUE;
  699. switch (proto) {
  700. case htons(ETH_P_IP): {
  701. const struct iphdr *iph;
  702. struct iphdr _iph;
  703. iph = __skb_header_pointer(skb, nhoff, sizeof(_iph), data, hlen, &_iph);
  704. if (!iph || iph->ihl < 5) {
  705. fdret = FLOW_DISSECT_RET_OUT_BAD;
  706. break;
  707. }
  708. nhoff += iph->ihl * 4;
  709. ip_proto = iph->protocol;
  710. if (dissector_uses_key(flow_dissector,
  711. FLOW_DISSECTOR_KEY_IPV4_ADDRS)) {
  712. key_addrs = skb_flow_dissector_target(flow_dissector,
  713. FLOW_DISSECTOR_KEY_IPV4_ADDRS,
  714. target_container);
  715. memcpy(&key_addrs->v4addrs, &iph->saddr,
  716. sizeof(key_addrs->v4addrs));
  717. key_control->addr_type = FLOW_DISSECTOR_KEY_IPV4_ADDRS;
  718. }
  719. if (ip_is_fragment(iph)) {
  720. key_control->flags |= FLOW_DIS_IS_FRAGMENT;
  721. if (iph->frag_off & htons(IP_OFFSET)) {
  722. fdret = FLOW_DISSECT_RET_OUT_GOOD;
  723. break;
  724. } else {
  725. key_control->flags |= FLOW_DIS_FIRST_FRAG;
  726. if (!(flags &
  727. FLOW_DISSECTOR_F_PARSE_1ST_FRAG)) {
  728. fdret = FLOW_DISSECT_RET_OUT_GOOD;
  729. break;
  730. }
  731. }
  732. }
  733. __skb_flow_dissect_ipv4(skb, flow_dissector,
  734. target_container, data, iph);
  735. if (flags & FLOW_DISSECTOR_F_STOP_AT_L3) {
  736. fdret = FLOW_DISSECT_RET_OUT_GOOD;
  737. break;
  738. }
  739. break;
  740. }
  741. case htons(ETH_P_IPV6): {
  742. const struct ipv6hdr *iph;
  743. struct ipv6hdr _iph;
  744. iph = __skb_header_pointer(skb, nhoff, sizeof(_iph), data, hlen, &_iph);
  745. if (!iph) {
  746. fdret = FLOW_DISSECT_RET_OUT_BAD;
  747. break;
  748. }
  749. ip_proto = iph->nexthdr;
  750. nhoff += sizeof(struct ipv6hdr);
  751. if (dissector_uses_key(flow_dissector,
  752. FLOW_DISSECTOR_KEY_IPV6_ADDRS)) {
  753. key_addrs = skb_flow_dissector_target(flow_dissector,
  754. FLOW_DISSECTOR_KEY_IPV6_ADDRS,
  755. target_container);
  756. memcpy(&key_addrs->v6addrs, &iph->saddr,
  757. sizeof(key_addrs->v6addrs));
  758. key_control->addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
  759. }
  760. if ((dissector_uses_key(flow_dissector,
  761. FLOW_DISSECTOR_KEY_FLOW_LABEL) ||
  762. (flags & FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL)) &&
  763. ip6_flowlabel(iph)) {
  764. __be32 flow_label = ip6_flowlabel(iph);
  765. if (dissector_uses_key(flow_dissector,
  766. FLOW_DISSECTOR_KEY_FLOW_LABEL)) {
  767. key_tags = skb_flow_dissector_target(flow_dissector,
  768. FLOW_DISSECTOR_KEY_FLOW_LABEL,
  769. target_container);
  770. key_tags->flow_label = ntohl(flow_label);
  771. }
  772. if (flags & FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL) {
  773. fdret = FLOW_DISSECT_RET_OUT_GOOD;
  774. break;
  775. }
  776. }
  777. __skb_flow_dissect_ipv6(skb, flow_dissector,
  778. target_container, data, iph);
  779. if (flags & FLOW_DISSECTOR_F_STOP_AT_L3)
  780. fdret = FLOW_DISSECT_RET_OUT_GOOD;
  781. break;
  782. }
  783. case htons(ETH_P_8021AD):
  784. case htons(ETH_P_8021Q): {
  785. const struct vlan_hdr *vlan = NULL;
  786. struct vlan_hdr _vlan;
  787. __be16 saved_vlan_tpid = proto;
  788. if (dissector_vlan == FLOW_DISSECTOR_KEY_MAX &&
  789. skb && skb_vlan_tag_present(skb)) {
  790. proto = skb->protocol;
  791. } else {
  792. vlan = __skb_header_pointer(skb, nhoff, sizeof(_vlan),
  793. data, hlen, &_vlan);
  794. if (!vlan) {
  795. fdret = FLOW_DISSECT_RET_OUT_BAD;
  796. break;
  797. }
  798. proto = vlan->h_vlan_encapsulated_proto;
  799. nhoff += sizeof(*vlan);
  800. }
  801. if (dissector_vlan == FLOW_DISSECTOR_KEY_MAX) {
  802. dissector_vlan = FLOW_DISSECTOR_KEY_VLAN;
  803. } else if (dissector_vlan == FLOW_DISSECTOR_KEY_VLAN) {
  804. dissector_vlan = FLOW_DISSECTOR_KEY_CVLAN;
  805. } else {
  806. fdret = FLOW_DISSECT_RET_PROTO_AGAIN;
  807. break;
  808. }
  809. if (dissector_uses_key(flow_dissector, dissector_vlan)) {
  810. key_vlan = skb_flow_dissector_target(flow_dissector,
  811. dissector_vlan,
  812. target_container);
  813. if (!vlan) {
  814. key_vlan->vlan_id = skb_vlan_tag_get_id(skb);
  815. key_vlan->vlan_priority =
  816. (skb_vlan_tag_get_prio(skb) >> VLAN_PRIO_SHIFT);
  817. } else {
  818. key_vlan->vlan_id = ntohs(vlan->h_vlan_TCI) &
  819. VLAN_VID_MASK;
  820. key_vlan->vlan_priority =
  821. (ntohs(vlan->h_vlan_TCI) &
  822. VLAN_PRIO_MASK) >> VLAN_PRIO_SHIFT;
  823. }
  824. key_vlan->vlan_tpid = saved_vlan_tpid;
  825. }
  826. fdret = FLOW_DISSECT_RET_PROTO_AGAIN;
  827. break;
  828. }
  829. case htons(ETH_P_PPP_SES): {
  830. struct {
  831. struct pppoe_hdr hdr;
  832. __be16 proto;
  833. } *hdr, _hdr;
  834. hdr = __skb_header_pointer(skb, nhoff, sizeof(_hdr), data, hlen, &_hdr);
  835. if (!hdr) {
  836. fdret = FLOW_DISSECT_RET_OUT_BAD;
  837. break;
  838. }
  839. proto = hdr->proto;
  840. nhoff += PPPOE_SES_HLEN;
  841. switch (proto) {
  842. case htons(PPP_IP):
  843. proto = htons(ETH_P_IP);
  844. fdret = FLOW_DISSECT_RET_PROTO_AGAIN;
  845. break;
  846. case htons(PPP_IPV6):
  847. proto = htons(ETH_P_IPV6);
  848. fdret = FLOW_DISSECT_RET_PROTO_AGAIN;
  849. break;
  850. default:
  851. fdret = FLOW_DISSECT_RET_OUT_BAD;
  852. break;
  853. }
  854. break;
  855. }
  856. case htons(ETH_P_TIPC): {
  857. struct tipc_basic_hdr *hdr, _hdr;
  858. hdr = __skb_header_pointer(skb, nhoff, sizeof(_hdr),
  859. data, hlen, &_hdr);
  860. if (!hdr) {
  861. fdret = FLOW_DISSECT_RET_OUT_BAD;
  862. break;
  863. }
  864. if (dissector_uses_key(flow_dissector,
  865. FLOW_DISSECTOR_KEY_TIPC)) {
  866. key_addrs = skb_flow_dissector_target(flow_dissector,
  867. FLOW_DISSECTOR_KEY_TIPC,
  868. target_container);
  869. key_addrs->tipckey.key = tipc_hdr_rps_key(hdr);
  870. key_control->addr_type = FLOW_DISSECTOR_KEY_TIPC;
  871. }
  872. fdret = FLOW_DISSECT_RET_OUT_GOOD;
  873. break;
  874. }
  875. case htons(ETH_P_MPLS_UC):
  876. case htons(ETH_P_MPLS_MC):
  877. fdret = __skb_flow_dissect_mpls(skb, flow_dissector,
  878. target_container, data,
  879. nhoff, hlen);
  880. break;
  881. case htons(ETH_P_FCOE):
  882. if ((hlen - nhoff) < FCOE_HEADER_LEN) {
  883. fdret = FLOW_DISSECT_RET_OUT_BAD;
  884. break;
  885. }
  886. nhoff += FCOE_HEADER_LEN;
  887. fdret = FLOW_DISSECT_RET_OUT_GOOD;
  888. break;
  889. case htons(ETH_P_ARP):
  890. case htons(ETH_P_RARP):
  891. fdret = __skb_flow_dissect_arp(skb, flow_dissector,
  892. target_container, data,
  893. nhoff, hlen);
  894. break;
  895. case htons(ETH_P_BATMAN):
  896. fdret = __skb_flow_dissect_batadv(skb, key_control, data,
  897. &proto, &nhoff, hlen, flags);
  898. break;
  899. default:
  900. fdret = FLOW_DISSECT_RET_OUT_BAD;
  901. break;
  902. }
  903. /* Process result of proto processing */
  904. switch (fdret) {
  905. case FLOW_DISSECT_RET_OUT_GOOD:
  906. goto out_good;
  907. case FLOW_DISSECT_RET_PROTO_AGAIN:
  908. if (skb_flow_dissect_allowed(&num_hdrs))
  909. goto proto_again;
  910. goto out_good;
  911. case FLOW_DISSECT_RET_CONTINUE:
  912. case FLOW_DISSECT_RET_IPPROTO_AGAIN:
  913. break;
  914. case FLOW_DISSECT_RET_OUT_BAD:
  915. default:
  916. goto out_bad;
  917. }
  918. ip_proto_again:
  919. fdret = FLOW_DISSECT_RET_CONTINUE;
  920. switch (ip_proto) {
  921. case IPPROTO_GRE:
  922. fdret = __skb_flow_dissect_gre(skb, key_control, flow_dissector,
  923. target_container, data,
  924. &proto, &nhoff, &hlen, flags);
  925. break;
  926. case NEXTHDR_HOP:
  927. case NEXTHDR_ROUTING:
  928. case NEXTHDR_DEST: {
  929. u8 _opthdr[2], *opthdr;
  930. if (proto != htons(ETH_P_IPV6))
  931. break;
  932. opthdr = __skb_header_pointer(skb, nhoff, sizeof(_opthdr),
  933. data, hlen, &_opthdr);
  934. if (!opthdr) {
  935. fdret = FLOW_DISSECT_RET_OUT_BAD;
  936. break;
  937. }
  938. ip_proto = opthdr[0];
  939. nhoff += (opthdr[1] + 1) << 3;
  940. fdret = FLOW_DISSECT_RET_IPPROTO_AGAIN;
  941. break;
  942. }
  943. case NEXTHDR_FRAGMENT: {
  944. struct frag_hdr _fh, *fh;
  945. if (proto != htons(ETH_P_IPV6))
  946. break;
  947. fh = __skb_header_pointer(skb, nhoff, sizeof(_fh),
  948. data, hlen, &_fh);
  949. if (!fh) {
  950. fdret = FLOW_DISSECT_RET_OUT_BAD;
  951. break;
  952. }
  953. key_control->flags |= FLOW_DIS_IS_FRAGMENT;
  954. nhoff += sizeof(_fh);
  955. ip_proto = fh->nexthdr;
  956. if (!(fh->frag_off & htons(IP6_OFFSET))) {
  957. key_control->flags |= FLOW_DIS_FIRST_FRAG;
  958. if (flags & FLOW_DISSECTOR_F_PARSE_1ST_FRAG) {
  959. fdret = FLOW_DISSECT_RET_IPPROTO_AGAIN;
  960. break;
  961. }
  962. }
  963. fdret = FLOW_DISSECT_RET_OUT_GOOD;
  964. break;
  965. }
  966. case IPPROTO_IPIP:
  967. proto = htons(ETH_P_IP);
  968. key_control->flags |= FLOW_DIS_ENCAPSULATION;
  969. if (flags & FLOW_DISSECTOR_F_STOP_AT_ENCAP) {
  970. fdret = FLOW_DISSECT_RET_OUT_GOOD;
  971. break;
  972. }
  973. fdret = FLOW_DISSECT_RET_PROTO_AGAIN;
  974. break;
  975. case IPPROTO_IPV6:
  976. proto = htons(ETH_P_IPV6);
  977. key_control->flags |= FLOW_DIS_ENCAPSULATION;
  978. if (flags & FLOW_DISSECTOR_F_STOP_AT_ENCAP) {
  979. fdret = FLOW_DISSECT_RET_OUT_GOOD;
  980. break;
  981. }
  982. fdret = FLOW_DISSECT_RET_PROTO_AGAIN;
  983. break;
  984. case IPPROTO_MPLS:
  985. proto = htons(ETH_P_MPLS_UC);
  986. fdret = FLOW_DISSECT_RET_PROTO_AGAIN;
  987. break;
  988. case IPPROTO_TCP:
  989. __skb_flow_dissect_tcp(skb, flow_dissector, target_container,
  990. data, nhoff, hlen);
  991. break;
  992. default:
  993. break;
  994. }
  995. if (dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_PORTS) &&
  996. !(key_control->flags & FLOW_DIS_IS_FRAGMENT)) {
  997. key_ports = skb_flow_dissector_target(flow_dissector,
  998. FLOW_DISSECTOR_KEY_PORTS,
  999. target_container);
  1000. key_ports->ports = __skb_flow_get_ports(skb, nhoff, ip_proto,
  1001. data, hlen);
  1002. }
  1003. if (dissector_uses_key(flow_dissector,
  1004. FLOW_DISSECTOR_KEY_ICMP)) {
  1005. key_icmp = skb_flow_dissector_target(flow_dissector,
  1006. FLOW_DISSECTOR_KEY_ICMP,
  1007. target_container);
  1008. key_icmp->icmp = skb_flow_get_be16(skb, nhoff, data, hlen);
  1009. }
  1010. /* Process result of IP proto processing */
  1011. switch (fdret) {
  1012. case FLOW_DISSECT_RET_PROTO_AGAIN:
  1013. if (skb_flow_dissect_allowed(&num_hdrs))
  1014. goto proto_again;
  1015. break;
  1016. case FLOW_DISSECT_RET_IPPROTO_AGAIN:
  1017. if (skb_flow_dissect_allowed(&num_hdrs))
  1018. goto ip_proto_again;
  1019. break;
  1020. case FLOW_DISSECT_RET_OUT_GOOD:
  1021. case FLOW_DISSECT_RET_CONTINUE:
  1022. break;
  1023. case FLOW_DISSECT_RET_OUT_BAD:
  1024. default:
  1025. goto out_bad;
  1026. }
  1027. out_good:
  1028. ret = true;
  1029. out:
  1030. key_control->thoff = min_t(u16, nhoff, skb ? skb->len : hlen);
  1031. key_basic->n_proto = proto;
  1032. key_basic->ip_proto = ip_proto;
  1033. return ret;
  1034. out_bad:
  1035. ret = false;
  1036. goto out;
  1037. }
  1038. EXPORT_SYMBOL(__skb_flow_dissect);
  1039. static u32 hashrnd __read_mostly;
  1040. static __always_inline void __flow_hash_secret_init(void)
  1041. {
  1042. net_get_random_once(&hashrnd, sizeof(hashrnd));
  1043. }
  1044. static __always_inline u32 __flow_hash_words(const u32 *words, u32 length,
  1045. u32 keyval)
  1046. {
  1047. return jhash2(words, length, keyval);
  1048. }
  1049. static inline const u32 *flow_keys_hash_start(const struct flow_keys *flow)
  1050. {
  1051. const void *p = flow;
  1052. BUILD_BUG_ON(FLOW_KEYS_HASH_OFFSET % sizeof(u32));
  1053. return (const u32 *)(p + FLOW_KEYS_HASH_OFFSET);
  1054. }
  1055. static inline size_t flow_keys_hash_length(const struct flow_keys *flow)
  1056. {
  1057. size_t diff = FLOW_KEYS_HASH_OFFSET + sizeof(flow->addrs);
  1058. BUILD_BUG_ON((sizeof(*flow) - FLOW_KEYS_HASH_OFFSET) % sizeof(u32));
  1059. BUILD_BUG_ON(offsetof(typeof(*flow), addrs) !=
  1060. sizeof(*flow) - sizeof(flow->addrs));
  1061. switch (flow->control.addr_type) {
  1062. case FLOW_DISSECTOR_KEY_IPV4_ADDRS:
  1063. diff -= sizeof(flow->addrs.v4addrs);
  1064. break;
  1065. case FLOW_DISSECTOR_KEY_IPV6_ADDRS:
  1066. diff -= sizeof(flow->addrs.v6addrs);
  1067. break;
  1068. case FLOW_DISSECTOR_KEY_TIPC:
  1069. diff -= sizeof(flow->addrs.tipckey);
  1070. break;
  1071. }
  1072. return (sizeof(*flow) - diff) / sizeof(u32);
  1073. }
  1074. __be32 flow_get_u32_src(const struct flow_keys *flow)
  1075. {
  1076. switch (flow->control.addr_type) {
  1077. case FLOW_DISSECTOR_KEY_IPV4_ADDRS:
  1078. return flow->addrs.v4addrs.src;
  1079. case FLOW_DISSECTOR_KEY_IPV6_ADDRS:
  1080. return (__force __be32)ipv6_addr_hash(
  1081. &flow->addrs.v6addrs.src);
  1082. case FLOW_DISSECTOR_KEY_TIPC:
  1083. return flow->addrs.tipckey.key;
  1084. default:
  1085. return 0;
  1086. }
  1087. }
  1088. EXPORT_SYMBOL(flow_get_u32_src);
  1089. __be32 flow_get_u32_dst(const struct flow_keys *flow)
  1090. {
  1091. switch (flow->control.addr_type) {
  1092. case FLOW_DISSECTOR_KEY_IPV4_ADDRS:
  1093. return flow->addrs.v4addrs.dst;
  1094. case FLOW_DISSECTOR_KEY_IPV6_ADDRS:
  1095. return (__force __be32)ipv6_addr_hash(
  1096. &flow->addrs.v6addrs.dst);
  1097. default:
  1098. return 0;
  1099. }
  1100. }
  1101. EXPORT_SYMBOL(flow_get_u32_dst);
  1102. static inline void __flow_hash_consistentify(struct flow_keys *keys)
  1103. {
  1104. int addr_diff, i;
  1105. switch (keys->control.addr_type) {
  1106. case FLOW_DISSECTOR_KEY_IPV4_ADDRS:
  1107. addr_diff = (__force u32)keys->addrs.v4addrs.dst -
  1108. (__force u32)keys->addrs.v4addrs.src;
  1109. if ((addr_diff < 0) ||
  1110. (addr_diff == 0 &&
  1111. ((__force u16)keys->ports.dst <
  1112. (__force u16)keys->ports.src))) {
  1113. swap(keys->addrs.v4addrs.src, keys->addrs.v4addrs.dst);
  1114. swap(keys->ports.src, keys->ports.dst);
  1115. }
  1116. break;
  1117. case FLOW_DISSECTOR_KEY_IPV6_ADDRS:
  1118. addr_diff = memcmp(&keys->addrs.v6addrs.dst,
  1119. &keys->addrs.v6addrs.src,
  1120. sizeof(keys->addrs.v6addrs.dst));
  1121. if ((addr_diff < 0) ||
  1122. (addr_diff == 0 &&
  1123. ((__force u16)keys->ports.dst <
  1124. (__force u16)keys->ports.src))) {
  1125. for (i = 0; i < 4; i++)
  1126. swap(keys->addrs.v6addrs.src.s6_addr32[i],
  1127. keys->addrs.v6addrs.dst.s6_addr32[i]);
  1128. swap(keys->ports.src, keys->ports.dst);
  1129. }
  1130. break;
  1131. }
  1132. }
  1133. static inline u32 __flow_hash_from_keys(struct flow_keys *keys, u32 keyval)
  1134. {
  1135. u32 hash;
  1136. __flow_hash_consistentify(keys);
  1137. hash = __flow_hash_words(flow_keys_hash_start(keys),
  1138. flow_keys_hash_length(keys), keyval);
  1139. if (!hash)
  1140. hash = 1;
  1141. return hash;
  1142. }
  1143. u32 flow_hash_from_keys(struct flow_keys *keys)
  1144. {
  1145. __flow_hash_secret_init();
  1146. return __flow_hash_from_keys(keys, hashrnd);
  1147. }
  1148. EXPORT_SYMBOL(flow_hash_from_keys);
  1149. static inline u32 ___skb_get_hash(const struct sk_buff *skb,
  1150. struct flow_keys *keys, u32 keyval)
  1151. {
  1152. skb_flow_dissect_flow_keys(skb, keys,
  1153. FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL);
  1154. return __flow_hash_from_keys(keys, keyval);
  1155. }
  1156. struct _flow_keys_digest_data {
  1157. __be16 n_proto;
  1158. u8 ip_proto;
  1159. u8 padding;
  1160. __be32 ports;
  1161. __be32 src;
  1162. __be32 dst;
  1163. };
  1164. void make_flow_keys_digest(struct flow_keys_digest *digest,
  1165. const struct flow_keys *flow)
  1166. {
  1167. struct _flow_keys_digest_data *data =
  1168. (struct _flow_keys_digest_data *)digest;
  1169. BUILD_BUG_ON(sizeof(*data) > sizeof(*digest));
  1170. memset(digest, 0, sizeof(*digest));
  1171. data->n_proto = flow->basic.n_proto;
  1172. data->ip_proto = flow->basic.ip_proto;
  1173. data->ports = flow->ports.ports;
  1174. data->src = flow->addrs.v4addrs.src;
  1175. data->dst = flow->addrs.v4addrs.dst;
  1176. }
  1177. EXPORT_SYMBOL(make_flow_keys_digest);
  1178. static struct flow_dissector flow_keys_dissector_symmetric __read_mostly;
  1179. u32 __skb_get_hash_symmetric(const struct sk_buff *skb)
  1180. {
  1181. struct flow_keys keys;
  1182. __flow_hash_secret_init();
  1183. memset(&keys, 0, sizeof(keys));
  1184. __skb_flow_dissect(skb, &flow_keys_dissector_symmetric, &keys,
  1185. NULL, 0, 0, 0,
  1186. FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL);
  1187. return __flow_hash_from_keys(&keys, hashrnd);
  1188. }
  1189. EXPORT_SYMBOL_GPL(__skb_get_hash_symmetric);
  1190. /**
  1191. * __skb_get_hash: calculate a flow hash
  1192. * @skb: sk_buff to calculate flow hash from
  1193. *
  1194. * This function calculates a flow hash based on src/dst addresses
  1195. * and src/dst port numbers. Sets hash in skb to non-zero hash value
  1196. * on success, zero indicates no valid hash. Also, sets l4_hash in skb
  1197. * if hash is a canonical 4-tuple hash over transport ports.
  1198. */
  1199. void __skb_get_hash(struct sk_buff *skb)
  1200. {
  1201. struct flow_keys keys;
  1202. u32 hash;
  1203. __flow_hash_secret_init();
  1204. hash = ___skb_get_hash(skb, &keys, hashrnd);
  1205. __skb_set_sw_hash(skb, hash, flow_keys_have_l4(&keys));
  1206. }
  1207. EXPORT_SYMBOL(__skb_get_hash);
  1208. __u32 skb_get_hash_perturb(const struct sk_buff *skb, u32 perturb)
  1209. {
  1210. struct flow_keys keys;
  1211. return ___skb_get_hash(skb, &keys, perturb);
  1212. }
  1213. EXPORT_SYMBOL(skb_get_hash_perturb);
  1214. u32 __skb_get_poff(const struct sk_buff *skb, void *data,
  1215. const struct flow_keys_basic *keys, int hlen)
  1216. {
  1217. u32 poff = keys->control.thoff;
  1218. /* skip L4 headers for fragments after the first */
  1219. if ((keys->control.flags & FLOW_DIS_IS_FRAGMENT) &&
  1220. !(keys->control.flags & FLOW_DIS_FIRST_FRAG))
  1221. return poff;
  1222. switch (keys->basic.ip_proto) {
  1223. case IPPROTO_TCP: {
  1224. /* access doff as u8 to avoid unaligned access */
  1225. const u8 *doff;
  1226. u8 _doff;
  1227. doff = __skb_header_pointer(skb, poff + 12, sizeof(_doff),
  1228. data, hlen, &_doff);
  1229. if (!doff)
  1230. return poff;
  1231. poff += max_t(u32, sizeof(struct tcphdr), (*doff & 0xF0) >> 2);
  1232. break;
  1233. }
  1234. case IPPROTO_UDP:
  1235. case IPPROTO_UDPLITE:
  1236. poff += sizeof(struct udphdr);
  1237. break;
  1238. /* For the rest, we do not really care about header
  1239. * extensions at this point for now.
  1240. */
  1241. case IPPROTO_ICMP:
  1242. poff += sizeof(struct icmphdr);
  1243. break;
  1244. case IPPROTO_ICMPV6:
  1245. poff += sizeof(struct icmp6hdr);
  1246. break;
  1247. case IPPROTO_IGMP:
  1248. poff += sizeof(struct igmphdr);
  1249. break;
  1250. case IPPROTO_DCCP:
  1251. poff += sizeof(struct dccp_hdr);
  1252. break;
  1253. case IPPROTO_SCTP:
  1254. poff += sizeof(struct sctphdr);
  1255. break;
  1256. }
  1257. return poff;
  1258. }
  1259. /**
  1260. * skb_get_poff - get the offset to the payload
  1261. * @skb: sk_buff to get the payload offset from
  1262. *
  1263. * The function will get the offset to the payload as far as it could
  1264. * be dissected. The main user is currently BPF, so that we can dynamically
  1265. * truncate packets without needing to push actual payload to the user
  1266. * space and can analyze headers only, instead.
  1267. */
  1268. u32 skb_get_poff(const struct sk_buff *skb)
  1269. {
  1270. struct flow_keys_basic keys;
  1271. if (!skb_flow_dissect_flow_keys_basic(skb, &keys, NULL, 0, 0, 0, 0))
  1272. return 0;
  1273. return __skb_get_poff(skb, skb->data, &keys, skb_headlen(skb));
  1274. }
  1275. __u32 __get_hash_from_flowi6(const struct flowi6 *fl6, struct flow_keys *keys)
  1276. {
  1277. memset(keys, 0, sizeof(*keys));
  1278. memcpy(&keys->addrs.v6addrs.src, &fl6->saddr,
  1279. sizeof(keys->addrs.v6addrs.src));
  1280. memcpy(&keys->addrs.v6addrs.dst, &fl6->daddr,
  1281. sizeof(keys->addrs.v6addrs.dst));
  1282. keys->control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
  1283. keys->ports.src = fl6->fl6_sport;
  1284. keys->ports.dst = fl6->fl6_dport;
  1285. keys->keyid.keyid = fl6->fl6_gre_key;
  1286. keys->tags.flow_label = (__force u32)flowi6_get_flowlabel(fl6);
  1287. keys->basic.ip_proto = fl6->flowi6_proto;
  1288. return flow_hash_from_keys(keys);
  1289. }
  1290. EXPORT_SYMBOL(__get_hash_from_flowi6);
  1291. static const struct flow_dissector_key flow_keys_dissector_keys[] = {
  1292. {
  1293. .key_id = FLOW_DISSECTOR_KEY_CONTROL,
  1294. .offset = offsetof(struct flow_keys, control),
  1295. },
  1296. {
  1297. .key_id = FLOW_DISSECTOR_KEY_BASIC,
  1298. .offset = offsetof(struct flow_keys, basic),
  1299. },
  1300. {
  1301. .key_id = FLOW_DISSECTOR_KEY_IPV4_ADDRS,
  1302. .offset = offsetof(struct flow_keys, addrs.v4addrs),
  1303. },
  1304. {
  1305. .key_id = FLOW_DISSECTOR_KEY_IPV6_ADDRS,
  1306. .offset = offsetof(struct flow_keys, addrs.v6addrs),
  1307. },
  1308. {
  1309. .key_id = FLOW_DISSECTOR_KEY_TIPC,
  1310. .offset = offsetof(struct flow_keys, addrs.tipckey),
  1311. },
  1312. {
  1313. .key_id = FLOW_DISSECTOR_KEY_PORTS,
  1314. .offset = offsetof(struct flow_keys, ports),
  1315. },
  1316. {
  1317. .key_id = FLOW_DISSECTOR_KEY_VLAN,
  1318. .offset = offsetof(struct flow_keys, vlan),
  1319. },
  1320. {
  1321. .key_id = FLOW_DISSECTOR_KEY_FLOW_LABEL,
  1322. .offset = offsetof(struct flow_keys, tags),
  1323. },
  1324. {
  1325. .key_id = FLOW_DISSECTOR_KEY_GRE_KEYID,
  1326. .offset = offsetof(struct flow_keys, keyid),
  1327. },
  1328. };
  1329. static const struct flow_dissector_key flow_keys_dissector_symmetric_keys[] = {
  1330. {
  1331. .key_id = FLOW_DISSECTOR_KEY_CONTROL,
  1332. .offset = offsetof(struct flow_keys, control),
  1333. },
  1334. {
  1335. .key_id = FLOW_DISSECTOR_KEY_BASIC,
  1336. .offset = offsetof(struct flow_keys, basic),
  1337. },
  1338. {
  1339. .key_id = FLOW_DISSECTOR_KEY_IPV4_ADDRS,
  1340. .offset = offsetof(struct flow_keys, addrs.v4addrs),
  1341. },
  1342. {
  1343. .key_id = FLOW_DISSECTOR_KEY_IPV6_ADDRS,
  1344. .offset = offsetof(struct flow_keys, addrs.v6addrs),
  1345. },
  1346. {
  1347. .key_id = FLOW_DISSECTOR_KEY_PORTS,
  1348. .offset = offsetof(struct flow_keys, ports),
  1349. },
  1350. };
  1351. static const struct flow_dissector_key flow_keys_basic_dissector_keys[] = {
  1352. {
  1353. .key_id = FLOW_DISSECTOR_KEY_CONTROL,
  1354. .offset = offsetof(struct flow_keys, control),
  1355. },
  1356. {
  1357. .key_id = FLOW_DISSECTOR_KEY_BASIC,
  1358. .offset = offsetof(struct flow_keys, basic),
  1359. },
  1360. };
  1361. struct flow_dissector flow_keys_dissector __read_mostly;
  1362. EXPORT_SYMBOL(flow_keys_dissector);
  1363. struct flow_dissector flow_keys_basic_dissector __read_mostly;
  1364. EXPORT_SYMBOL(flow_keys_basic_dissector);
  1365. static int __init init_default_flow_dissectors(void)
  1366. {
  1367. skb_flow_dissector_init(&flow_keys_dissector,
  1368. flow_keys_dissector_keys,
  1369. ARRAY_SIZE(flow_keys_dissector_keys));
  1370. skb_flow_dissector_init(&flow_keys_dissector_symmetric,
  1371. flow_keys_dissector_symmetric_keys,
  1372. ARRAY_SIZE(flow_keys_dissector_symmetric_keys));
  1373. skb_flow_dissector_init(&flow_keys_basic_dissector,
  1374. flow_keys_basic_dissector_keys,
  1375. ARRAY_SIZE(flow_keys_basic_dissector_keys));
  1376. return 0;
  1377. }
  1378. core_initcall(init_default_flow_dissectors);