fou.c 21 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000
  1. #include <linux/module.h>
  2. #include <linux/errno.h>
  3. #include <linux/socket.h>
  4. #include <linux/skbuff.h>
  5. #include <linux/ip.h>
  6. #include <linux/udp.h>
  7. #include <linux/types.h>
  8. #include <linux/kernel.h>
  9. #include <net/genetlink.h>
  10. #include <net/gue.h>
  11. #include <net/ip.h>
  12. #include <net/protocol.h>
  13. #include <net/udp.h>
  14. #include <net/udp_tunnel.h>
  15. #include <net/xfrm.h>
  16. #include <uapi/linux/fou.h>
  17. #include <uapi/linux/genetlink.h>
  18. struct fou {
  19. struct socket *sock;
  20. u8 protocol;
  21. u8 flags;
  22. __be16 port;
  23. u16 type;
  24. struct udp_offload udp_offloads;
  25. struct list_head list;
  26. };
  27. #define FOU_F_REMCSUM_NOPARTIAL BIT(0)
  28. struct fou_cfg {
  29. u16 type;
  30. u8 protocol;
  31. u8 flags;
  32. struct udp_port_cfg udp_config;
  33. };
  34. static unsigned int fou_net_id;
  35. struct fou_net {
  36. struct list_head fou_list;
  37. struct mutex fou_lock;
  38. };
  39. static inline struct fou *fou_from_sock(struct sock *sk)
  40. {
  41. return sk->sk_user_data;
  42. }
  43. static void fou_recv_pull(struct sk_buff *skb, size_t len)
  44. {
  45. struct iphdr *iph = ip_hdr(skb);
  46. /* Remove 'len' bytes from the packet (UDP header and
  47. * FOU header if present).
  48. */
  49. iph->tot_len = htons(ntohs(iph->tot_len) - len);
  50. __skb_pull(skb, len);
  51. skb_postpull_rcsum(skb, udp_hdr(skb), len);
  52. skb_reset_transport_header(skb);
  53. }
  54. static int fou_udp_recv(struct sock *sk, struct sk_buff *skb)
  55. {
  56. struct fou *fou = fou_from_sock(sk);
  57. if (!fou)
  58. return 1;
  59. fou_recv_pull(skb, sizeof(struct udphdr));
  60. return -fou->protocol;
  61. }
  62. static struct guehdr *gue_remcsum(struct sk_buff *skb, struct guehdr *guehdr,
  63. void *data, size_t hdrlen, u8 ipproto,
  64. bool nopartial)
  65. {
  66. __be16 *pd = data;
  67. size_t start = ntohs(pd[0]);
  68. size_t offset = ntohs(pd[1]);
  69. size_t plen = hdrlen + max_t(size_t, offset + sizeof(u16), start);
  70. if (!pskb_may_pull(skb, plen))
  71. return NULL;
  72. guehdr = (struct guehdr *)&udp_hdr(skb)[1];
  73. skb_remcsum_process(skb, (void *)guehdr + hdrlen,
  74. start, offset, nopartial);
  75. return guehdr;
  76. }
  77. static int gue_control_message(struct sk_buff *skb, struct guehdr *guehdr)
  78. {
  79. /* No support yet */
  80. kfree_skb(skb);
  81. return 0;
  82. }
  83. static int gue_udp_recv(struct sock *sk, struct sk_buff *skb)
  84. {
  85. struct fou *fou = fou_from_sock(sk);
  86. size_t len, optlen, hdrlen;
  87. struct guehdr *guehdr;
  88. void *data;
  89. u16 doffset = 0;
  90. if (!fou)
  91. return 1;
  92. len = sizeof(struct udphdr) + sizeof(struct guehdr);
  93. if (!pskb_may_pull(skb, len))
  94. goto drop;
  95. guehdr = (struct guehdr *)&udp_hdr(skb)[1];
  96. optlen = guehdr->hlen << 2;
  97. len += optlen;
  98. if (!pskb_may_pull(skb, len))
  99. goto drop;
  100. /* guehdr may change after pull */
  101. guehdr = (struct guehdr *)&udp_hdr(skb)[1];
  102. hdrlen = sizeof(struct guehdr) + optlen;
  103. if (guehdr->version != 0 || validate_gue_flags(guehdr, optlen))
  104. goto drop;
  105. hdrlen = sizeof(struct guehdr) + optlen;
  106. ip_hdr(skb)->tot_len = htons(ntohs(ip_hdr(skb)->tot_len) - len);
  107. /* Pull csum through the guehdr now . This can be used if
  108. * there is a remote checksum offload.
  109. */
  110. skb_postpull_rcsum(skb, udp_hdr(skb), len);
  111. data = &guehdr[1];
  112. if (guehdr->flags & GUE_FLAG_PRIV) {
  113. __be32 flags = *(__be32 *)(data + doffset);
  114. doffset += GUE_LEN_PRIV;
  115. if (flags & GUE_PFLAG_REMCSUM) {
  116. guehdr = gue_remcsum(skb, guehdr, data + doffset,
  117. hdrlen, guehdr->proto_ctype,
  118. !!(fou->flags &
  119. FOU_F_REMCSUM_NOPARTIAL));
  120. if (!guehdr)
  121. goto drop;
  122. data = &guehdr[1];
  123. doffset += GUE_PLEN_REMCSUM;
  124. }
  125. }
  126. if (unlikely(guehdr->control))
  127. return gue_control_message(skb, guehdr);
  128. __skb_pull(skb, sizeof(struct udphdr) + hdrlen);
  129. skb_reset_transport_header(skb);
  130. return -guehdr->proto_ctype;
  131. drop:
  132. kfree_skb(skb);
  133. return 0;
  134. }
  135. static struct sk_buff **fou_gro_receive(struct sk_buff **head,
  136. struct sk_buff *skb,
  137. struct udp_offload *uoff)
  138. {
  139. const struct net_offload *ops;
  140. struct sk_buff **pp = NULL;
  141. u8 proto = NAPI_GRO_CB(skb)->proto;
  142. const struct net_offload **offloads;
  143. rcu_read_lock();
  144. offloads = NAPI_GRO_CB(skb)->is_ipv6 ? inet6_offloads : inet_offloads;
  145. ops = rcu_dereference(offloads[proto]);
  146. if (!ops || !ops->callbacks.gro_receive)
  147. goto out_unlock;
  148. pp = ops->callbacks.gro_receive(head, skb);
  149. out_unlock:
  150. rcu_read_unlock();
  151. return pp;
  152. }
  153. static int fou_gro_complete(struct sk_buff *skb, int nhoff,
  154. struct udp_offload *uoff)
  155. {
  156. const struct net_offload *ops;
  157. u8 proto = NAPI_GRO_CB(skb)->proto;
  158. int err = -ENOSYS;
  159. const struct net_offload **offloads;
  160. udp_tunnel_gro_complete(skb, nhoff);
  161. rcu_read_lock();
  162. offloads = NAPI_GRO_CB(skb)->is_ipv6 ? inet6_offloads : inet_offloads;
  163. ops = rcu_dereference(offloads[proto]);
  164. if (WARN_ON(!ops || !ops->callbacks.gro_complete))
  165. goto out_unlock;
  166. err = ops->callbacks.gro_complete(skb, nhoff);
  167. out_unlock:
  168. rcu_read_unlock();
  169. return err;
  170. }
  171. static struct guehdr *gue_gro_remcsum(struct sk_buff *skb, unsigned int off,
  172. struct guehdr *guehdr, void *data,
  173. size_t hdrlen, u8 ipproto,
  174. struct gro_remcsum *grc, bool nopartial)
  175. {
  176. __be16 *pd = data;
  177. size_t start = ntohs(pd[0]);
  178. size_t offset = ntohs(pd[1]);
  179. size_t plen = hdrlen + max_t(size_t, offset + sizeof(u16), start);
  180. if (skb->remcsum_offload)
  181. return NULL;
  182. if (!NAPI_GRO_CB(skb)->csum_valid)
  183. return NULL;
  184. /* Pull checksum that will be written */
  185. if (skb_gro_header_hard(skb, off + plen)) {
  186. guehdr = skb_gro_header_slow(skb, off + plen, off);
  187. if (!guehdr)
  188. return NULL;
  189. }
  190. skb_gro_remcsum_process(skb, (void *)guehdr + hdrlen,
  191. start, offset, grc, nopartial);
  192. skb->remcsum_offload = 1;
  193. return guehdr;
  194. }
  195. static struct sk_buff **gue_gro_receive(struct sk_buff **head,
  196. struct sk_buff *skb,
  197. struct udp_offload *uoff)
  198. {
  199. const struct net_offload **offloads;
  200. const struct net_offload *ops;
  201. struct sk_buff **pp = NULL;
  202. struct sk_buff *p;
  203. struct guehdr *guehdr;
  204. size_t len, optlen, hdrlen, off;
  205. void *data;
  206. u16 doffset = 0;
  207. int flush = 1;
  208. struct fou *fou = container_of(uoff, struct fou, udp_offloads);
  209. struct gro_remcsum grc;
  210. skb_gro_remcsum_init(&grc);
  211. off = skb_gro_offset(skb);
  212. len = off + sizeof(*guehdr);
  213. guehdr = skb_gro_header_fast(skb, off);
  214. if (skb_gro_header_hard(skb, len)) {
  215. guehdr = skb_gro_header_slow(skb, len, off);
  216. if (unlikely(!guehdr))
  217. goto out;
  218. }
  219. optlen = guehdr->hlen << 2;
  220. len += optlen;
  221. if (skb_gro_header_hard(skb, len)) {
  222. guehdr = skb_gro_header_slow(skb, len, off);
  223. if (unlikely(!guehdr))
  224. goto out;
  225. }
  226. if (unlikely(guehdr->control) || guehdr->version != 0 ||
  227. validate_gue_flags(guehdr, optlen))
  228. goto out;
  229. hdrlen = sizeof(*guehdr) + optlen;
  230. /* Adjust NAPI_GRO_CB(skb)->csum to account for guehdr,
  231. * this is needed if there is a remote checkcsum offload.
  232. */
  233. skb_gro_postpull_rcsum(skb, guehdr, hdrlen);
  234. data = &guehdr[1];
  235. if (guehdr->flags & GUE_FLAG_PRIV) {
  236. __be32 flags = *(__be32 *)(data + doffset);
  237. doffset += GUE_LEN_PRIV;
  238. if (flags & GUE_PFLAG_REMCSUM) {
  239. guehdr = gue_gro_remcsum(skb, off, guehdr,
  240. data + doffset, hdrlen,
  241. guehdr->proto_ctype, &grc,
  242. !!(fou->flags &
  243. FOU_F_REMCSUM_NOPARTIAL));
  244. if (!guehdr)
  245. goto out;
  246. data = &guehdr[1];
  247. doffset += GUE_PLEN_REMCSUM;
  248. }
  249. }
  250. skb_gro_pull(skb, hdrlen);
  251. flush = 0;
  252. for (p = *head; p; p = p->next) {
  253. const struct guehdr *guehdr2;
  254. if (!NAPI_GRO_CB(p)->same_flow)
  255. continue;
  256. guehdr2 = (struct guehdr *)(p->data + off);
  257. /* Compare base GUE header to be equal (covers
  258. * hlen, version, proto_ctype, and flags.
  259. */
  260. if (guehdr->word != guehdr2->word) {
  261. NAPI_GRO_CB(p)->same_flow = 0;
  262. continue;
  263. }
  264. /* Compare optional fields are the same. */
  265. if (guehdr->hlen && memcmp(&guehdr[1], &guehdr2[1],
  266. guehdr->hlen << 2)) {
  267. NAPI_GRO_CB(p)->same_flow = 0;
  268. continue;
  269. }
  270. }
  271. rcu_read_lock();
  272. offloads = NAPI_GRO_CB(skb)->is_ipv6 ? inet6_offloads : inet_offloads;
  273. ops = rcu_dereference(offloads[guehdr->proto_ctype]);
  274. if (WARN_ON(!ops || !ops->callbacks.gro_receive))
  275. goto out_unlock;
  276. pp = ops->callbacks.gro_receive(head, skb);
  277. out_unlock:
  278. rcu_read_unlock();
  279. out:
  280. NAPI_GRO_CB(skb)->flush |= flush;
  281. skb_gro_remcsum_cleanup(skb, &grc);
  282. return pp;
  283. }
  284. static int gue_gro_complete(struct sk_buff *skb, int nhoff,
  285. struct udp_offload *uoff)
  286. {
  287. const struct net_offload **offloads;
  288. struct guehdr *guehdr = (struct guehdr *)(skb->data + nhoff);
  289. const struct net_offload *ops;
  290. unsigned int guehlen;
  291. u8 proto;
  292. int err = -ENOENT;
  293. proto = guehdr->proto_ctype;
  294. guehlen = sizeof(*guehdr) + (guehdr->hlen << 2);
  295. rcu_read_lock();
  296. offloads = NAPI_GRO_CB(skb)->is_ipv6 ? inet6_offloads : inet_offloads;
  297. ops = rcu_dereference(offloads[proto]);
  298. if (WARN_ON(!ops || !ops->callbacks.gro_complete))
  299. goto out_unlock;
  300. err = ops->callbacks.gro_complete(skb, nhoff + guehlen);
  301. out_unlock:
  302. rcu_read_unlock();
  303. return err;
  304. }
  305. static int fou_add_to_port_list(struct net *net, struct fou *fou)
  306. {
  307. struct fou_net *fn = net_generic(net, fou_net_id);
  308. struct fou *fout;
  309. mutex_lock(&fn->fou_lock);
  310. list_for_each_entry(fout, &fn->fou_list, list) {
  311. if (fou->port == fout->port) {
  312. mutex_unlock(&fn->fou_lock);
  313. return -EALREADY;
  314. }
  315. }
  316. list_add(&fou->list, &fn->fou_list);
  317. mutex_unlock(&fn->fou_lock);
  318. return 0;
  319. }
  320. static void fou_release(struct fou *fou)
  321. {
  322. struct socket *sock = fou->sock;
  323. struct sock *sk = sock->sk;
  324. if (sk->sk_family == AF_INET)
  325. udp_del_offload(&fou->udp_offloads);
  326. list_del(&fou->list);
  327. udp_tunnel_sock_release(sock);
  328. kfree(fou);
  329. }
  330. static int fou_encap_init(struct sock *sk, struct fou *fou, struct fou_cfg *cfg)
  331. {
  332. udp_sk(sk)->encap_rcv = fou_udp_recv;
  333. fou->protocol = cfg->protocol;
  334. fou->udp_offloads.callbacks.gro_receive = fou_gro_receive;
  335. fou->udp_offloads.callbacks.gro_complete = fou_gro_complete;
  336. fou->udp_offloads.port = cfg->udp_config.local_udp_port;
  337. fou->udp_offloads.ipproto = cfg->protocol;
  338. return 0;
  339. }
  340. static int gue_encap_init(struct sock *sk, struct fou *fou, struct fou_cfg *cfg)
  341. {
  342. udp_sk(sk)->encap_rcv = gue_udp_recv;
  343. fou->udp_offloads.callbacks.gro_receive = gue_gro_receive;
  344. fou->udp_offloads.callbacks.gro_complete = gue_gro_complete;
  345. fou->udp_offloads.port = cfg->udp_config.local_udp_port;
  346. return 0;
  347. }
  348. static int fou_create(struct net *net, struct fou_cfg *cfg,
  349. struct socket **sockp)
  350. {
  351. struct socket *sock = NULL;
  352. struct fou *fou = NULL;
  353. struct sock *sk;
  354. int err;
  355. /* Open UDP socket */
  356. err = udp_sock_create(net, &cfg->udp_config, &sock);
  357. if (err < 0)
  358. goto error;
  359. /* Allocate FOU port structure */
  360. fou = kzalloc(sizeof(*fou), GFP_KERNEL);
  361. if (!fou) {
  362. err = -ENOMEM;
  363. goto error;
  364. }
  365. sk = sock->sk;
  366. fou->flags = cfg->flags;
  367. fou->port = cfg->udp_config.local_udp_port;
  368. /* Initial for fou type */
  369. switch (cfg->type) {
  370. case FOU_ENCAP_DIRECT:
  371. err = fou_encap_init(sk, fou, cfg);
  372. if (err)
  373. goto error;
  374. break;
  375. case FOU_ENCAP_GUE:
  376. err = gue_encap_init(sk, fou, cfg);
  377. if (err)
  378. goto error;
  379. break;
  380. default:
  381. err = -EINVAL;
  382. goto error;
  383. }
  384. fou->type = cfg->type;
  385. udp_sk(sk)->encap_type = 1;
  386. udp_encap_enable();
  387. sk->sk_user_data = fou;
  388. fou->sock = sock;
  389. inet_inc_convert_csum(sk);
  390. sk->sk_allocation = GFP_ATOMIC;
  391. if (cfg->udp_config.family == AF_INET) {
  392. err = udp_add_offload(&fou->udp_offloads);
  393. if (err)
  394. goto error;
  395. }
  396. err = fou_add_to_port_list(net, fou);
  397. if (err)
  398. goto error;
  399. if (sockp)
  400. *sockp = sock;
  401. return 0;
  402. error:
  403. kfree(fou);
  404. if (sock)
  405. udp_tunnel_sock_release(sock);
  406. return err;
  407. }
  408. static int fou_destroy(struct net *net, struct fou_cfg *cfg)
  409. {
  410. struct fou_net *fn = net_generic(net, fou_net_id);
  411. __be16 port = cfg->udp_config.local_udp_port;
  412. int err = -EINVAL;
  413. struct fou *fou;
  414. mutex_lock(&fn->fou_lock);
  415. list_for_each_entry(fou, &fn->fou_list, list) {
  416. if (fou->port == port) {
  417. fou_release(fou);
  418. err = 0;
  419. break;
  420. }
  421. }
  422. mutex_unlock(&fn->fou_lock);
  423. return err;
  424. }
  425. static struct genl_family fou_nl_family = {
  426. .id = GENL_ID_GENERATE,
  427. .hdrsize = 0,
  428. .name = FOU_GENL_NAME,
  429. .version = FOU_GENL_VERSION,
  430. .maxattr = FOU_ATTR_MAX,
  431. .netnsok = true,
  432. };
  433. static struct nla_policy fou_nl_policy[FOU_ATTR_MAX + 1] = {
  434. [FOU_ATTR_PORT] = { .type = NLA_U16, },
  435. [FOU_ATTR_AF] = { .type = NLA_U8, },
  436. [FOU_ATTR_IPPROTO] = { .type = NLA_U8, },
  437. [FOU_ATTR_TYPE] = { .type = NLA_U8, },
  438. [FOU_ATTR_REMCSUM_NOPARTIAL] = { .type = NLA_FLAG, },
  439. };
  440. static int parse_nl_config(struct genl_info *info,
  441. struct fou_cfg *cfg)
  442. {
  443. memset(cfg, 0, sizeof(*cfg));
  444. cfg->udp_config.family = AF_INET;
  445. if (info->attrs[FOU_ATTR_AF]) {
  446. u8 family = nla_get_u8(info->attrs[FOU_ATTR_AF]);
  447. if (family != AF_INET && family != AF_INET6)
  448. return -EINVAL;
  449. cfg->udp_config.family = family;
  450. }
  451. if (info->attrs[FOU_ATTR_PORT]) {
  452. __be16 port = nla_get_be16(info->attrs[FOU_ATTR_PORT]);
  453. cfg->udp_config.local_udp_port = port;
  454. }
  455. if (info->attrs[FOU_ATTR_IPPROTO])
  456. cfg->protocol = nla_get_u8(info->attrs[FOU_ATTR_IPPROTO]);
  457. if (info->attrs[FOU_ATTR_TYPE])
  458. cfg->type = nla_get_u8(info->attrs[FOU_ATTR_TYPE]);
  459. if (info->attrs[FOU_ATTR_REMCSUM_NOPARTIAL])
  460. cfg->flags |= FOU_F_REMCSUM_NOPARTIAL;
  461. return 0;
  462. }
  463. static int fou_nl_cmd_add_port(struct sk_buff *skb, struct genl_info *info)
  464. {
  465. struct net *net = genl_info_net(info);
  466. struct fou_cfg cfg;
  467. int err;
  468. err = parse_nl_config(info, &cfg);
  469. if (err)
  470. return err;
  471. return fou_create(net, &cfg, NULL);
  472. }
  473. static int fou_nl_cmd_rm_port(struct sk_buff *skb, struct genl_info *info)
  474. {
  475. struct net *net = genl_info_net(info);
  476. struct fou_cfg cfg;
  477. int err;
  478. err = parse_nl_config(info, &cfg);
  479. if (err)
  480. return err;
  481. return fou_destroy(net, &cfg);
  482. }
  483. static int fou_fill_info(struct fou *fou, struct sk_buff *msg)
  484. {
  485. if (nla_put_u8(msg, FOU_ATTR_AF, fou->sock->sk->sk_family) ||
  486. nla_put_be16(msg, FOU_ATTR_PORT, fou->port) ||
  487. nla_put_u8(msg, FOU_ATTR_IPPROTO, fou->protocol) ||
  488. nla_put_u8(msg, FOU_ATTR_TYPE, fou->type))
  489. return -1;
  490. if (fou->flags & FOU_F_REMCSUM_NOPARTIAL)
  491. if (nla_put_flag(msg, FOU_ATTR_REMCSUM_NOPARTIAL))
  492. return -1;
  493. return 0;
  494. }
  495. static int fou_dump_info(struct fou *fou, u32 portid, u32 seq,
  496. u32 flags, struct sk_buff *skb, u8 cmd)
  497. {
  498. void *hdr;
  499. hdr = genlmsg_put(skb, portid, seq, &fou_nl_family, flags, cmd);
  500. if (!hdr)
  501. return -ENOMEM;
  502. if (fou_fill_info(fou, skb) < 0)
  503. goto nla_put_failure;
  504. genlmsg_end(skb, hdr);
  505. return 0;
  506. nla_put_failure:
  507. genlmsg_cancel(skb, hdr);
  508. return -EMSGSIZE;
  509. }
  510. static int fou_nl_cmd_get_port(struct sk_buff *skb, struct genl_info *info)
  511. {
  512. struct net *net = genl_info_net(info);
  513. struct fou_net *fn = net_generic(net, fou_net_id);
  514. struct sk_buff *msg;
  515. struct fou_cfg cfg;
  516. struct fou *fout;
  517. __be16 port;
  518. int ret;
  519. ret = parse_nl_config(info, &cfg);
  520. if (ret)
  521. return ret;
  522. port = cfg.udp_config.local_udp_port;
  523. if (port == 0)
  524. return -EINVAL;
  525. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  526. if (!msg)
  527. return -ENOMEM;
  528. ret = -ESRCH;
  529. mutex_lock(&fn->fou_lock);
  530. list_for_each_entry(fout, &fn->fou_list, list) {
  531. if (port == fout->port) {
  532. ret = fou_dump_info(fout, info->snd_portid,
  533. info->snd_seq, 0, msg,
  534. info->genlhdr->cmd);
  535. break;
  536. }
  537. }
  538. mutex_unlock(&fn->fou_lock);
  539. if (ret < 0)
  540. goto out_free;
  541. return genlmsg_reply(msg, info);
  542. out_free:
  543. nlmsg_free(msg);
  544. return ret;
  545. }
  546. static int fou_nl_dump(struct sk_buff *skb, struct netlink_callback *cb)
  547. {
  548. struct net *net = sock_net(skb->sk);
  549. struct fou_net *fn = net_generic(net, fou_net_id);
  550. struct fou *fout;
  551. int idx = 0, ret;
  552. mutex_lock(&fn->fou_lock);
  553. list_for_each_entry(fout, &fn->fou_list, list) {
  554. if (idx++ < cb->args[0])
  555. continue;
  556. ret = fou_dump_info(fout, NETLINK_CB(cb->skb).portid,
  557. cb->nlh->nlmsg_seq, NLM_F_MULTI,
  558. skb, FOU_CMD_GET);
  559. if (ret)
  560. break;
  561. }
  562. mutex_unlock(&fn->fou_lock);
  563. cb->args[0] = idx;
  564. return skb->len;
  565. }
  566. static const struct genl_ops fou_nl_ops[] = {
  567. {
  568. .cmd = FOU_CMD_ADD,
  569. .doit = fou_nl_cmd_add_port,
  570. .policy = fou_nl_policy,
  571. .flags = GENL_ADMIN_PERM,
  572. },
  573. {
  574. .cmd = FOU_CMD_DEL,
  575. .doit = fou_nl_cmd_rm_port,
  576. .policy = fou_nl_policy,
  577. .flags = GENL_ADMIN_PERM,
  578. },
  579. {
  580. .cmd = FOU_CMD_GET,
  581. .doit = fou_nl_cmd_get_port,
  582. .dumpit = fou_nl_dump,
  583. .policy = fou_nl_policy,
  584. },
  585. };
  586. size_t fou_encap_hlen(struct ip_tunnel_encap *e)
  587. {
  588. return sizeof(struct udphdr);
  589. }
  590. EXPORT_SYMBOL(fou_encap_hlen);
  591. size_t gue_encap_hlen(struct ip_tunnel_encap *e)
  592. {
  593. size_t len;
  594. bool need_priv = false;
  595. len = sizeof(struct udphdr) + sizeof(struct guehdr);
  596. if (e->flags & TUNNEL_ENCAP_FLAG_REMCSUM) {
  597. len += GUE_PLEN_REMCSUM;
  598. need_priv = true;
  599. }
  600. len += need_priv ? GUE_LEN_PRIV : 0;
  601. return len;
  602. }
  603. EXPORT_SYMBOL(gue_encap_hlen);
  604. static void fou_build_udp(struct sk_buff *skb, struct ip_tunnel_encap *e,
  605. struct flowi4 *fl4, u8 *protocol, __be16 sport)
  606. {
  607. struct udphdr *uh;
  608. skb_push(skb, sizeof(struct udphdr));
  609. skb_reset_transport_header(skb);
  610. uh = udp_hdr(skb);
  611. uh->dest = e->dport;
  612. uh->source = sport;
  613. uh->len = htons(skb->len);
  614. uh->check = 0;
  615. udp_set_csum(!(e->flags & TUNNEL_ENCAP_FLAG_CSUM), skb,
  616. fl4->saddr, fl4->daddr, skb->len);
  617. *protocol = IPPROTO_UDP;
  618. }
  619. int fou_build_header(struct sk_buff *skb, struct ip_tunnel_encap *e,
  620. u8 *protocol, struct flowi4 *fl4)
  621. {
  622. bool csum = !!(e->flags & TUNNEL_ENCAP_FLAG_CSUM);
  623. int type = csum ? SKB_GSO_UDP_TUNNEL_CSUM : SKB_GSO_UDP_TUNNEL;
  624. __be16 sport;
  625. skb = iptunnel_handle_offloads(skb, csum, type);
  626. if (IS_ERR(skb))
  627. return PTR_ERR(skb);
  628. sport = e->sport ? : udp_flow_src_port(dev_net(skb->dev),
  629. skb, 0, 0, false);
  630. fou_build_udp(skb, e, fl4, protocol, sport);
  631. return 0;
  632. }
  633. EXPORT_SYMBOL(fou_build_header);
  634. int gue_build_header(struct sk_buff *skb, struct ip_tunnel_encap *e,
  635. u8 *protocol, struct flowi4 *fl4)
  636. {
  637. bool csum = !!(e->flags & TUNNEL_ENCAP_FLAG_CSUM);
  638. int type = csum ? SKB_GSO_UDP_TUNNEL_CSUM : SKB_GSO_UDP_TUNNEL;
  639. struct guehdr *guehdr;
  640. size_t hdrlen, optlen = 0;
  641. __be16 sport;
  642. void *data;
  643. bool need_priv = false;
  644. if ((e->flags & TUNNEL_ENCAP_FLAG_REMCSUM) &&
  645. skb->ip_summed == CHECKSUM_PARTIAL) {
  646. csum = false;
  647. optlen += GUE_PLEN_REMCSUM;
  648. type |= SKB_GSO_TUNNEL_REMCSUM;
  649. need_priv = true;
  650. }
  651. optlen += need_priv ? GUE_LEN_PRIV : 0;
  652. skb = iptunnel_handle_offloads(skb, csum, type);
  653. if (IS_ERR(skb))
  654. return PTR_ERR(skb);
  655. /* Get source port (based on flow hash) before skb_push */
  656. sport = e->sport ? : udp_flow_src_port(dev_net(skb->dev),
  657. skb, 0, 0, false);
  658. hdrlen = sizeof(struct guehdr) + optlen;
  659. skb_push(skb, hdrlen);
  660. guehdr = (struct guehdr *)skb->data;
  661. guehdr->control = 0;
  662. guehdr->version = 0;
  663. guehdr->hlen = optlen >> 2;
  664. guehdr->flags = 0;
  665. guehdr->proto_ctype = *protocol;
  666. data = &guehdr[1];
  667. if (need_priv) {
  668. __be32 *flags = data;
  669. guehdr->flags |= GUE_FLAG_PRIV;
  670. *flags = 0;
  671. data += GUE_LEN_PRIV;
  672. if (type & SKB_GSO_TUNNEL_REMCSUM) {
  673. u16 csum_start = skb_checksum_start_offset(skb);
  674. __be16 *pd = data;
  675. if (csum_start < hdrlen)
  676. return -EINVAL;
  677. csum_start -= hdrlen;
  678. pd[0] = htons(csum_start);
  679. pd[1] = htons(csum_start + skb->csum_offset);
  680. if (!skb_is_gso(skb)) {
  681. skb->ip_summed = CHECKSUM_NONE;
  682. skb->encapsulation = 0;
  683. }
  684. *flags |= GUE_PFLAG_REMCSUM;
  685. data += GUE_PLEN_REMCSUM;
  686. }
  687. }
  688. fou_build_udp(skb, e, fl4, protocol, sport);
  689. return 0;
  690. }
  691. EXPORT_SYMBOL(gue_build_header);
  692. #ifdef CONFIG_NET_FOU_IP_TUNNELS
  693. static const struct ip_tunnel_encap_ops fou_iptun_ops = {
  694. .encap_hlen = fou_encap_hlen,
  695. .build_header = fou_build_header,
  696. };
  697. static const struct ip_tunnel_encap_ops gue_iptun_ops = {
  698. .encap_hlen = gue_encap_hlen,
  699. .build_header = gue_build_header,
  700. };
  701. static int ip_tunnel_encap_add_fou_ops(void)
  702. {
  703. int ret;
  704. ret = ip_tunnel_encap_add_ops(&fou_iptun_ops, TUNNEL_ENCAP_FOU);
  705. if (ret < 0) {
  706. pr_err("can't add fou ops\n");
  707. return ret;
  708. }
  709. ret = ip_tunnel_encap_add_ops(&gue_iptun_ops, TUNNEL_ENCAP_GUE);
  710. if (ret < 0) {
  711. pr_err("can't add gue ops\n");
  712. ip_tunnel_encap_del_ops(&fou_iptun_ops, TUNNEL_ENCAP_FOU);
  713. return ret;
  714. }
  715. return 0;
  716. }
  717. static void ip_tunnel_encap_del_fou_ops(void)
  718. {
  719. ip_tunnel_encap_del_ops(&fou_iptun_ops, TUNNEL_ENCAP_FOU);
  720. ip_tunnel_encap_del_ops(&gue_iptun_ops, TUNNEL_ENCAP_GUE);
  721. }
  722. #else
  723. static int ip_tunnel_encap_add_fou_ops(void)
  724. {
  725. return 0;
  726. }
  727. static void ip_tunnel_encap_del_fou_ops(void)
  728. {
  729. }
  730. #endif
  731. static __net_init int fou_init_net(struct net *net)
  732. {
  733. struct fou_net *fn = net_generic(net, fou_net_id);
  734. INIT_LIST_HEAD(&fn->fou_list);
  735. mutex_init(&fn->fou_lock);
  736. return 0;
  737. }
  738. static __net_exit void fou_exit_net(struct net *net)
  739. {
  740. struct fou_net *fn = net_generic(net, fou_net_id);
  741. struct fou *fou, *next;
  742. /* Close all the FOU sockets */
  743. mutex_lock(&fn->fou_lock);
  744. list_for_each_entry_safe(fou, next, &fn->fou_list, list)
  745. fou_release(fou);
  746. mutex_unlock(&fn->fou_lock);
  747. }
  748. static struct pernet_operations fou_net_ops = {
  749. .init = fou_init_net,
  750. .exit = fou_exit_net,
  751. .id = &fou_net_id,
  752. .size = sizeof(struct fou_net),
  753. };
  754. static int __init fou_init(void)
  755. {
  756. int ret;
  757. ret = register_pernet_device(&fou_net_ops);
  758. if (ret)
  759. goto exit;
  760. ret = genl_register_family_with_ops(&fou_nl_family,
  761. fou_nl_ops);
  762. if (ret < 0)
  763. goto unregister;
  764. ret = ip_tunnel_encap_add_fou_ops();
  765. if (ret == 0)
  766. return 0;
  767. genl_unregister_family(&fou_nl_family);
  768. unregister:
  769. unregister_pernet_device(&fou_net_ops);
  770. exit:
  771. return ret;
  772. }
  773. static void __exit fou_fini(void)
  774. {
  775. ip_tunnel_encap_del_fou_ops();
  776. genl_unregister_family(&fou_nl_family);
  777. unregister_pernet_device(&fou_net_ops);
  778. }
  779. module_init(fou_init);
  780. module_exit(fou_fini);
  781. MODULE_AUTHOR("Tom Herbert <therbert@google.com>");
  782. MODULE_LICENSE("GPL");