17 #include <linux/capability.h>
18 #include <linux/module.h>
19 #include <linux/kernel.h>
20 #include <linux/socket.h>
24 #include <linux/rtnetlink.h>
26 #include <linux/in6.h>
29 #include <linux/slab.h>
36 #define _X2KEY(x) ((x) == XFRM_INF ? 0 : (x))
37 #define _KEY2X(x) ((x) == 0 ? XFRM_INF : (x))
48 static struct xfrm_mark dummy_mark = {0, 0};
73 static int pfkey_can_dump(
const struct sock *
sk)
80 static void pfkey_terminate_dump(
struct pfkey_sock *pfk)
93 static void pfkey_sock_destruct(
struct sock *sk)
95 struct net *
net = sock_net(sk);
98 pfkey_terminate_dump(pfkey_sk(sk));
102 pr_err(
"Attempt to release alive pfkey socket: %p\n", sk);
114 static void pfkey_insert(
struct sock *sk)
116 struct net *net = sock_net(sk);
120 sk_add_node_rcu(sk, &net_pfkey->
table);
124 static void pfkey_remove(
struct sock *sk)
131 static struct proto key_proto = {
156 sock->
ops = &pfkey_ops;
171 static int pfkey_release(
struct socket *sock)
173 struct sock *sk = sock->
sk;
191 gfp_t allocation,
struct sock *sk)
207 skb_set_owner_r(*skb2, sk);
219 #define BROADCAST_ALL 0
220 #define BROADCAST_ONE 1
221 #define BROADCAST_REGISTERED 2
222 #define BROADCAST_PROMISC_ONLY 4
223 static int pfkey_broadcast(
struct sk_buff *skb,
gfp_t allocation,
224 int broadcast_flags,
struct sock *one_sk,
249 pfkey_broadcast_one(skb, &skb2, allocation, sk);
264 err2 = pfkey_broadcast_one(skb, &skb2, allocation, sk);
274 err = pfkey_broadcast_one(skb, &skb2, allocation, one_sk);
281 static int pfkey_do_dump(
struct pfkey_sock *pfk)
286 rc = pfk->
dump.dump(pfk);
291 if (!pfkey_can_dump(&pfk->
sk))
298 &pfk->
sk, sock_net(&pfk->
sk));
302 pfkey_terminate_dump(pfk);
306 static inline void pfkey_hdr_dup(
struct sadb_msg *
new,
312 static int pfkey_error(
const struct sadb_msg *orig,
int err,
struct sock *sk)
330 BUG_ON(err <= 0 || err >= 256);
333 pfkey_hdr_dup(hdr, orig);
343 static u8 sadb_ext_min_len[] = {
373 static int verify_address_len(
const void *
p)
378 #if IS_ENABLED(CONFIG_IPV6)
390 #if IS_ENABLED(CONFIG_IPV6)
415 static inline int pfkey_sec_ctx_len(
const struct sadb_x_sec_ctx *sec_ctx)
422 static inline int verify_sec_ctx_len(
const void *p)
430 len = pfkey_sec_ctx_len(sec_ctx);
448 uctx->
len = pfkey_sec_ctx_len(sec_ctx);
453 memcpy(uctx + 1, sec_ctx + 1,
462 const struct sockaddr *s_addr, *d_addr;
467 s_addr = (
const struct sockaddr *)(src + 1);
468 d_addr = (
const struct sockaddr *)(dst + 1);
481 static int parse_exthdrs(
struct sk_buff *skb,
const struct sadb_msg *hdr,
void **ext_hdrs)
483 const char *p = (
char *) hdr;
502 int min = (
int) sadb_ext_min_len[ext_type];
505 if (ext_hdrs[ext_type-1] !=
NULL)
511 if (verify_address_len(p))
515 if (verify_sec_ctx_len(p))
518 ext_hdrs[ext_type-1] = (
void *) p;
528 pfkey_satype2proto(
uint8_t satype)
582 #if IS_ENABLED(CONFIG_IPV6)
598 #if IS_ENABLED(CONFIG_IPV6)
612 return pfkey_sockaddr_extract((
struct sockaddr *)(addr + 1),
616 static struct xfrm_state *pfkey_xfrm_state_lookup(
struct net *net,
const struct sadb_msg *hdr,
void *
const *ext_hdrs)
642 #if IS_ENABLED(CONFIG_IPV6)
657 #define PFKEY_ALIGN8(a) (1 + (((a) - 1) | (8 - 1)))
665 static inline int pfkey_mode_from_xfrm(
int mode)
679 static inline int pfkey_mode_to_xfrm(
int mode)
696 unsigned short family)
705 memset(sin->sin_zero, 0,
sizeof(sin->sin_zero));
708 #if IS_ENABLED(CONFIG_IPV6)
725 int add_keys,
int hsc)
738 int auth_key_size = 0;
739 int encrypt_key_size = 0;
745 sockaddr_size = pfkey_sockaddr_size(x->
props.family);
765 if (xfrm_addr_cmp(&x->
sel.saddr, &x->
props.saddr, x->
props.family))
769 if (x->
aalg && x->
aalg->alg_key_len) {
772 size +=
sizeof(
struct sadb_key) + auth_key_size;
774 if (x->
ealg && x->
ealg->alg_key_len) {
777 size +=
sizeof(
struct sadb_key) + encrypt_key_size;
804 switch (x->
km.state) {
889 pfkey_sockaddr_fill(&x->
props.saddr, 0,
906 pfkey_sockaddr_fill(&x->
id.daddr, 0,
912 if (xfrm_addr_cmp(&x->
sel.saddr, &x->
props.saddr,
921 pfkey_proto_from_xfrm(x->
sel.proto);
925 pfkey_sockaddr_fill(&x->
sel.saddr, x->
sel.sport,
931 if (add_keys && auth_key_size) {
933 sizeof(
struct sadb_key)+auth_key_size);
942 if (add_keys && encrypt_key_size) {
944 sizeof(
struct sadb_key)+encrypt_key_size);
946 encrypt_key_size) / sizeof(
uint64_t);
951 (x->
ealg->alg_key_len+7)/8);
958 if ((mode = pfkey_mode_from_xfrm(x->
props.mode)) < 0) {
1018 skb = __pfkey_xfrm_state2msg(x, 1, 3);
1023 static inline struct sk_buff *pfkey_xfrm_state2msg_expire(
const struct xfrm_state *x,
1026 return __pfkey_xfrm_state2msg(x, 0, hsc);
1029 static struct xfrm_state * pfkey_msg2xfrm_state(
struct net *net,
1031 void *
const *ext_hdrs)
1109 if (lifetime !=
NULL) {
1116 if (lifetime !=
NULL) {
1124 if (sec_ctx !=
NULL) {
1130 err = security_xfrm_state_alloc(x, uctx);
1151 x->
aalg->alg_key_len = 0;
1186 x->
ealg->alg_key_len = 0;
1198 if (!x->
props.family) {
1220 x->
sel.family = pfkey_sadb_addr2xfrm_addr(addr, &x->
sel.saddr);
1262 return ERR_PTR(err);
1265 static int pfkey_reserved(
struct sock *sk,
struct sk_buff *skb,
const struct sadb_msg *hdr,
void *
const *ext_hdrs)
1270 static int pfkey_getspi(
struct sock *sk,
struct sk_buff *skb,
const struct sadb_msg *hdr,
void *
const *ext_hdrs)
1272 struct net *net = sock_net(sk);
1281 u32 min_spi, max_spi;
1314 #if IS_ENABLED(CONFIG_IPV6)
1324 if (x && xfrm_addr_cmp(&x->
id.daddr, xdaddr, family)) {
1331 x =
xfrm_find_acq(net, &dummy_mark, mode, reqid, proto, xdaddr, xsaddr, 1, family);
1337 max_spi = 0x0fffffff;
1346 resp_skb = err ? ERR_PTR(err) : pfkey_xfrm_state2msg(x);
1348 if (IS_ERR(resp_skb)) {
1350 return PTR_ERR(resp_skb);
1369 static int pfkey_acquire(
struct sock *sk,
struct sk_buff *skb,
const struct sadb_msg *hdr,
void *
const *ext_hdrs)
1371 struct net *net = sock_net(sk);
1384 spin_lock_bh(&x->
lock);
1389 spin_unlock_bh(&x->
lock);
1394 static inline int event2poltype(
int event)
1406 pr_err(
"pfkey: Unknown policy event %d\n", event);
1413 static inline int event2keytype(
int event)
1425 pr_err(
"pfkey: Unknown SA event %d\n", event);
1438 skb = pfkey_xfrm_state2msg(x);
1441 return PTR_ERR(skb);
1457 static int pfkey_add(
struct sock *sk,
struct sk_buff *skb,
const struct sadb_msg *hdr,
void *
const *ext_hdrs)
1459 struct net *net = sock_net(sk);
1464 x = pfkey_msg2xfrm_state(net, hdr, ext_hdrs);
1474 xfrm_audit_state_add(x, err ? 0 : 1,
1476 audit_get_sessionid(
current), 0);
1480 __xfrm_state_put(x);
1496 static int pfkey_delete(
struct sock *sk,
struct sk_buff *skb,
const struct sadb_msg *hdr,
void *
const *ext_hdrs)
1498 struct net *net = sock_net(sk);
1508 x = pfkey_xfrm_state_lookup(net, hdr, ext_hdrs);
1512 if ((err = security_xfrm_state_delete(x)))
1515 if (xfrm_state_kern(x)) {
1530 xfrm_audit_state_delete(x, err ? 0 : 1,
1532 audit_get_sessionid(
current), 0);
1538 static int pfkey_get(
struct sock *sk,
struct sk_buff *skb,
const struct sadb_msg *hdr,
void *
const *ext_hdrs)
1540 struct net *net = sock_net(sk);
1551 x = pfkey_xfrm_state_lookup(net, hdr, ext_hdrs);
1555 out_skb = pfkey_xfrm_state2msg(x);
1556 proto = x->
id.proto;
1558 if (IS_ERR(out_skb))
1559 return PTR_ERR(out_skb);
1574 static struct sk_buff *compose_sadb_supported(
const struct sadb_msg *orig,
1583 auth_len *=
sizeof(
struct sadb_alg);
1589 enc_len *=
sizeof(
struct sadb_alg);
1593 len = enc_len + auth_len +
sizeof(
struct sadb_msg);
1595 skb = alloc_skb(len + 16, allocation);
1600 pfkey_hdr_dup(hdr, orig);
1614 for (i = 0; ; i++) {
1633 for (i = 0; ; i++) {
1646 static int pfkey_register(
struct sock *sk,
struct sk_buff *skb,
const struct sadb_msg *hdr,
void *
const *ext_hdrs)
1662 supp_skb = compose_sadb_supported(hdr,
GFP_KERNEL);
1675 static int unicast_flush_resp(
struct sock *sk,
const struct sadb_msg *ihdr)
1692 static int key_notify_sa_flush(
const struct km_event *c)
1714 static int pfkey_flush(
struct sock *sk,
struct sk_buff *skb,
const struct sadb_msg *hdr,
void *
const *ext_hdrs)
1716 struct net *net = sock_net(sk);
1726 audit_info.loginuid = audit_get_loginuid(
current);
1727 audit_info.sessionid = audit_get_sessionid(
current);
1728 audit_info.secid = 0;
1730 err2 = unicast_flush_resp(sk, hdr);
1734 return err ? err : err2;
1753 if (!pfkey_can_dump(&pfk->
sk))
1756 out_skb = pfkey_xfrm_state2msg(x);
1757 if (IS_ERR(out_skb))
1758 return PTR_ERR(out_skb);
1771 &pfk->
sk, sock_net(&pfk->
sk));
1772 pfk->
dump.skb = out_skb;
1777 static int pfkey_dump_sa(
struct pfkey_sock *pfk)
1779 struct net *net = sock_net(&pfk->
sk);
1783 static void pfkey_dump_sa_done(
struct pfkey_sock *pfk)
1788 static int pfkey_dump(
struct sock *sk,
struct sk_buff *skb,
const struct sadb_msg *hdr,
void *
const *ext_hdrs)
1802 pfk->
dump.dump = pfkey_dump_sa;
1803 pfk->
dump.done = pfkey_dump_sa_done;
1806 return pfkey_do_dump(pfk);
1809 static int pfkey_promisc(
struct sock *sk,
struct sk_buff *skb,
const struct sadb_msg *hdr,
void *
const *ext_hdrs)
1813 bool reset_errno =
false;
1817 if (satype != 0 && satype != 1)
1821 if (reset_errno && skb_cloned(skb))
1826 if (reset_errno && skb) {
1835 static int check_reqid(
struct xfrm_policy *
xp,
int dir,
int count,
void *ptr)
1840 for (i=0; i<xp->
xfrm_nr; i++) {
1841 if (xp->
xfrm_vec[i].reqid == reqid)
1847 static u32 gen_reqid(
struct net *net)
1864 }
while (reqid != start);
1871 struct net *net = xp_net(xp);
1891 if (!t->
reqid && !(t->
reqid = gen_reqid(net)))
1897 u8 *sa = (
u8 *) (rq + 1);
1900 family = pfkey_sockaddr_extract((
struct sockaddr *)sa,
1905 socklen = pfkey_sockaddr_len(family);
1906 if (pfkey_sockaddr_extract((
struct sockaddr *)(sa + socklen),
1907 &t->
id.daddr) != family)
1930 if ((err = parse_ipsecrequest(xp, rq)) < 0)
1938 static inline int pfkey_xfrm_policy2sec_ctx_size(
const struct xfrm_policy *xp)
1950 static int pfkey_xfrm_policy2msg_size(
const struct xfrm_policy *xp)
1953 int sockaddr_size = pfkey_sockaddr_size(xp->
family);
1957 for (i=0; i<xp->
xfrm_nr; i++) {
1965 (sockaddr_size * 2) +
1969 pfkey_xfrm_policy2sec_ctx_size(xp);
1977 size = pfkey_xfrm_policy2msg_size(xp);
1986 static int pfkey_xfrm_policy2msg(
struct sk_buff *skb,
const struct xfrm_policy *xp,
int dir)
1996 int sockaddr_size = pfkey_sockaddr_size(xp->
family);
1997 int socklen = pfkey_sockaddr_len(xp->
family);
1999 size = pfkey_xfrm_policy2msg_size(xp);
2015 if (!pfkey_sockaddr_fill(&xp->
selector.saddr,
2081 for (i=0; i<xp->
xfrm_nr; i++) {
2090 req_size += socklen * 2;
2094 rq = (
void*)
skb_put(skb, req_size);
2096 memset(rq, 0,
sizeof(*rq));
2099 if ((mode = pfkey_mode_from_xfrm(t->
mode)) < 0)
2110 u8 *sa = (
void *)(rq + 1);
2111 pfkey_sockaddr_fill(&t->
saddr, 0,
2114 pfkey_sockaddr_fill(&t->
id.daddr, 0,
2115 (
struct sockaddr *) (sa + socklen),
2122 int ctx_size = pfkey_xfrm_policy2sec_ctx_size(xp);
2146 out_skb = pfkey_xfrm_policy2msg_prep(xp);
2147 if (IS_ERR(out_skb))
2148 return PTR_ERR(out_skb);
2150 err = pfkey_xfrm_policy2msg(out_skb, xp, dir);
2169 static int pfkey_spdadd(
struct sock *sk,
struct sk_buff *skb,
const struct sadb_msg *hdr,
void *
const *ext_hdrs)
2171 struct net *net = sock_net(sk);
2213 pfkey_sadb_addr2xfrm_addr(sa, &xp->
selector.daddr);
2226 if (sec_ctx !=
NULL) {
2234 err = security_xfrm_policy_alloc(&xp->
security, uctx);
2259 (err = parse_ipsecrequests(xp, pol)) < 0)
2265 xfrm_audit_policy_add(xp, err ? 0 : 1,
2267 audit_get_sessionid(
current), 0);
2290 static int pfkey_spddelete(
struct sock *sk,
struct sk_buff *skb,
const struct sadb_msg *hdr,
void *
const *ext_hdrs)
2292 struct net *net = sock_net(sk);
2314 sel.family = pfkey_sadb_addr2xfrm_addr(sa, &
sel.saddr);
2322 pfkey_sadb_addr2xfrm_addr(sa, &
sel.daddr);
2330 if (sec_ctx !=
NULL) {
2336 err = security_xfrm_policy_alloc(&pol_ctx, uctx);
2345 security_xfrm_policy_free(pol_ctx);
2349 xfrm_audit_policy_delete(xp, err ? 0 : 1,
2351 audit_get_sessionid(
current), 0);
2367 static int key_pol_get_resp(
struct sock *sk,
struct xfrm_policy *xp,
const struct sadb_msg *hdr,
int dir)
2374 out_skb = pfkey_xfrm_policy2msg_prep(xp);
2375 if (IS_ERR(out_skb)) {
2376 err = PTR_ERR(out_skb);
2379 err = pfkey_xfrm_policy2msg(out_skb, xp, dir);
2397 #ifdef CONFIG_NET_KEY_MIGRATE
2398 static int pfkey_sockaddr_pair_size(
sa_family_t family)
2403 static int parse_sockaddr_pair(
struct sockaddr *sa,
int ext_len,
2409 if (ext_len < pfkey_sockaddr_pair_size(sa->
sa_family))
2412 af = pfkey_sockaddr_extract(sa, saddr);
2416 socklen = pfkey_sockaddr_len(af);
2417 if (pfkey_sockaddr_extract((
struct sockaddr *) (((
u8 *)sa) + socklen),
2437 err = parse_sockaddr_pair((
struct sockaddr *)(rq1 + 1),
2452 err = parse_sockaddr_pair((
struct sockaddr *)(rq2 + 1),
2474 static int pfkey_migrate(
struct sock *sk,
struct sk_buff *skb,
2475 const struct sadb_msg *hdr,
void *
const *ext_hdrs)
2505 ret = parse_sockaddr_pair((
struct sockaddr *)(kma + 1),
2507 &
k.local, &
k.remote, &
k.family);
2519 sel.family = pfkey_sadb_addr2xfrm_addr(sa, &
sel.saddr);
2528 pfkey_sadb_addr2xfrm_addr(sa, &
sel.daddr);
2542 ret = ipsecrequests_to_migrate(rq, len, &m[i]);
2553 if (!i || len > 0) {
2565 static int pfkey_migrate(
struct sock *sk,
struct sk_buff *skb,
2566 const struct sadb_msg *hdr,
void *
const *ext_hdrs)
2573 static int pfkey_spdget(
struct sock *sk,
struct sk_buff *skb,
const struct sadb_msg *hdr,
void *
const *ext_hdrs)
2575 struct net *net = sock_net(sk);
2577 int err = 0,
delete;
2596 xfrm_audit_policy_delete(xp, err ? 0 : 1,
2598 audit_get_sessionid(
current), 0);
2608 err = key_pol_get_resp(sk, xp, hdr, dir);
2616 static int dump_sp(
struct xfrm_policy *xp,
int dir,
int count,
void *ptr)
2623 if (!pfkey_can_dump(&pfk->
sk))
2626 out_skb = pfkey_xfrm_policy2msg_prep(xp);
2627 if (IS_ERR(out_skb))
2628 return PTR_ERR(out_skb);
2630 err = pfkey_xfrm_policy2msg(out_skb, xp, dir);
2644 &pfk->
sk, sock_net(&pfk->
sk));
2645 pfk->
dump.skb = out_skb;
2650 static int pfkey_dump_sp(
struct pfkey_sock *pfk)
2652 struct net *net = sock_net(&pfk->
sk);
2656 static void pfkey_dump_sp_done(
struct pfkey_sock *pfk)
2661 static int pfkey_spddump(
struct sock *sk,
struct sk_buff *skb,
const struct sadb_msg *hdr,
void *
const *ext_hdrs)
2670 pfk->
dump.dump = pfkey_dump_sp;
2671 pfk->
dump.done = pfkey_dump_sp_done;
2674 return pfkey_do_dump(pfk);
2677 static int key_notify_policy_flush(
const struct km_event *c)
2697 static int pfkey_spdflush(
struct sock *sk,
struct sk_buff *skb,
const struct sadb_msg *hdr,
void *
const *ext_hdrs)
2699 struct net *net = sock_net(sk);
2704 audit_info.loginuid = audit_get_loginuid(
current);
2705 audit_info.sessionid = audit_get_sessionid(
current);
2706 audit_info.secid = 0;
2708 err2 = unicast_flush_resp(sk, hdr);
2726 const struct sadb_msg *
hdr,
void *
const *ext_hdrs);
2753 static int pfkey_process(
struct sock *sk,
struct sk_buff *skb,
const struct sadb_msg *hdr)
2761 memset(ext_hdrs, 0,
sizeof(ext_hdrs));
2762 err = parse_exthdrs(skb, hdr, ext_hdrs);
2771 static struct sadb_msg *pfkey_get_base_msg(
struct sk_buff *skb,
int *errp)
2775 if (skb->
len <
sizeof(*hdr)) {
2798 static inline int aalg_tmpl_set(
const struct xfrm_tmpl *t,
2801 unsigned int id = d->
desc.sadb_alg_id;
2803 if (
id >=
sizeof(t->
aalgos) * 8)
2806 return (t->
aalgos >>
id) & 1;
2809 static inline int ealg_tmpl_set(
const struct xfrm_tmpl *t,
2812 unsigned int id = d->
desc.sadb_alg_id;
2814 if (
id >=
sizeof(t->
ealgos) * 8)
2817 return (t->
ealgos >>
id) & 1;
2820 static int count_ah_combs(
const struct xfrm_tmpl *t)
2824 for (i = 0; ; i++) {
2828 if (aalg_tmpl_set(t, aalg) && aalg->
available)
2834 static int count_esp_combs(
const struct xfrm_tmpl *t)
2838 for (i = 0; ; i++) {
2843 if (!(ealg_tmpl_set(t, ealg) && ealg->
available))
2846 for (k = 1; ; k++) {
2851 if (aalg_tmpl_set(t, aalg) && aalg->
available)
2869 for (i = 0; ; i++) {
2874 if (aalg_tmpl_set(t, aalg) && aalg->
available) {
2877 memset(c, 0,
sizeof(*c));
2906 if (!(ealg_tmpl_set(t, ealg) && ealg->
available))
2909 for (k = 1; ; k++) {
2914 if (!(aalg_tmpl_set(t, aalg) && aalg->
available))
2917 memset(c, 0,
sizeof(*c));
2951 out_skb = pfkey_xfrm_state2msg_expire(x, hsc);
2952 if (IS_ERR(out_skb))
2953 return PTR_ERR(out_skb);
2970 struct net *net = x ? xs_net(x) : c->net;
2978 return key_notify_sa_expire(x, c);
2982 return key_notify_sa(x, c);
2984 return key_notify_sa_flush(c);
2995 static int pfkey_send_policy_notify(
struct xfrm_policy *xp,
int dir,
const struct km_event *c)
3002 return key_notify_policy_expire(xp, c);
3006 return key_notify_policy(xp, dir, c);
3010 return key_notify_policy_flush(c);
3012 pr_err(
"pfkey: Unknown policy event %d\n", c->
event);
3019 static u32 get_acqseq(
void)
3042 sockaddr_size = pfkey_sockaddr_size(x->
props.family);
3048 (sockaddr_size * 2) +
3052 size += count_ah_combs(t);
3054 size += count_esp_combs(t);
3085 pfkey_sockaddr_fill(&x->
props.saddr, 0,
3101 pfkey_sockaddr_fill(&x->
id.daddr, 0,
3116 dump_ah_combs(skb, t);
3118 dump_esp_combs(skb, t);
3137 static struct xfrm_policy *pfkey_compile_policy(
struct sock *sk,
int opt,
3138 u8 *
data,
int len,
int *dir)
3140 struct net *net = sock_net(sk);
3145 switch (sk->sk_family) {
3152 #if IS_ENABLED(CONFIG_IPV6)
3186 xp->
family = sk->sk_family;
3190 (*dir = parse_ipsecrequests(xp, pol)) < 0)
3196 char *p = (
char *)pol;
3206 if ((*dir = verify_sec_ctx_len(p)))
3208 uctx = pfkey_sadb2xfrm_user_sec_ctx(sec_ctx);
3209 *dir = security_xfrm_policy_alloc(&xp->
security, uctx);
3237 sockaddr_size = pfkey_sockaddr_size(x->
props.family);
3258 (sockaddr_size * 2) +
3296 pfkey_sockaddr_fill(&x->
props.saddr, 0,
3319 pfkey_sockaddr_fill(ipaddr, 0,
3335 #ifdef CONFIG_NET_KEY_MIGRATE
3336 static int set_sadb_address(
struct sk_buff *skb,
int sasize,
int type,
3349 pfkey_sockaddr_fill(&sel->
saddr, 0,
3355 pfkey_sockaddr_fill(&sel->
daddr, 0,
3372 int socklen = pfkey_sockaddr_len(family);
3376 pfkey_sockaddr_pair_size(family));
3379 memset(kma, 0, size_req);
3384 sa = (
u8 *)(kma + 1);
3385 if (!pfkey_sockaddr_fill(&k->
local, 0, (
struct sockaddr *)sa, family) ||
3386 !pfkey_sockaddr_fill(&k->
remote, 0, (
struct sockaddr *)(sa+socklen), family))
3392 static int set_ipsecrequest(
struct sk_buff *skb,
3399 int socklen = pfkey_sockaddr_len(family);
3403 pfkey_sockaddr_pair_size(family);
3407 rq->sadb_x_ipsecrequest_len = size_req;
3408 rq->sadb_x_ipsecrequest_proto =
proto;
3409 rq->sadb_x_ipsecrequest_mode =
mode;
3410 rq->sadb_x_ipsecrequest_level =
level;
3411 rq->sadb_x_ipsecrequest_reqid = reqid;
3413 sa = (
u8 *) (rq + 1);
3414 if (!pfkey_sockaddr_fill(src, 0, (
struct sockaddr *)sa, family) ||
3415 !pfkey_sockaddr_fill(dst, 0, (
struct sockaddr *)(sa + socklen), family))
3422 #ifdef CONFIG_NET_KEY_MIGRATE
3445 pfkey_sockaddr_pair_size(k->
family));
3449 sasize_sel = pfkey_sockaddr_size(sel->
family);
3452 size += (
sizeof(
struct sadb_address) + sasize_sel) * 2;
3458 for (i = 0, mp = m; i < num_bundles; i++, mp++) {
3461 pfkey_sockaddr_pair_size(mp->old_family);
3464 pfkey_sockaddr_pair_size(mp->new_family);
3467 size +=
sizeof(
struct sadb_msg) + size_pol;
3485 if (k !=
NULL && (set_sadb_kmaddress(skb, k) < 0))
3503 for (i = 0, mp = m; i < num_bundles; i++, mp++) {
3505 int mode = pfkey_mode_from_xfrm(mp->
mode);
3508 if (set_ipsecrequest(skb, mp->
proto, mode,
3515 if (set_ipsecrequest(skb, mp->
proto, mode,
3540 static int pfkey_sendmsg(
struct kiocb *
kiocb,
3543 struct sock *sk = sock->
sk;
3553 if ((
unsigned int)len > sk->
sk_sndbuf - 32)
3565 hdr = pfkey_get_base_msg(skb, &err);
3570 err = pfkey_process(sk, skb, hdr);
3574 if (err && hdr && pfkey_error(hdr, err, sk) == 0)
3581 static int pfkey_recvmsg(
struct kiocb *kiocb,
3585 struct sock *sk = sock->
sk;
3605 skb_reset_transport_header(skb);
3610 sock_recv_ts_and_drops(msg, sk, skb);
3624 static const struct proto_ops pfkey_ops = {
3642 .release = pfkey_release,
3644 .sendmsg = pfkey_sendmsg,
3645 .recvmsg = pfkey_recvmsg,
3650 .create = pfkey_create,
3654 #ifdef CONFIG_PROC_FS
3655 static int pfkey_seq_show(
struct seq_file *
f,
void *
v)
3657 struct sock *
s = sk_entry(v);
3660 seq_printf(f ,
"sk RefCnt Rmem Wmem User Inode\n");
3662 seq_printf(f,
"%pK %-6d %-6u %-6u %-6u %-6lu\n",
3665 sk_rmem_alloc_get(s),
3666 sk_wmem_alloc_get(s),
3673 static void *pfkey_seq_start(
struct seq_file *f, loff_t *ppos)
3676 struct net *net = seq_file_net(f);
3683 static void *pfkey_seq_next(
struct seq_file *f,
void *v, loff_t *ppos)
3685 struct net *net = seq_file_net(f);
3691 static void pfkey_seq_stop(
struct seq_file *f,
void *v)
3698 .
start = pfkey_seq_start,
3699 .next = pfkey_seq_next,
3700 .stop = pfkey_seq_stop,
3701 .show = pfkey_seq_show,
3711 .
open = pfkey_seq_open,
3717 static int __net_init pfkey_init_proc(
struct net *net)
3728 static void __net_exit pfkey_exit_proc(
struct net *net)
3733 static inline int pfkey_init_proc(
struct net *net)
3738 static inline void pfkey_exit_proc(
struct net *net)
3743 static struct xfrm_mgr pfkeyv2_mgr =
3746 .notify = pfkey_send_notify,
3747 .acquire = pfkey_send_acquire,
3748 .compile_policy = pfkey_compile_policy,
3749 .new_mapping = pfkey_send_new_mapping,
3750 .notify_policy = pfkey_send_policy_notify,
3751 .migrate = pfkey_send_migrate,
3754 static int __net_init pfkey_net_init(
struct net *net)
3762 rv = pfkey_init_proc(net);
3767 static void __net_exit pfkey_net_exit(
struct net *net)
3771 pfkey_exit_proc(net);
3776 .init = pfkey_net_init,
3777 .exit = pfkey_net_exit,
3778 .id = &pfkey_net_id,
3782 static void __exit ipsec_pfkey_exit(
void)
3790 static int __init ipsec_pfkey_init(
void)
3799 goto out_unregister_key_proto;
3802 goto out_unregister_pernet;
3805 goto out_sock_unregister;
3809 out_sock_unregister:
3811 out_unregister_pernet:
3813 out_unregister_key_proto: