xfrm_input.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * xfrm_input.c
  4. *
  5. * Changes:
  6. * YOSHIFUJI Hideaki @USAGI
  7. * Split up af-specific portion
  8. *
  9. */
  10. #include <linux/slab.h>
  11. #include <linux/module.h>
  12. #include <linux/netdevice.h>
  13. #include <net/dst.h>
  14. #include <net/ip.h>
  15. #include <net/xfrm.h>
  16. #include <net/ip_tunnels.h>
  17. #include <net/ip6_tunnel.h>
  18. static struct kmem_cache *secpath_cachep __read_mostly;
  19. static DEFINE_SPINLOCK(xfrm_input_afinfo_lock);
  20. static struct xfrm_input_afinfo const __rcu *xfrm_input_afinfo[AF_INET6 + 1];
  21. static struct gro_cells gro_cells;
  22. static struct net_device xfrm_napi_dev;
  23. int xfrm_input_register_afinfo(const struct xfrm_input_afinfo *afinfo)
  24. {
  25. int err = 0;
  26. if (WARN_ON(afinfo->family >= ARRAY_SIZE(xfrm_input_afinfo)))
  27. return -EAFNOSUPPORT;
  28. spin_lock_bh(&xfrm_input_afinfo_lock);
  29. if (unlikely(xfrm_input_afinfo[afinfo->family] != NULL))
  30. err = -EEXIST;
  31. else
  32. rcu_assign_pointer(xfrm_input_afinfo[afinfo->family], afinfo);
  33. spin_unlock_bh(&xfrm_input_afinfo_lock);
  34. return err;
  35. }
  36. EXPORT_SYMBOL(xfrm_input_register_afinfo);
  37. int xfrm_input_unregister_afinfo(const struct xfrm_input_afinfo *afinfo)
  38. {
  39. int err = 0;
  40. spin_lock_bh(&xfrm_input_afinfo_lock);
  41. if (likely(xfrm_input_afinfo[afinfo->family] != NULL)) {
  42. if (unlikely(xfrm_input_afinfo[afinfo->family] != afinfo))
  43. err = -EINVAL;
  44. else
  45. RCU_INIT_POINTER(xfrm_input_afinfo[afinfo->family], NULL);
  46. }
  47. spin_unlock_bh(&xfrm_input_afinfo_lock);
  48. synchronize_rcu();
  49. return err;
  50. }
  51. EXPORT_SYMBOL(xfrm_input_unregister_afinfo);
  52. static const struct xfrm_input_afinfo *xfrm_input_get_afinfo(unsigned int family)
  53. {
  54. const struct xfrm_input_afinfo *afinfo;
  55. if (WARN_ON_ONCE(family >= ARRAY_SIZE(xfrm_input_afinfo)))
  56. return NULL;
  57. rcu_read_lock();
  58. afinfo = rcu_dereference(xfrm_input_afinfo[family]);
  59. if (unlikely(!afinfo))
  60. rcu_read_unlock();
  61. return afinfo;
  62. }
  63. static int xfrm_rcv_cb(struct sk_buff *skb, unsigned int family, u8 protocol,
  64. int err)
  65. {
  66. int ret;
  67. const struct xfrm_input_afinfo *afinfo = xfrm_input_get_afinfo(family);
  68. if (!afinfo)
  69. return -EAFNOSUPPORT;
  70. ret = afinfo->callback(skb, protocol, err);
  71. rcu_read_unlock();
  72. return ret;
  73. }
  74. void __secpath_destroy(struct sec_path *sp)
  75. {
  76. int i;
  77. for (i = 0; i < sp->len; i++)
  78. xfrm_state_put(sp->xvec[i]);
  79. kmem_cache_free(secpath_cachep, sp);
  80. }
  81. EXPORT_SYMBOL(__secpath_destroy);
  82. struct sec_path *secpath_dup(struct sec_path *src)
  83. {
  84. struct sec_path *sp;
  85. sp = kmem_cache_alloc(secpath_cachep, GFP_ATOMIC);
  86. if (!sp)
  87. return NULL;
  88. sp->len = 0;
  89. sp->olen = 0;
  90. memset(sp->ovec, 0, sizeof(sp->ovec[XFRM_MAX_OFFLOAD_DEPTH]));
  91. if (src) {
  92. int i;
  93. memcpy(sp, src, sizeof(*sp));
  94. for (i = 0; i < sp->len; i++)
  95. xfrm_state_hold(sp->xvec[i]);
  96. }
  97. refcount_set(&sp->refcnt, 1);
  98. return sp;
  99. }
  100. EXPORT_SYMBOL(secpath_dup);
  101. int secpath_set(struct sk_buff *skb)
  102. {
  103. struct sec_path *sp;
  104. /* Allocate new secpath or COW existing one. */
  105. if (!skb->sp || refcount_read(&skb->sp->refcnt) != 1) {
  106. sp = secpath_dup(skb->sp);
  107. if (!sp)
  108. return -ENOMEM;
  109. if (skb->sp)
  110. secpath_put(skb->sp);
  111. skb->sp = sp;
  112. }
  113. return 0;
  114. }
  115. EXPORT_SYMBOL(secpath_set);
  116. /* Fetch spi and seq from ipsec header */
  117. int xfrm_parse_spi(struct sk_buff *skb, u8 nexthdr, __be32 *spi, __be32 *seq)
  118. {
  119. int offset, offset_seq;
  120. int hlen;
  121. switch (nexthdr) {
  122. case IPPROTO_AH:
  123. hlen = sizeof(struct ip_auth_hdr);
  124. offset = offsetof(struct ip_auth_hdr, spi);
  125. offset_seq = offsetof(struct ip_auth_hdr, seq_no);
  126. break;
  127. case IPPROTO_ESP:
  128. hlen = sizeof(struct ip_esp_hdr);
  129. offset = offsetof(struct ip_esp_hdr, spi);
  130. offset_seq = offsetof(struct ip_esp_hdr, seq_no);
  131. break;
  132. case IPPROTO_COMP:
  133. if (!pskb_may_pull(skb, sizeof(struct ip_comp_hdr)))
  134. return -EINVAL;
  135. *spi = htonl(ntohs(*(__be16 *)(skb_transport_header(skb) + 2)));
  136. *seq = 0;
  137. return 0;
  138. default:
  139. return 1;
  140. }
  141. if (!pskb_may_pull(skb, hlen))
  142. return -EINVAL;
  143. *spi = *(__be32 *)(skb_transport_header(skb) + offset);
  144. *seq = *(__be32 *)(skb_transport_header(skb) + offset_seq);
  145. return 0;
  146. }
  147. EXPORT_SYMBOL(xfrm_parse_spi);
  148. int xfrm_prepare_input(struct xfrm_state *x, struct sk_buff *skb)
  149. {
  150. struct xfrm_mode *inner_mode = x->inner_mode;
  151. int err;
  152. err = x->outer_mode->afinfo->extract_input(x, skb);
  153. if (err)
  154. return err;
  155. if (x->sel.family == AF_UNSPEC) {
  156. inner_mode = xfrm_ip2inner_mode(x, XFRM_MODE_SKB_CB(skb)->protocol);
  157. if (inner_mode == NULL)
  158. return -EAFNOSUPPORT;
  159. }
  160. skb->protocol = inner_mode->afinfo->eth_proto;
  161. return inner_mode->input2(x, skb);
  162. }
  163. EXPORT_SYMBOL(xfrm_prepare_input);
  164. int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi, int encap_type)
  165. {
  166. struct net *net = dev_net(skb->dev);
  167. int err;
  168. __be32 seq;
  169. __be32 seq_hi;
  170. struct xfrm_state *x = NULL;
  171. xfrm_address_t *daddr;
  172. struct xfrm_mode *inner_mode;
  173. u32 mark = skb->mark;
  174. unsigned int family;
  175. int decaps = 0;
  176. int async = 0;
  177. bool xfrm_gro = false;
  178. bool crypto_done = false;
  179. struct xfrm_offload *xo = xfrm_offload(skb);
  180. if (encap_type < 0) {
  181. x = xfrm_input_state(skb);
  182. family = x->outer_mode->afinfo->family;
  183. /* An encap_type of -1 indicates async resumption. */
  184. if (encap_type == -1) {
  185. async = 1;
  186. seq = XFRM_SKB_CB(skb)->seq.input.low;
  187. goto resume;
  188. }
  189. /* encap_type < -1 indicates a GRO call. */
  190. encap_type = 0;
  191. seq = XFRM_SPI_SKB_CB(skb)->seq;
  192. if (xo && (xo->flags & CRYPTO_DONE)) {
  193. crypto_done = true;
  194. x = xfrm_input_state(skb);
  195. family = XFRM_SPI_SKB_CB(skb)->family;
  196. if (!(xo->status & CRYPTO_SUCCESS)) {
  197. if (xo->status &
  198. (CRYPTO_TRANSPORT_AH_AUTH_FAILED |
  199. CRYPTO_TRANSPORT_ESP_AUTH_FAILED |
  200. CRYPTO_TUNNEL_AH_AUTH_FAILED |
  201. CRYPTO_TUNNEL_ESP_AUTH_FAILED)) {
  202. xfrm_audit_state_icvfail(x, skb,
  203. x->type->proto);
  204. x->stats.integrity_failed++;
  205. XFRM_INC_STATS(net, LINUX_MIB_XFRMINSTATEPROTOERROR);
  206. goto drop;
  207. }
  208. if (xo->status & CRYPTO_INVALID_PROTOCOL) {
  209. XFRM_INC_STATS(net, LINUX_MIB_XFRMINSTATEPROTOERROR);
  210. goto drop;
  211. }
  212. XFRM_INC_STATS(net, LINUX_MIB_XFRMINBUFFERERROR);
  213. goto drop;
  214. }
  215. if ((err = xfrm_parse_spi(skb, nexthdr, &spi, &seq)) != 0) {
  216. XFRM_INC_STATS(net, LINUX_MIB_XFRMINHDRERROR);
  217. goto drop;
  218. }
  219. }
  220. goto lock;
  221. }
  222. family = XFRM_SPI_SKB_CB(skb)->family;
  223. /* if tunnel is present override skb->mark value with tunnel i_key */
  224. switch (family) {
  225. case AF_INET:
  226. if (XFRM_TUNNEL_SKB_CB(skb)->tunnel.ip4)
  227. mark = be32_to_cpu(XFRM_TUNNEL_SKB_CB(skb)->tunnel.ip4->parms.i_key);
  228. break;
  229. case AF_INET6:
  230. if (XFRM_TUNNEL_SKB_CB(skb)->tunnel.ip6)
  231. mark = be32_to_cpu(XFRM_TUNNEL_SKB_CB(skb)->tunnel.ip6->parms.i_key);
  232. break;
  233. }
  234. err = secpath_set(skb);
  235. if (err) {
  236. XFRM_INC_STATS(net, LINUX_MIB_XFRMINERROR);
  237. goto drop;
  238. }
  239. seq = 0;
  240. if (!spi && (err = xfrm_parse_spi(skb, nexthdr, &spi, &seq)) != 0) {
  241. XFRM_INC_STATS(net, LINUX_MIB_XFRMINHDRERROR);
  242. goto drop;
  243. }
  244. daddr = (xfrm_address_t *)(skb_network_header(skb) +
  245. XFRM_SPI_SKB_CB(skb)->daddroff);
  246. do {
  247. if (skb->sp->len == XFRM_MAX_DEPTH) {
  248. XFRM_INC_STATS(net, LINUX_MIB_XFRMINBUFFERERROR);
  249. goto drop;
  250. }
  251. x = xfrm_state_lookup(net, mark, daddr, spi, nexthdr, family);
  252. if (x == NULL) {
  253. XFRM_INC_STATS(net, LINUX_MIB_XFRMINNOSTATES);
  254. xfrm_audit_state_notfound(skb, family, spi, seq);
  255. goto drop;
  256. }
  257. skb->sp->xvec[skb->sp->len++] = x;
  258. lock:
  259. spin_lock(&x->lock);
  260. if (unlikely(x->km.state != XFRM_STATE_VALID)) {
  261. if (x->km.state == XFRM_STATE_ACQ)
  262. XFRM_INC_STATS(net, LINUX_MIB_XFRMACQUIREERROR);
  263. else
  264. XFRM_INC_STATS(net,
  265. LINUX_MIB_XFRMINSTATEINVALID);
  266. goto drop_unlock;
  267. }
  268. if ((x->encap ? x->encap->encap_type : 0) != encap_type) {
  269. XFRM_INC_STATS(net, LINUX_MIB_XFRMINSTATEMISMATCH);
  270. goto drop_unlock;
  271. }
  272. if (x->repl->check(x, skb, seq)) {
  273. XFRM_INC_STATS(net, LINUX_MIB_XFRMINSTATESEQERROR);
  274. goto drop_unlock;
  275. }
  276. if (xfrm_state_check_expire(x)) {
  277. XFRM_INC_STATS(net, LINUX_MIB_XFRMINSTATEEXPIRED);
  278. goto drop_unlock;
  279. }
  280. spin_unlock(&x->lock);
  281. if (xfrm_tunnel_check(skb, x, family)) {
  282. XFRM_INC_STATS(net, LINUX_MIB_XFRMINSTATEMODEERROR);
  283. goto drop;
  284. }
  285. seq_hi = htonl(xfrm_replay_seqhi(x, seq));
  286. XFRM_SKB_CB(skb)->seq.input.low = seq;
  287. XFRM_SKB_CB(skb)->seq.input.hi = seq_hi;
  288. skb_dst_force(skb);
  289. dev_hold(skb->dev);
  290. if (crypto_done)
  291. nexthdr = x->type_offload->input_tail(x, skb);
  292. else
  293. nexthdr = x->type->input(x, skb);
  294. if (nexthdr == -EINPROGRESS)
  295. return 0;
  296. resume:
  297. dev_put(skb->dev);
  298. spin_lock(&x->lock);
  299. if (nexthdr <= 0) {
  300. if (nexthdr == -EBADMSG) {
  301. xfrm_audit_state_icvfail(x, skb,
  302. x->type->proto);
  303. x->stats.integrity_failed++;
  304. }
  305. XFRM_INC_STATS(net, LINUX_MIB_XFRMINSTATEPROTOERROR);
  306. goto drop_unlock;
  307. }
  308. /* only the first xfrm gets the encap type */
  309. encap_type = 0;
  310. if (async && x->repl->recheck(x, skb, seq)) {
  311. XFRM_INC_STATS(net, LINUX_MIB_XFRMINSTATESEQERROR);
  312. goto drop_unlock;
  313. }
  314. x->repl->advance(x, seq);
  315. x->curlft.bytes += skb->len;
  316. x->curlft.packets++;
  317. spin_unlock(&x->lock);
  318. XFRM_MODE_SKB_CB(skb)->protocol = nexthdr;
  319. inner_mode = x->inner_mode;
  320. if (x->sel.family == AF_UNSPEC) {
  321. inner_mode = xfrm_ip2inner_mode(x, XFRM_MODE_SKB_CB(skb)->protocol);
  322. if (inner_mode == NULL) {
  323. XFRM_INC_STATS(net, LINUX_MIB_XFRMINSTATEMODEERROR);
  324. goto drop;
  325. }
  326. }
  327. if (inner_mode->input(x, skb)) {
  328. XFRM_INC_STATS(net, LINUX_MIB_XFRMINSTATEMODEERROR);
  329. goto drop;
  330. }
  331. if (x->outer_mode->flags & XFRM_MODE_FLAG_TUNNEL) {
  332. decaps = 1;
  333. break;
  334. }
  335. /*
  336. * We need the inner address. However, we only get here for
  337. * transport mode so the outer address is identical.
  338. */
  339. daddr = &x->id.daddr;
  340. family = x->outer_mode->afinfo->family;
  341. err = xfrm_parse_spi(skb, nexthdr, &spi, &seq);
  342. if (err < 0) {
  343. XFRM_INC_STATS(net, LINUX_MIB_XFRMINHDRERROR);
  344. goto drop;
  345. }
  346. } while (!err);
  347. err = xfrm_rcv_cb(skb, family, x->type->proto, 0);
  348. if (err)
  349. goto drop;
  350. nf_reset(skb);
  351. if (decaps) {
  352. if (skb->sp)
  353. skb->sp->olen = 0;
  354. skb_dst_drop(skb);
  355. gro_cells_receive(&gro_cells, skb);
  356. return 0;
  357. } else {
  358. xo = xfrm_offload(skb);
  359. if (xo)
  360. xfrm_gro = xo->flags & XFRM_GRO;
  361. err = x->inner_mode->afinfo->transport_finish(skb, xfrm_gro || async);
  362. if (xfrm_gro) {
  363. if (skb->sp)
  364. skb->sp->olen = 0;
  365. skb_dst_drop(skb);
  366. gro_cells_receive(&gro_cells, skb);
  367. return err;
  368. }
  369. return err;
  370. }
  371. drop_unlock:
  372. spin_unlock(&x->lock);
  373. drop:
  374. xfrm_rcv_cb(skb, family, x && x->type ? x->type->proto : nexthdr, -1);
  375. kfree_skb(skb);
  376. return 0;
  377. }
  378. EXPORT_SYMBOL(xfrm_input);
  379. int xfrm_input_resume(struct sk_buff *skb, int nexthdr)
  380. {
  381. return xfrm_input(skb, nexthdr, 0, -1);
  382. }
  383. EXPORT_SYMBOL(xfrm_input_resume);
  384. void __init xfrm_input_init(void)
  385. {
  386. int err;
  387. init_dummy_netdev(&xfrm_napi_dev);
  388. err = gro_cells_init(&gro_cells, &xfrm_napi_dev);
  389. if (err)
  390. gro_cells.cells = NULL;
  391. secpath_cachep = kmem_cache_create("secpath_cache",
  392. sizeof(struct sec_path),
  393. 0, SLAB_HWCACHE_ALIGN|SLAB_PANIC,
  394. NULL);
  395. }