xfrm_input.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482
  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. family = XFRM_SPI_SKB_CB(skb)->family;
  195. if (!(xo->status & CRYPTO_SUCCESS)) {
  196. if (xo->status &
  197. (CRYPTO_TRANSPORT_AH_AUTH_FAILED |
  198. CRYPTO_TRANSPORT_ESP_AUTH_FAILED |
  199. CRYPTO_TUNNEL_AH_AUTH_FAILED |
  200. CRYPTO_TUNNEL_ESP_AUTH_FAILED)) {
  201. xfrm_audit_state_icvfail(x, skb,
  202. x->type->proto);
  203. x->stats.integrity_failed++;
  204. XFRM_INC_STATS(net, LINUX_MIB_XFRMINSTATEPROTOERROR);
  205. goto drop;
  206. }
  207. if (xo->status & CRYPTO_INVALID_PROTOCOL) {
  208. XFRM_INC_STATS(net, LINUX_MIB_XFRMINSTATEPROTOERROR);
  209. goto drop;
  210. }
  211. XFRM_INC_STATS(net, LINUX_MIB_XFRMINBUFFERERROR);
  212. goto drop;
  213. }
  214. if ((err = xfrm_parse_spi(skb, nexthdr, &spi, &seq)) != 0) {
  215. XFRM_INC_STATS(net, LINUX_MIB_XFRMINHDRERROR);
  216. goto drop;
  217. }
  218. }
  219. goto lock;
  220. }
  221. family = XFRM_SPI_SKB_CB(skb)->family;
  222. /* if tunnel is present override skb->mark value with tunnel i_key */
  223. switch (family) {
  224. case AF_INET:
  225. if (XFRM_TUNNEL_SKB_CB(skb)->tunnel.ip4)
  226. mark = be32_to_cpu(XFRM_TUNNEL_SKB_CB(skb)->tunnel.ip4->parms.i_key);
  227. break;
  228. case AF_INET6:
  229. if (XFRM_TUNNEL_SKB_CB(skb)->tunnel.ip6)
  230. mark = be32_to_cpu(XFRM_TUNNEL_SKB_CB(skb)->tunnel.ip6->parms.i_key);
  231. break;
  232. }
  233. err = secpath_set(skb);
  234. if (err) {
  235. XFRM_INC_STATS(net, LINUX_MIB_XFRMINERROR);
  236. goto drop;
  237. }
  238. seq = 0;
  239. if (!spi && (err = xfrm_parse_spi(skb, nexthdr, &spi, &seq)) != 0) {
  240. XFRM_INC_STATS(net, LINUX_MIB_XFRMINHDRERROR);
  241. goto drop;
  242. }
  243. daddr = (xfrm_address_t *)(skb_network_header(skb) +
  244. XFRM_SPI_SKB_CB(skb)->daddroff);
  245. do {
  246. if (skb->sp->len == XFRM_MAX_DEPTH) {
  247. XFRM_INC_STATS(net, LINUX_MIB_XFRMINBUFFERERROR);
  248. goto drop;
  249. }
  250. x = xfrm_state_lookup(net, mark, daddr, spi, nexthdr, family);
  251. if (x == NULL) {
  252. XFRM_INC_STATS(net, LINUX_MIB_XFRMINNOSTATES);
  253. xfrm_audit_state_notfound(skb, family, spi, seq);
  254. goto drop;
  255. }
  256. skb->sp->xvec[skb->sp->len++] = x;
  257. lock:
  258. spin_lock(&x->lock);
  259. if (unlikely(x->km.state != XFRM_STATE_VALID)) {
  260. if (x->km.state == XFRM_STATE_ACQ)
  261. XFRM_INC_STATS(net, LINUX_MIB_XFRMACQUIREERROR);
  262. else
  263. XFRM_INC_STATS(net,
  264. LINUX_MIB_XFRMINSTATEINVALID);
  265. goto drop_unlock;
  266. }
  267. if ((x->encap ? x->encap->encap_type : 0) != encap_type) {
  268. XFRM_INC_STATS(net, LINUX_MIB_XFRMINSTATEMISMATCH);
  269. goto drop_unlock;
  270. }
  271. if (x->repl->check(x, skb, seq)) {
  272. XFRM_INC_STATS(net, LINUX_MIB_XFRMINSTATESEQERROR);
  273. goto drop_unlock;
  274. }
  275. if (xfrm_state_check_expire(x)) {
  276. XFRM_INC_STATS(net, LINUX_MIB_XFRMINSTATEEXPIRED);
  277. goto drop_unlock;
  278. }
  279. spin_unlock(&x->lock);
  280. if (xfrm_tunnel_check(skb, x, family)) {
  281. XFRM_INC_STATS(net, LINUX_MIB_XFRMINSTATEMODEERROR);
  282. goto drop;
  283. }
  284. seq_hi = htonl(xfrm_replay_seqhi(x, seq));
  285. XFRM_SKB_CB(skb)->seq.input.low = seq;
  286. XFRM_SKB_CB(skb)->seq.input.hi = seq_hi;
  287. skb_dst_force(skb);
  288. dev_hold(skb->dev);
  289. if (crypto_done)
  290. nexthdr = x->type_offload->input_tail(x, skb);
  291. else
  292. nexthdr = x->type->input(x, skb);
  293. if (nexthdr == -EINPROGRESS)
  294. return 0;
  295. resume:
  296. dev_put(skb->dev);
  297. spin_lock(&x->lock);
  298. if (nexthdr <= 0) {
  299. if (nexthdr == -EBADMSG) {
  300. xfrm_audit_state_icvfail(x, skb,
  301. x->type->proto);
  302. x->stats.integrity_failed++;
  303. }
  304. XFRM_INC_STATS(net, LINUX_MIB_XFRMINSTATEPROTOERROR);
  305. goto drop_unlock;
  306. }
  307. /* only the first xfrm gets the encap type */
  308. encap_type = 0;
  309. if (async && x->repl->recheck(x, skb, seq)) {
  310. XFRM_INC_STATS(net, LINUX_MIB_XFRMINSTATESEQERROR);
  311. goto drop_unlock;
  312. }
  313. x->repl->advance(x, seq);
  314. x->curlft.bytes += skb->len;
  315. x->curlft.packets++;
  316. spin_unlock(&x->lock);
  317. XFRM_MODE_SKB_CB(skb)->protocol = nexthdr;
  318. inner_mode = x->inner_mode;
  319. if (x->sel.family == AF_UNSPEC) {
  320. inner_mode = xfrm_ip2inner_mode(x, XFRM_MODE_SKB_CB(skb)->protocol);
  321. if (inner_mode == NULL) {
  322. XFRM_INC_STATS(net, LINUX_MIB_XFRMINSTATEMODEERROR);
  323. goto drop;
  324. }
  325. }
  326. if (inner_mode->input(x, skb)) {
  327. XFRM_INC_STATS(net, LINUX_MIB_XFRMINSTATEMODEERROR);
  328. goto drop;
  329. }
  330. if (x->outer_mode->flags & XFRM_MODE_FLAG_TUNNEL) {
  331. decaps = 1;
  332. break;
  333. }
  334. /*
  335. * We need the inner address. However, we only get here for
  336. * transport mode so the outer address is identical.
  337. */
  338. daddr = &x->id.daddr;
  339. family = x->outer_mode->afinfo->family;
  340. err = xfrm_parse_spi(skb, nexthdr, &spi, &seq);
  341. if (err < 0) {
  342. XFRM_INC_STATS(net, LINUX_MIB_XFRMINHDRERROR);
  343. goto drop;
  344. }
  345. } while (!err);
  346. err = xfrm_rcv_cb(skb, family, x->type->proto, 0);
  347. if (err)
  348. goto drop;
  349. nf_reset(skb);
  350. if (decaps) {
  351. if (skb->sp)
  352. skb->sp->olen = 0;
  353. skb_dst_drop(skb);
  354. gro_cells_receive(&gro_cells, skb);
  355. return 0;
  356. } else {
  357. xo = xfrm_offload(skb);
  358. if (xo)
  359. xfrm_gro = xo->flags & XFRM_GRO;
  360. err = x->inner_mode->afinfo->transport_finish(skb, xfrm_gro || async);
  361. if (xfrm_gro) {
  362. if (skb->sp)
  363. skb->sp->olen = 0;
  364. skb_dst_drop(skb);
  365. gro_cells_receive(&gro_cells, skb);
  366. return err;
  367. }
  368. return err;
  369. }
  370. drop_unlock:
  371. spin_unlock(&x->lock);
  372. drop:
  373. xfrm_rcv_cb(skb, family, x && x->type ? x->type->proto : nexthdr, -1);
  374. kfree_skb(skb);
  375. return 0;
  376. }
  377. EXPORT_SYMBOL(xfrm_input);
  378. int xfrm_input_resume(struct sk_buff *skb, int nexthdr)
  379. {
  380. return xfrm_input(skb, nexthdr, 0, -1);
  381. }
  382. EXPORT_SYMBOL(xfrm_input_resume);
  383. void __init xfrm_input_init(void)
  384. {
  385. int err;
  386. init_dummy_netdev(&xfrm_napi_dev);
  387. err = gro_cells_init(&gro_cells, &xfrm_napi_dev);
  388. if (err)
  389. gro_cells.cells = NULL;
  390. secpath_cachep = kmem_cache_create("secpath_cache",
  391. sizeof(struct sec_path),
  392. 0, SLAB_HWCACHE_ALIGN|SLAB_PANIC,
  393. NULL);
  394. }