ip_tunnel_core.c 31 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2013 Nicira, Inc.
  4. */
  5. #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  6. #include <linux/types.h>
  7. #include <linux/kernel.h>
  8. #include <linux/skbuff.h>
  9. #include <linux/netdevice.h>
  10. #include <linux/in.h>
  11. #include <linux/if_arp.h>
  12. #include <linux/init.h>
  13. #include <linux/in6.h>
  14. #include <linux/inetdevice.h>
  15. #include <linux/netfilter_ipv4.h>
  16. #include <linux/etherdevice.h>
  17. #include <linux/if_ether.h>
  18. #include <linux/if_vlan.h>
  19. #include <linux/static_key.h>
  20. #include <net/ip.h>
  21. #include <net/icmp.h>
  22. #include <net/protocol.h>
  23. #include <net/ip_tunnels.h>
  24. #include <net/ip6_tunnel.h>
  25. #include <net/ip6_checksum.h>
  26. #include <net/arp.h>
  27. #include <net/checksum.h>
  28. #include <net/dsfield.h>
  29. #include <net/inet_ecn.h>
  30. #include <net/xfrm.h>
  31. #include <net/net_namespace.h>
  32. #include <net/netns/generic.h>
  33. #include <net/rtnetlink.h>
  34. #include <net/dst_metadata.h>
  35. #include <net/geneve.h>
  36. #include <net/vxlan.h>
  37. #include <net/erspan.h>
  38. const struct ip_tunnel_encap_ops __rcu *
  39. iptun_encaps[MAX_IPTUN_ENCAP_OPS] __read_mostly;
  40. EXPORT_SYMBOL(iptun_encaps);
  41. const struct ip6_tnl_encap_ops __rcu *
  42. ip6tun_encaps[MAX_IPTUN_ENCAP_OPS] __read_mostly;
  43. EXPORT_SYMBOL(ip6tun_encaps);
  44. void iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb,
  45. __be32 src, __be32 dst, __u8 proto,
  46. __u8 tos, __u8 ttl, __be16 df, bool xnet)
  47. {
  48. int pkt_len = skb->len - skb_inner_network_offset(skb);
  49. struct net *net = dev_net(rt->dst.dev);
  50. struct net_device *dev = skb->dev;
  51. struct iphdr *iph;
  52. int err;
  53. skb_scrub_packet(skb, xnet);
  54. skb_clear_hash_if_not_l4(skb);
  55. skb_dst_set(skb, &rt->dst);
  56. memset(IPCB(skb), 0, sizeof(*IPCB(skb)));
  57. /* Push down and install the IP header. */
  58. skb_push(skb, sizeof(struct iphdr));
  59. skb_reset_network_header(skb);
  60. iph = ip_hdr(skb);
  61. iph->version = 4;
  62. iph->ihl = sizeof(struct iphdr) >> 2;
  63. iph->frag_off = ip_mtu_locked(&rt->dst) ? 0 : df;
  64. iph->protocol = proto;
  65. iph->tos = tos;
  66. iph->daddr = dst;
  67. iph->saddr = src;
  68. iph->ttl = ttl;
  69. __ip_select_ident(net, iph, skb_shinfo(skb)->gso_segs ?: 1);
  70. err = ip_local_out(net, sk, skb);
  71. if (dev) {
  72. if (unlikely(net_xmit_eval(err)))
  73. pkt_len = 0;
  74. iptunnel_xmit_stats(dev, pkt_len);
  75. }
  76. }
  77. EXPORT_SYMBOL_GPL(iptunnel_xmit);
  78. int __iptunnel_pull_header(struct sk_buff *skb, int hdr_len,
  79. __be16 inner_proto, bool raw_proto, bool xnet)
  80. {
  81. if (unlikely(!pskb_may_pull(skb, hdr_len)))
  82. return -ENOMEM;
  83. skb_pull_rcsum(skb, hdr_len);
  84. if (!raw_proto && inner_proto == htons(ETH_P_TEB)) {
  85. struct ethhdr *eh;
  86. if (unlikely(!pskb_may_pull(skb, ETH_HLEN)))
  87. return -ENOMEM;
  88. eh = (struct ethhdr *)skb->data;
  89. if (likely(eth_proto_is_802_3(eh->h_proto)))
  90. skb->protocol = eh->h_proto;
  91. else
  92. skb->protocol = htons(ETH_P_802_2);
  93. } else {
  94. skb->protocol = inner_proto;
  95. }
  96. skb_clear_hash_if_not_l4(skb);
  97. __vlan_hwaccel_clear_tag(skb);
  98. skb_set_queue_mapping(skb, 0);
  99. skb_scrub_packet(skb, xnet);
  100. return iptunnel_pull_offloads(skb);
  101. }
  102. EXPORT_SYMBOL_GPL(__iptunnel_pull_header);
  103. struct metadata_dst *iptunnel_metadata_reply(struct metadata_dst *md,
  104. gfp_t flags)
  105. {
  106. IP_TUNNEL_DECLARE_FLAGS(tun_flags) = { };
  107. struct metadata_dst *res;
  108. struct ip_tunnel_info *dst, *src;
  109. if (!md || md->type != METADATA_IP_TUNNEL ||
  110. md->u.tun_info.mode & IP_TUNNEL_INFO_TX)
  111. return NULL;
  112. src = &md->u.tun_info;
  113. res = metadata_dst_alloc(src->options_len, METADATA_IP_TUNNEL, flags);
  114. if (!res)
  115. return NULL;
  116. dst = &res->u.tun_info;
  117. dst->key.tun_id = src->key.tun_id;
  118. if (src->mode & IP_TUNNEL_INFO_IPV6)
  119. memcpy(&dst->key.u.ipv6.dst, &src->key.u.ipv6.src,
  120. sizeof(struct in6_addr));
  121. else
  122. dst->key.u.ipv4.dst = src->key.u.ipv4.src;
  123. ip_tunnel_flags_copy(dst->key.tun_flags, src->key.tun_flags);
  124. dst->mode = src->mode | IP_TUNNEL_INFO_TX;
  125. ip_tunnel_info_opts_set(dst, ip_tunnel_info_opts(src),
  126. src->options_len, tun_flags);
  127. return res;
  128. }
  129. EXPORT_SYMBOL_GPL(iptunnel_metadata_reply);
  130. int iptunnel_handle_offloads(struct sk_buff *skb,
  131. int gso_type_mask)
  132. {
  133. int err;
  134. if (likely(!skb->encapsulation)) {
  135. skb_reset_inner_headers(skb);
  136. skb->encapsulation = 1;
  137. }
  138. if (skb_is_gso(skb)) {
  139. err = skb_header_unclone(skb, GFP_ATOMIC);
  140. if (unlikely(err))
  141. return err;
  142. skb_shinfo(skb)->gso_type |= gso_type_mask;
  143. return 0;
  144. }
  145. if (skb->ip_summed != CHECKSUM_PARTIAL) {
  146. skb->ip_summed = CHECKSUM_NONE;
  147. /* We clear encapsulation here to prevent badly-written
  148. * drivers potentially deciding to offload an inner checksum
  149. * if we set CHECKSUM_PARTIAL on the outer header.
  150. * This should go away when the drivers are all fixed.
  151. */
  152. skb->encapsulation = 0;
  153. }
  154. return 0;
  155. }
  156. EXPORT_SYMBOL_GPL(iptunnel_handle_offloads);
  157. /**
  158. * iptunnel_pmtud_build_icmp() - Build ICMP error message for PMTUD
  159. * @skb: Original packet with L2 header
  160. * @mtu: MTU value for ICMP error
  161. *
  162. * Return: length on success, negative error code if message couldn't be built.
  163. */
  164. static int iptunnel_pmtud_build_icmp(struct sk_buff *skb, int mtu)
  165. {
  166. const struct iphdr *iph = ip_hdr(skb);
  167. struct icmphdr *icmph;
  168. struct iphdr *niph;
  169. struct ethhdr eh;
  170. int len, err;
  171. if (!pskb_may_pull(skb, ETH_HLEN + sizeof(struct iphdr)))
  172. return -EINVAL;
  173. if (skb_is_gso(skb))
  174. skb_gso_reset(skb);
  175. skb_copy_bits(skb, skb_mac_offset(skb), &eh, ETH_HLEN);
  176. pskb_pull(skb, ETH_HLEN);
  177. skb_reset_network_header(skb);
  178. err = pskb_trim(skb, 576 - sizeof(*niph) - sizeof(*icmph));
  179. if (err)
  180. return err;
  181. len = skb->len + sizeof(*icmph);
  182. err = skb_cow(skb, sizeof(*niph) + sizeof(*icmph) + ETH_HLEN);
  183. if (err)
  184. return err;
  185. icmph = skb_push(skb, sizeof(*icmph));
  186. *icmph = (struct icmphdr) {
  187. .type = ICMP_DEST_UNREACH,
  188. .code = ICMP_FRAG_NEEDED,
  189. .checksum = 0,
  190. .un.frag.__unused = 0,
  191. .un.frag.mtu = htons(mtu),
  192. };
  193. icmph->checksum = csum_fold(skb_checksum(skb, 0, len, 0));
  194. skb_reset_transport_header(skb);
  195. niph = skb_push(skb, sizeof(*niph));
  196. *niph = (struct iphdr) {
  197. .ihl = sizeof(*niph) / 4u,
  198. .version = 4,
  199. .tos = 0,
  200. .tot_len = htons(len + sizeof(*niph)),
  201. .id = 0,
  202. .frag_off = htons(IP_DF),
  203. .ttl = iph->ttl,
  204. .protocol = IPPROTO_ICMP,
  205. .saddr = iph->daddr,
  206. .daddr = iph->saddr,
  207. };
  208. ip_send_check(niph);
  209. skb_reset_network_header(skb);
  210. skb->ip_summed = CHECKSUM_NONE;
  211. eth_header(skb, skb->dev, ntohs(eh.h_proto), eh.h_source, eh.h_dest, 0);
  212. skb_reset_mac_header(skb);
  213. return skb->len;
  214. }
  215. /**
  216. * iptunnel_pmtud_check_icmp() - Trigger ICMP reply if needed and allowed
  217. * @skb: Buffer being sent by encapsulation, L2 headers expected
  218. * @mtu: Network MTU for path
  219. *
  220. * Return: 0 for no ICMP reply, length if built, negative value on error.
  221. */
  222. static int iptunnel_pmtud_check_icmp(struct sk_buff *skb, int mtu)
  223. {
  224. const struct icmphdr *icmph = icmp_hdr(skb);
  225. const struct iphdr *iph = ip_hdr(skb);
  226. if (mtu < 576 || iph->frag_off != htons(IP_DF))
  227. return 0;
  228. if (ipv4_is_lbcast(iph->daddr) || ipv4_is_multicast(iph->daddr) ||
  229. ipv4_is_zeronet(iph->saddr) || ipv4_is_loopback(iph->saddr) ||
  230. ipv4_is_lbcast(iph->saddr) || ipv4_is_multicast(iph->saddr))
  231. return 0;
  232. if (iph->protocol == IPPROTO_ICMP && icmp_is_err(icmph->type))
  233. return 0;
  234. return iptunnel_pmtud_build_icmp(skb, mtu);
  235. }
  236. #if IS_ENABLED(CONFIG_IPV6)
  237. /**
  238. * iptunnel_pmtud_build_icmpv6() - Build ICMPv6 error message for PMTUD
  239. * @skb: Original packet with L2 header
  240. * @mtu: MTU value for ICMPv6 error
  241. *
  242. * Return: length on success, negative error code if message couldn't be built.
  243. */
  244. static int iptunnel_pmtud_build_icmpv6(struct sk_buff *skb, int mtu)
  245. {
  246. const struct ipv6hdr *ip6h = ipv6_hdr(skb);
  247. struct icmp6hdr *icmp6h;
  248. struct ipv6hdr *nip6h;
  249. struct ethhdr eh;
  250. int len, err;
  251. __wsum csum;
  252. if (!pskb_may_pull(skb, ETH_HLEN + sizeof(struct ipv6hdr)))
  253. return -EINVAL;
  254. if (skb_is_gso(skb))
  255. skb_gso_reset(skb);
  256. skb_copy_bits(skb, skb_mac_offset(skb), &eh, ETH_HLEN);
  257. pskb_pull(skb, ETH_HLEN);
  258. skb_reset_network_header(skb);
  259. err = pskb_trim(skb, IPV6_MIN_MTU - sizeof(*nip6h) - sizeof(*icmp6h));
  260. if (err)
  261. return err;
  262. len = skb->len + sizeof(*icmp6h);
  263. err = skb_cow(skb, sizeof(*nip6h) + sizeof(*icmp6h) + ETH_HLEN);
  264. if (err)
  265. return err;
  266. icmp6h = skb_push(skb, sizeof(*icmp6h));
  267. *icmp6h = (struct icmp6hdr) {
  268. .icmp6_type = ICMPV6_PKT_TOOBIG,
  269. .icmp6_code = 0,
  270. .icmp6_cksum = 0,
  271. .icmp6_mtu = htonl(mtu),
  272. };
  273. skb_reset_transport_header(skb);
  274. nip6h = skb_push(skb, sizeof(*nip6h));
  275. *nip6h = (struct ipv6hdr) {
  276. .priority = 0,
  277. .version = 6,
  278. .flow_lbl = { 0 },
  279. .payload_len = htons(len),
  280. .nexthdr = IPPROTO_ICMPV6,
  281. .hop_limit = ip6h->hop_limit,
  282. .saddr = ip6h->daddr,
  283. .daddr = ip6h->saddr,
  284. };
  285. skb_reset_network_header(skb);
  286. csum = skb_checksum(skb, skb_transport_offset(skb), len, 0);
  287. icmp6h->icmp6_cksum = csum_ipv6_magic(&nip6h->saddr, &nip6h->daddr, len,
  288. IPPROTO_ICMPV6, csum);
  289. skb->ip_summed = CHECKSUM_NONE;
  290. eth_header(skb, skb->dev, ntohs(eh.h_proto), eh.h_source, eh.h_dest, 0);
  291. skb_reset_mac_header(skb);
  292. return skb->len;
  293. }
  294. /**
  295. * iptunnel_pmtud_check_icmpv6() - Trigger ICMPv6 reply if needed and allowed
  296. * @skb: Buffer being sent by encapsulation, L2 headers expected
  297. * @mtu: Network MTU for path
  298. *
  299. * Return: 0 for no ICMPv6 reply, length if built, negative value on error.
  300. */
  301. static int iptunnel_pmtud_check_icmpv6(struct sk_buff *skb, int mtu)
  302. {
  303. const struct ipv6hdr *ip6h = ipv6_hdr(skb);
  304. int stype = ipv6_addr_type(&ip6h->saddr);
  305. u8 proto = ip6h->nexthdr;
  306. __be16 frag_off;
  307. int offset;
  308. if (mtu < IPV6_MIN_MTU)
  309. return 0;
  310. if (stype == IPV6_ADDR_ANY || stype == IPV6_ADDR_MULTICAST ||
  311. stype == IPV6_ADDR_LOOPBACK)
  312. return 0;
  313. offset = ipv6_skip_exthdr(skb, sizeof(struct ipv6hdr), &proto,
  314. &frag_off);
  315. if (offset < 0 || (frag_off & htons(~0x7)))
  316. return 0;
  317. if (proto == IPPROTO_ICMPV6) {
  318. struct icmp6hdr *icmp6h;
  319. if (!pskb_may_pull(skb, skb_network_header(skb) +
  320. offset + 1 - skb->data))
  321. return 0;
  322. icmp6h = (struct icmp6hdr *)(skb_network_header(skb) + offset);
  323. if (icmpv6_is_err(icmp6h->icmp6_type) ||
  324. icmp6h->icmp6_type == NDISC_REDIRECT)
  325. return 0;
  326. }
  327. return iptunnel_pmtud_build_icmpv6(skb, mtu);
  328. }
  329. #endif /* IS_ENABLED(CONFIG_IPV6) */
  330. /**
  331. * skb_tunnel_check_pmtu() - Check, update PMTU and trigger ICMP reply as needed
  332. * @skb: Buffer being sent by encapsulation, L2 headers expected
  333. * @encap_dst: Destination for tunnel encapsulation (outer IP)
  334. * @headroom: Encapsulation header size, bytes
  335. * @reply: Build matching ICMP or ICMPv6 message as a result
  336. *
  337. * L2 tunnel implementations that can carry IP and can be directly bridged
  338. * (currently UDP tunnels) can't always rely on IP forwarding paths to handle
  339. * PMTU discovery. In the bridged case, ICMP or ICMPv6 messages need to be built
  340. * based on payload and sent back by the encapsulation itself.
  341. *
  342. * For routable interfaces, we just need to update the PMTU for the destination.
  343. *
  344. * Return: 0 if ICMP error not needed, length if built, negative value on error
  345. */
  346. int skb_tunnel_check_pmtu(struct sk_buff *skb, struct dst_entry *encap_dst,
  347. int headroom, bool reply)
  348. {
  349. u32 mtu = dst_mtu(encap_dst) - headroom;
  350. if ((skb_is_gso(skb) && skb_gso_validate_network_len(skb, mtu)) ||
  351. (!skb_is_gso(skb) && (skb->len - skb_network_offset(skb)) <= mtu))
  352. return 0;
  353. skb_dst_update_pmtu_no_confirm(skb, mtu);
  354. if (!reply)
  355. return 0;
  356. if (skb->protocol == htons(ETH_P_IP))
  357. return iptunnel_pmtud_check_icmp(skb, mtu);
  358. #if IS_ENABLED(CONFIG_IPV6)
  359. if (skb->protocol == htons(ETH_P_IPV6))
  360. return iptunnel_pmtud_check_icmpv6(skb, mtu);
  361. #endif
  362. return 0;
  363. }
  364. EXPORT_SYMBOL(skb_tunnel_check_pmtu);
  365. static const struct nla_policy ip_tun_policy[LWTUNNEL_IP_MAX + 1] = {
  366. [LWTUNNEL_IP_UNSPEC] = { .strict_start_type = LWTUNNEL_IP_OPTS },
  367. [LWTUNNEL_IP_ID] = { .type = NLA_U64 },
  368. [LWTUNNEL_IP_DST] = { .type = NLA_U32 },
  369. [LWTUNNEL_IP_SRC] = { .type = NLA_U32 },
  370. [LWTUNNEL_IP_TTL] = { .type = NLA_U8 },
  371. [LWTUNNEL_IP_TOS] = { .type = NLA_U8 },
  372. [LWTUNNEL_IP_FLAGS] = { .type = NLA_U16 },
  373. [LWTUNNEL_IP_OPTS] = { .type = NLA_NESTED },
  374. };
  375. static const struct nla_policy ip_opts_policy[LWTUNNEL_IP_OPTS_MAX + 1] = {
  376. [LWTUNNEL_IP_OPTS_GENEVE] = { .type = NLA_NESTED },
  377. [LWTUNNEL_IP_OPTS_VXLAN] = { .type = NLA_NESTED },
  378. [LWTUNNEL_IP_OPTS_ERSPAN] = { .type = NLA_NESTED },
  379. };
  380. static const struct nla_policy
  381. geneve_opt_policy[LWTUNNEL_IP_OPT_GENEVE_MAX + 1] = {
  382. [LWTUNNEL_IP_OPT_GENEVE_CLASS] = { .type = NLA_U16 },
  383. [LWTUNNEL_IP_OPT_GENEVE_TYPE] = { .type = NLA_U8 },
  384. [LWTUNNEL_IP_OPT_GENEVE_DATA] = { .type = NLA_BINARY, .len = 127 },
  385. };
  386. static const struct nla_policy
  387. vxlan_opt_policy[LWTUNNEL_IP_OPT_VXLAN_MAX + 1] = {
  388. [LWTUNNEL_IP_OPT_VXLAN_GBP] = { .type = NLA_U32 },
  389. };
  390. static const struct nla_policy
  391. erspan_opt_policy[LWTUNNEL_IP_OPT_ERSPAN_MAX + 1] = {
  392. [LWTUNNEL_IP_OPT_ERSPAN_VER] = { .type = NLA_U8 },
  393. [LWTUNNEL_IP_OPT_ERSPAN_INDEX] = { .type = NLA_U32 },
  394. [LWTUNNEL_IP_OPT_ERSPAN_DIR] = { .type = NLA_U8 },
  395. [LWTUNNEL_IP_OPT_ERSPAN_HWID] = { .type = NLA_U8 },
  396. };
  397. static int ip_tun_parse_opts_geneve(struct nlattr *attr,
  398. struct ip_tunnel_info *info, int opts_len,
  399. struct netlink_ext_ack *extack)
  400. {
  401. struct nlattr *tb[LWTUNNEL_IP_OPT_GENEVE_MAX + 1];
  402. int data_len, err;
  403. err = nla_parse_nested(tb, LWTUNNEL_IP_OPT_GENEVE_MAX, attr,
  404. geneve_opt_policy, extack);
  405. if (err)
  406. return err;
  407. if (!tb[LWTUNNEL_IP_OPT_GENEVE_CLASS] ||
  408. !tb[LWTUNNEL_IP_OPT_GENEVE_TYPE] ||
  409. !tb[LWTUNNEL_IP_OPT_GENEVE_DATA])
  410. return -EINVAL;
  411. attr = tb[LWTUNNEL_IP_OPT_GENEVE_DATA];
  412. data_len = nla_len(attr);
  413. if (data_len % 4)
  414. return -EINVAL;
  415. if (info) {
  416. struct geneve_opt *opt = ip_tunnel_info_opts(info) + opts_len;
  417. memcpy(opt->opt_data, nla_data(attr), data_len);
  418. opt->length = data_len / 4;
  419. attr = tb[LWTUNNEL_IP_OPT_GENEVE_CLASS];
  420. opt->opt_class = nla_get_be16(attr);
  421. attr = tb[LWTUNNEL_IP_OPT_GENEVE_TYPE];
  422. opt->type = nla_get_u8(attr);
  423. __set_bit(IP_TUNNEL_GENEVE_OPT_BIT, info->key.tun_flags);
  424. }
  425. return sizeof(struct geneve_opt) + data_len;
  426. }
  427. static int ip_tun_parse_opts_vxlan(struct nlattr *attr,
  428. struct ip_tunnel_info *info, int opts_len,
  429. struct netlink_ext_ack *extack)
  430. {
  431. struct nlattr *tb[LWTUNNEL_IP_OPT_VXLAN_MAX + 1];
  432. int err;
  433. err = nla_parse_nested(tb, LWTUNNEL_IP_OPT_VXLAN_MAX, attr,
  434. vxlan_opt_policy, extack);
  435. if (err)
  436. return err;
  437. if (!tb[LWTUNNEL_IP_OPT_VXLAN_GBP])
  438. return -EINVAL;
  439. if (info) {
  440. struct vxlan_metadata *md =
  441. ip_tunnel_info_opts(info) + opts_len;
  442. attr = tb[LWTUNNEL_IP_OPT_VXLAN_GBP];
  443. md->gbp = nla_get_u32(attr);
  444. md->gbp &= VXLAN_GBP_MASK;
  445. __set_bit(IP_TUNNEL_VXLAN_OPT_BIT, info->key.tun_flags);
  446. }
  447. return sizeof(struct vxlan_metadata);
  448. }
  449. static int ip_tun_parse_opts_erspan(struct nlattr *attr,
  450. struct ip_tunnel_info *info, int opts_len,
  451. struct netlink_ext_ack *extack)
  452. {
  453. struct nlattr *tb[LWTUNNEL_IP_OPT_ERSPAN_MAX + 1];
  454. int err;
  455. u8 ver;
  456. err = nla_parse_nested(tb, LWTUNNEL_IP_OPT_ERSPAN_MAX, attr,
  457. erspan_opt_policy, extack);
  458. if (err)
  459. return err;
  460. if (!tb[LWTUNNEL_IP_OPT_ERSPAN_VER])
  461. return -EINVAL;
  462. ver = nla_get_u8(tb[LWTUNNEL_IP_OPT_ERSPAN_VER]);
  463. if (ver == 1) {
  464. if (!tb[LWTUNNEL_IP_OPT_ERSPAN_INDEX])
  465. return -EINVAL;
  466. } else if (ver == 2) {
  467. if (!tb[LWTUNNEL_IP_OPT_ERSPAN_DIR] ||
  468. !tb[LWTUNNEL_IP_OPT_ERSPAN_HWID])
  469. return -EINVAL;
  470. } else {
  471. return -EINVAL;
  472. }
  473. if (info) {
  474. struct erspan_metadata *md =
  475. ip_tunnel_info_opts(info) + opts_len;
  476. md->version = ver;
  477. if (ver == 1) {
  478. attr = tb[LWTUNNEL_IP_OPT_ERSPAN_INDEX];
  479. md->u.index = nla_get_be32(attr);
  480. } else {
  481. attr = tb[LWTUNNEL_IP_OPT_ERSPAN_DIR];
  482. md->u.md2.dir = nla_get_u8(attr);
  483. attr = tb[LWTUNNEL_IP_OPT_ERSPAN_HWID];
  484. set_hwid(&md->u.md2, nla_get_u8(attr));
  485. }
  486. __set_bit(IP_TUNNEL_ERSPAN_OPT_BIT, info->key.tun_flags);
  487. }
  488. return sizeof(struct erspan_metadata);
  489. }
  490. static int ip_tun_parse_opts(struct nlattr *attr, struct ip_tunnel_info *info,
  491. struct netlink_ext_ack *extack)
  492. {
  493. int err, rem, opt_len, opts_len = 0;
  494. struct nlattr *nla;
  495. u32 type = 0;
  496. if (!attr)
  497. return 0;
  498. err = nla_validate(nla_data(attr), nla_len(attr), LWTUNNEL_IP_OPTS_MAX,
  499. ip_opts_policy, extack);
  500. if (err)
  501. return err;
  502. nla_for_each_attr(nla, nla_data(attr), nla_len(attr), rem) {
  503. switch (nla_type(nla)) {
  504. case LWTUNNEL_IP_OPTS_GENEVE:
  505. if (type && type != IP_TUNNEL_GENEVE_OPT_BIT)
  506. return -EINVAL;
  507. opt_len = ip_tun_parse_opts_geneve(nla, info, opts_len,
  508. extack);
  509. if (opt_len < 0)
  510. return opt_len;
  511. opts_len += opt_len;
  512. if (opts_len > IP_TUNNEL_OPTS_MAX)
  513. return -EINVAL;
  514. type = IP_TUNNEL_GENEVE_OPT_BIT;
  515. break;
  516. case LWTUNNEL_IP_OPTS_VXLAN:
  517. if (type)
  518. return -EINVAL;
  519. opt_len = ip_tun_parse_opts_vxlan(nla, info, opts_len,
  520. extack);
  521. if (opt_len < 0)
  522. return opt_len;
  523. opts_len += opt_len;
  524. type = IP_TUNNEL_VXLAN_OPT_BIT;
  525. break;
  526. case LWTUNNEL_IP_OPTS_ERSPAN:
  527. if (type)
  528. return -EINVAL;
  529. opt_len = ip_tun_parse_opts_erspan(nla, info, opts_len,
  530. extack);
  531. if (opt_len < 0)
  532. return opt_len;
  533. opts_len += opt_len;
  534. type = IP_TUNNEL_ERSPAN_OPT_BIT;
  535. break;
  536. default:
  537. return -EINVAL;
  538. }
  539. }
  540. return opts_len;
  541. }
  542. static int ip_tun_get_optlen(struct nlattr *attr,
  543. struct netlink_ext_ack *extack)
  544. {
  545. return ip_tun_parse_opts(attr, NULL, extack);
  546. }
  547. static int ip_tun_set_opts(struct nlattr *attr, struct ip_tunnel_info *info,
  548. struct netlink_ext_ack *extack)
  549. {
  550. return ip_tun_parse_opts(attr, info, extack);
  551. }
  552. static int ip_tun_build_state(struct net *net, struct nlattr *attr,
  553. unsigned int family, const void *cfg,
  554. struct lwtunnel_state **ts,
  555. struct netlink_ext_ack *extack)
  556. {
  557. struct nlattr *tb[LWTUNNEL_IP_MAX + 1];
  558. struct lwtunnel_state *new_state;
  559. struct ip_tunnel_info *tun_info;
  560. int err, opt_len;
  561. err = nla_parse_nested_deprecated(tb, LWTUNNEL_IP_MAX, attr,
  562. ip_tun_policy, extack);
  563. if (err < 0)
  564. return err;
  565. opt_len = ip_tun_get_optlen(tb[LWTUNNEL_IP_OPTS], extack);
  566. if (opt_len < 0)
  567. return opt_len;
  568. new_state = lwtunnel_state_alloc(sizeof(*tun_info) + opt_len);
  569. if (!new_state)
  570. return -ENOMEM;
  571. new_state->type = LWTUNNEL_ENCAP_IP;
  572. tun_info = lwt_tun_info(new_state);
  573. err = ip_tun_set_opts(tb[LWTUNNEL_IP_OPTS], tun_info, extack);
  574. if (err < 0) {
  575. lwtstate_free(new_state);
  576. return err;
  577. }
  578. #ifdef CONFIG_DST_CACHE
  579. err = dst_cache_init(&tun_info->dst_cache, GFP_KERNEL);
  580. if (err) {
  581. lwtstate_free(new_state);
  582. return err;
  583. }
  584. #endif
  585. if (tb[LWTUNNEL_IP_ID])
  586. tun_info->key.tun_id = nla_get_be64(tb[LWTUNNEL_IP_ID]);
  587. if (tb[LWTUNNEL_IP_DST])
  588. tun_info->key.u.ipv4.dst = nla_get_in_addr(tb[LWTUNNEL_IP_DST]);
  589. if (tb[LWTUNNEL_IP_SRC])
  590. tun_info->key.u.ipv4.src = nla_get_in_addr(tb[LWTUNNEL_IP_SRC]);
  591. if (tb[LWTUNNEL_IP_TTL])
  592. tun_info->key.ttl = nla_get_u8(tb[LWTUNNEL_IP_TTL]);
  593. if (tb[LWTUNNEL_IP_TOS])
  594. tun_info->key.tos = nla_get_u8(tb[LWTUNNEL_IP_TOS]);
  595. if (tb[LWTUNNEL_IP_FLAGS]) {
  596. IP_TUNNEL_DECLARE_FLAGS(flags);
  597. ip_tunnel_flags_from_be16(flags,
  598. nla_get_be16(tb[LWTUNNEL_IP_FLAGS]));
  599. ip_tunnel_clear_options_present(flags);
  600. ip_tunnel_flags_or(tun_info->key.tun_flags,
  601. tun_info->key.tun_flags, flags);
  602. }
  603. tun_info->mode = IP_TUNNEL_INFO_TX;
  604. tun_info->options_len = opt_len;
  605. *ts = new_state;
  606. return 0;
  607. }
  608. static void ip_tun_destroy_state(struct lwtunnel_state *lwtstate)
  609. {
  610. #ifdef CONFIG_DST_CACHE
  611. struct ip_tunnel_info *tun_info = lwt_tun_info(lwtstate);
  612. dst_cache_destroy(&tun_info->dst_cache);
  613. #endif
  614. }
  615. static int ip_tun_fill_encap_opts_geneve(struct sk_buff *skb,
  616. struct ip_tunnel_info *tun_info)
  617. {
  618. struct geneve_opt *opt;
  619. struct nlattr *nest;
  620. int offset = 0;
  621. nest = nla_nest_start_noflag(skb, LWTUNNEL_IP_OPTS_GENEVE);
  622. if (!nest)
  623. return -ENOMEM;
  624. while (tun_info->options_len > offset) {
  625. opt = ip_tunnel_info_opts(tun_info) + offset;
  626. if (nla_put_be16(skb, LWTUNNEL_IP_OPT_GENEVE_CLASS,
  627. opt->opt_class) ||
  628. nla_put_u8(skb, LWTUNNEL_IP_OPT_GENEVE_TYPE, opt->type) ||
  629. nla_put(skb, LWTUNNEL_IP_OPT_GENEVE_DATA, opt->length * 4,
  630. opt->opt_data)) {
  631. nla_nest_cancel(skb, nest);
  632. return -ENOMEM;
  633. }
  634. offset += sizeof(*opt) + opt->length * 4;
  635. }
  636. nla_nest_end(skb, nest);
  637. return 0;
  638. }
  639. static int ip_tun_fill_encap_opts_vxlan(struct sk_buff *skb,
  640. struct ip_tunnel_info *tun_info)
  641. {
  642. struct vxlan_metadata *md;
  643. struct nlattr *nest;
  644. nest = nla_nest_start_noflag(skb, LWTUNNEL_IP_OPTS_VXLAN);
  645. if (!nest)
  646. return -ENOMEM;
  647. md = ip_tunnel_info_opts(tun_info);
  648. if (nla_put_u32(skb, LWTUNNEL_IP_OPT_VXLAN_GBP, md->gbp)) {
  649. nla_nest_cancel(skb, nest);
  650. return -ENOMEM;
  651. }
  652. nla_nest_end(skb, nest);
  653. return 0;
  654. }
  655. static int ip_tun_fill_encap_opts_erspan(struct sk_buff *skb,
  656. struct ip_tunnel_info *tun_info)
  657. {
  658. struct erspan_metadata *md;
  659. struct nlattr *nest;
  660. nest = nla_nest_start_noflag(skb, LWTUNNEL_IP_OPTS_ERSPAN);
  661. if (!nest)
  662. return -ENOMEM;
  663. md = ip_tunnel_info_opts(tun_info);
  664. if (nla_put_u8(skb, LWTUNNEL_IP_OPT_ERSPAN_VER, md->version))
  665. goto err;
  666. if (md->version == 1 &&
  667. nla_put_be32(skb, LWTUNNEL_IP_OPT_ERSPAN_INDEX, md->u.index))
  668. goto err;
  669. if (md->version == 2 &&
  670. (nla_put_u8(skb, LWTUNNEL_IP_OPT_ERSPAN_DIR, md->u.md2.dir) ||
  671. nla_put_u8(skb, LWTUNNEL_IP_OPT_ERSPAN_HWID,
  672. get_hwid(&md->u.md2))))
  673. goto err;
  674. nla_nest_end(skb, nest);
  675. return 0;
  676. err:
  677. nla_nest_cancel(skb, nest);
  678. return -ENOMEM;
  679. }
  680. static int ip_tun_fill_encap_opts(struct sk_buff *skb, int type,
  681. struct ip_tunnel_info *tun_info)
  682. {
  683. struct nlattr *nest;
  684. int err = 0;
  685. if (!ip_tunnel_is_options_present(tun_info->key.tun_flags))
  686. return 0;
  687. nest = nla_nest_start_noflag(skb, type);
  688. if (!nest)
  689. return -ENOMEM;
  690. if (test_bit(IP_TUNNEL_GENEVE_OPT_BIT, tun_info->key.tun_flags))
  691. err = ip_tun_fill_encap_opts_geneve(skb, tun_info);
  692. else if (test_bit(IP_TUNNEL_VXLAN_OPT_BIT, tun_info->key.tun_flags))
  693. err = ip_tun_fill_encap_opts_vxlan(skb, tun_info);
  694. else if (test_bit(IP_TUNNEL_ERSPAN_OPT_BIT, tun_info->key.tun_flags))
  695. err = ip_tun_fill_encap_opts_erspan(skb, tun_info);
  696. if (err) {
  697. nla_nest_cancel(skb, nest);
  698. return err;
  699. }
  700. nla_nest_end(skb, nest);
  701. return 0;
  702. }
  703. static int ip_tun_fill_encap_info(struct sk_buff *skb,
  704. struct lwtunnel_state *lwtstate)
  705. {
  706. struct ip_tunnel_info *tun_info = lwt_tun_info(lwtstate);
  707. if (nla_put_be64(skb, LWTUNNEL_IP_ID, tun_info->key.tun_id,
  708. LWTUNNEL_IP_PAD) ||
  709. nla_put_in_addr(skb, LWTUNNEL_IP_DST, tun_info->key.u.ipv4.dst) ||
  710. nla_put_in_addr(skb, LWTUNNEL_IP_SRC, tun_info->key.u.ipv4.src) ||
  711. nla_put_u8(skb, LWTUNNEL_IP_TOS, tun_info->key.tos) ||
  712. nla_put_u8(skb, LWTUNNEL_IP_TTL, tun_info->key.ttl) ||
  713. nla_put_be16(skb, LWTUNNEL_IP_FLAGS,
  714. ip_tunnel_flags_to_be16(tun_info->key.tun_flags)) ||
  715. ip_tun_fill_encap_opts(skb, LWTUNNEL_IP_OPTS, tun_info))
  716. return -ENOMEM;
  717. return 0;
  718. }
  719. static int ip_tun_opts_nlsize(struct ip_tunnel_info *info)
  720. {
  721. int opt_len;
  722. if (!ip_tunnel_is_options_present(info->key.tun_flags))
  723. return 0;
  724. opt_len = nla_total_size(0); /* LWTUNNEL_IP_OPTS */
  725. if (test_bit(IP_TUNNEL_GENEVE_OPT_BIT, info->key.tun_flags)) {
  726. struct geneve_opt *opt;
  727. int offset = 0;
  728. opt_len += nla_total_size(0); /* LWTUNNEL_IP_OPTS_GENEVE */
  729. while (info->options_len > offset) {
  730. opt = ip_tunnel_info_opts(info) + offset;
  731. opt_len += nla_total_size(2) /* OPT_GENEVE_CLASS */
  732. + nla_total_size(1) /* OPT_GENEVE_TYPE */
  733. + nla_total_size(opt->length * 4);
  734. /* OPT_GENEVE_DATA */
  735. offset += sizeof(*opt) + opt->length * 4;
  736. }
  737. } else if (test_bit(IP_TUNNEL_VXLAN_OPT_BIT, info->key.tun_flags)) {
  738. opt_len += nla_total_size(0) /* LWTUNNEL_IP_OPTS_VXLAN */
  739. + nla_total_size(4); /* OPT_VXLAN_GBP */
  740. } else if (test_bit(IP_TUNNEL_ERSPAN_OPT_BIT, info->key.tun_flags)) {
  741. struct erspan_metadata *md = ip_tunnel_info_opts(info);
  742. opt_len += nla_total_size(0) /* LWTUNNEL_IP_OPTS_ERSPAN */
  743. + nla_total_size(1) /* OPT_ERSPAN_VER */
  744. + (md->version == 1 ? nla_total_size(4)
  745. /* OPT_ERSPAN_INDEX (v1) */
  746. : nla_total_size(1) +
  747. nla_total_size(1));
  748. /* OPT_ERSPAN_DIR + HWID (v2) */
  749. }
  750. return opt_len;
  751. }
  752. static int ip_tun_encap_nlsize(struct lwtunnel_state *lwtstate)
  753. {
  754. return nla_total_size_64bit(8) /* LWTUNNEL_IP_ID */
  755. + nla_total_size(4) /* LWTUNNEL_IP_DST */
  756. + nla_total_size(4) /* LWTUNNEL_IP_SRC */
  757. + nla_total_size(1) /* LWTUNNEL_IP_TOS */
  758. + nla_total_size(1) /* LWTUNNEL_IP_TTL */
  759. + nla_total_size(2) /* LWTUNNEL_IP_FLAGS */
  760. + ip_tun_opts_nlsize(lwt_tun_info(lwtstate));
  761. /* LWTUNNEL_IP_OPTS */
  762. }
  763. static int ip_tun_cmp_encap(struct lwtunnel_state *a, struct lwtunnel_state *b)
  764. {
  765. struct ip_tunnel_info *info_a = lwt_tun_info(a);
  766. struct ip_tunnel_info *info_b = lwt_tun_info(b);
  767. return memcmp(info_a, info_b, sizeof(info_a->key)) ||
  768. info_a->mode != info_b->mode ||
  769. info_a->options_len != info_b->options_len ||
  770. memcmp(ip_tunnel_info_opts(info_a),
  771. ip_tunnel_info_opts(info_b), info_a->options_len);
  772. }
  773. static const struct lwtunnel_encap_ops ip_tun_lwt_ops = {
  774. .build_state = ip_tun_build_state,
  775. .destroy_state = ip_tun_destroy_state,
  776. .fill_encap = ip_tun_fill_encap_info,
  777. .get_encap_size = ip_tun_encap_nlsize,
  778. .cmp_encap = ip_tun_cmp_encap,
  779. .owner = THIS_MODULE,
  780. };
  781. static const struct nla_policy ip6_tun_policy[LWTUNNEL_IP6_MAX + 1] = {
  782. [LWTUNNEL_IP6_UNSPEC] = { .strict_start_type = LWTUNNEL_IP6_OPTS },
  783. [LWTUNNEL_IP6_ID] = { .type = NLA_U64 },
  784. [LWTUNNEL_IP6_DST] = { .len = sizeof(struct in6_addr) },
  785. [LWTUNNEL_IP6_SRC] = { .len = sizeof(struct in6_addr) },
  786. [LWTUNNEL_IP6_HOPLIMIT] = { .type = NLA_U8 },
  787. [LWTUNNEL_IP6_TC] = { .type = NLA_U8 },
  788. [LWTUNNEL_IP6_FLAGS] = { .type = NLA_U16 },
  789. [LWTUNNEL_IP6_OPTS] = { .type = NLA_NESTED },
  790. };
  791. static int ip6_tun_build_state(struct net *net, struct nlattr *attr,
  792. unsigned int family, const void *cfg,
  793. struct lwtunnel_state **ts,
  794. struct netlink_ext_ack *extack)
  795. {
  796. struct nlattr *tb[LWTUNNEL_IP6_MAX + 1];
  797. struct lwtunnel_state *new_state;
  798. struct ip_tunnel_info *tun_info;
  799. int err, opt_len;
  800. err = nla_parse_nested_deprecated(tb, LWTUNNEL_IP6_MAX, attr,
  801. ip6_tun_policy, extack);
  802. if (err < 0)
  803. return err;
  804. opt_len = ip_tun_get_optlen(tb[LWTUNNEL_IP6_OPTS], extack);
  805. if (opt_len < 0)
  806. return opt_len;
  807. new_state = lwtunnel_state_alloc(sizeof(*tun_info) + opt_len);
  808. if (!new_state)
  809. return -ENOMEM;
  810. new_state->type = LWTUNNEL_ENCAP_IP6;
  811. tun_info = lwt_tun_info(new_state);
  812. err = ip_tun_set_opts(tb[LWTUNNEL_IP6_OPTS], tun_info, extack);
  813. if (err < 0) {
  814. lwtstate_free(new_state);
  815. return err;
  816. }
  817. if (tb[LWTUNNEL_IP6_ID])
  818. tun_info->key.tun_id = nla_get_be64(tb[LWTUNNEL_IP6_ID]);
  819. if (tb[LWTUNNEL_IP6_DST])
  820. tun_info->key.u.ipv6.dst = nla_get_in6_addr(tb[LWTUNNEL_IP6_DST]);
  821. if (tb[LWTUNNEL_IP6_SRC])
  822. tun_info->key.u.ipv6.src = nla_get_in6_addr(tb[LWTUNNEL_IP6_SRC]);
  823. if (tb[LWTUNNEL_IP6_HOPLIMIT])
  824. tun_info->key.ttl = nla_get_u8(tb[LWTUNNEL_IP6_HOPLIMIT]);
  825. if (tb[LWTUNNEL_IP6_TC])
  826. tun_info->key.tos = nla_get_u8(tb[LWTUNNEL_IP6_TC]);
  827. if (tb[LWTUNNEL_IP6_FLAGS]) {
  828. IP_TUNNEL_DECLARE_FLAGS(flags);
  829. __be16 data;
  830. data = nla_get_be16(tb[LWTUNNEL_IP6_FLAGS]);
  831. ip_tunnel_flags_from_be16(flags, data);
  832. ip_tunnel_clear_options_present(flags);
  833. ip_tunnel_flags_or(tun_info->key.tun_flags,
  834. tun_info->key.tun_flags, flags);
  835. }
  836. tun_info->mode = IP_TUNNEL_INFO_TX | IP_TUNNEL_INFO_IPV6;
  837. tun_info->options_len = opt_len;
  838. *ts = new_state;
  839. return 0;
  840. }
  841. static int ip6_tun_fill_encap_info(struct sk_buff *skb,
  842. struct lwtunnel_state *lwtstate)
  843. {
  844. struct ip_tunnel_info *tun_info = lwt_tun_info(lwtstate);
  845. if (nla_put_be64(skb, LWTUNNEL_IP6_ID, tun_info->key.tun_id,
  846. LWTUNNEL_IP6_PAD) ||
  847. nla_put_in6_addr(skb, LWTUNNEL_IP6_DST, &tun_info->key.u.ipv6.dst) ||
  848. nla_put_in6_addr(skb, LWTUNNEL_IP6_SRC, &tun_info->key.u.ipv6.src) ||
  849. nla_put_u8(skb, LWTUNNEL_IP6_TC, tun_info->key.tos) ||
  850. nla_put_u8(skb, LWTUNNEL_IP6_HOPLIMIT, tun_info->key.ttl) ||
  851. nla_put_be16(skb, LWTUNNEL_IP6_FLAGS,
  852. ip_tunnel_flags_to_be16(tun_info->key.tun_flags)) ||
  853. ip_tun_fill_encap_opts(skb, LWTUNNEL_IP6_OPTS, tun_info))
  854. return -ENOMEM;
  855. return 0;
  856. }
  857. static int ip6_tun_encap_nlsize(struct lwtunnel_state *lwtstate)
  858. {
  859. return nla_total_size_64bit(8) /* LWTUNNEL_IP6_ID */
  860. + nla_total_size(16) /* LWTUNNEL_IP6_DST */
  861. + nla_total_size(16) /* LWTUNNEL_IP6_SRC */
  862. + nla_total_size(1) /* LWTUNNEL_IP6_HOPLIMIT */
  863. + nla_total_size(1) /* LWTUNNEL_IP6_TC */
  864. + nla_total_size(2) /* LWTUNNEL_IP6_FLAGS */
  865. + ip_tun_opts_nlsize(lwt_tun_info(lwtstate));
  866. /* LWTUNNEL_IP6_OPTS */
  867. }
  868. static const struct lwtunnel_encap_ops ip6_tun_lwt_ops = {
  869. .build_state = ip6_tun_build_state,
  870. .fill_encap = ip6_tun_fill_encap_info,
  871. .get_encap_size = ip6_tun_encap_nlsize,
  872. .cmp_encap = ip_tun_cmp_encap,
  873. .owner = THIS_MODULE,
  874. };
  875. void __init ip_tunnel_core_init(void)
  876. {
  877. /* If you land here, make sure whether increasing ip_tunnel_info's
  878. * options_len is a reasonable choice with its usage in front ends
  879. * (f.e., it's part of flow keys, etc).
  880. */
  881. BUILD_BUG_ON(IP_TUNNEL_OPTS_MAX != 255);
  882. lwtunnel_encap_add_ops(&ip_tun_lwt_ops, LWTUNNEL_ENCAP_IP);
  883. lwtunnel_encap_add_ops(&ip6_tun_lwt_ops, LWTUNNEL_ENCAP_IP6);
  884. }
  885. DEFINE_STATIC_KEY_FALSE(ip_tunnel_metadata_cnt);
  886. EXPORT_SYMBOL(ip_tunnel_metadata_cnt);
  887. void ip_tunnel_need_metadata(void)
  888. {
  889. static_branch_inc(&ip_tunnel_metadata_cnt);
  890. }
  891. EXPORT_SYMBOL_GPL(ip_tunnel_need_metadata);
  892. void ip_tunnel_unneed_metadata(void)
  893. {
  894. static_branch_dec(&ip_tunnel_metadata_cnt);
  895. }
  896. EXPORT_SYMBOL_GPL(ip_tunnel_unneed_metadata);
  897. /* Returns either the correct skb->protocol value, or 0 if invalid. */
  898. __be16 ip_tunnel_parse_protocol(const struct sk_buff *skb)
  899. {
  900. if (skb_network_header(skb) >= skb->head &&
  901. (skb_network_header(skb) + sizeof(struct iphdr)) <= skb_tail_pointer(skb) &&
  902. ip_hdr(skb)->version == 4)
  903. return htons(ETH_P_IP);
  904. if (skb_network_header(skb) >= skb->head &&
  905. (skb_network_header(skb) + sizeof(struct ipv6hdr)) <= skb_tail_pointer(skb) &&
  906. ipv6_hdr(skb)->version == 6)
  907. return htons(ETH_P_IPV6);
  908. return 0;
  909. }
  910. EXPORT_SYMBOL(ip_tunnel_parse_protocol);
  911. const struct header_ops ip_tunnel_header_ops = { .parse_protocol = ip_tunnel_parse_protocol };
  912. EXPORT_SYMBOL(ip_tunnel_header_ops);
  913. /* This function returns true when ENCAP attributes are present in the nl msg */
  914. bool ip_tunnel_netlink_encap_parms(struct nlattr *data[],
  915. struct ip_tunnel_encap *encap)
  916. {
  917. bool ret = false;
  918. memset(encap, 0, sizeof(*encap));
  919. if (!data)
  920. return ret;
  921. if (data[IFLA_IPTUN_ENCAP_TYPE]) {
  922. ret = true;
  923. encap->type = nla_get_u16(data[IFLA_IPTUN_ENCAP_TYPE]);
  924. }
  925. if (data[IFLA_IPTUN_ENCAP_FLAGS]) {
  926. ret = true;
  927. encap->flags = nla_get_u16(data[IFLA_IPTUN_ENCAP_FLAGS]);
  928. }
  929. if (data[IFLA_IPTUN_ENCAP_SPORT]) {
  930. ret = true;
  931. encap->sport = nla_get_be16(data[IFLA_IPTUN_ENCAP_SPORT]);
  932. }
  933. if (data[IFLA_IPTUN_ENCAP_DPORT]) {
  934. ret = true;
  935. encap->dport = nla_get_be16(data[IFLA_IPTUN_ENCAP_DPORT]);
  936. }
  937. return ret;
  938. }
  939. EXPORT_SYMBOL_GPL(ip_tunnel_netlink_encap_parms);
  940. void ip_tunnel_netlink_parms(struct nlattr *data[],
  941. struct ip_tunnel_parm_kern *parms)
  942. {
  943. if (data[IFLA_IPTUN_LINK])
  944. parms->link = nla_get_u32(data[IFLA_IPTUN_LINK]);
  945. if (data[IFLA_IPTUN_LOCAL])
  946. parms->iph.saddr = nla_get_be32(data[IFLA_IPTUN_LOCAL]);
  947. if (data[IFLA_IPTUN_REMOTE])
  948. parms->iph.daddr = nla_get_be32(data[IFLA_IPTUN_REMOTE]);
  949. if (data[IFLA_IPTUN_TTL]) {
  950. parms->iph.ttl = nla_get_u8(data[IFLA_IPTUN_TTL]);
  951. if (parms->iph.ttl)
  952. parms->iph.frag_off = htons(IP_DF);
  953. }
  954. if (data[IFLA_IPTUN_TOS])
  955. parms->iph.tos = nla_get_u8(data[IFLA_IPTUN_TOS]);
  956. if (!data[IFLA_IPTUN_PMTUDISC] || nla_get_u8(data[IFLA_IPTUN_PMTUDISC]))
  957. parms->iph.frag_off = htons(IP_DF);
  958. if (data[IFLA_IPTUN_FLAGS]) {
  959. __be16 flags;
  960. flags = nla_get_be16(data[IFLA_IPTUN_FLAGS]);
  961. ip_tunnel_flags_from_be16(parms->i_flags, flags);
  962. }
  963. if (data[IFLA_IPTUN_PROTO])
  964. parms->iph.protocol = nla_get_u8(data[IFLA_IPTUN_PROTO]);
  965. }
  966. EXPORT_SYMBOL_GPL(ip_tunnel_netlink_parms);