}
static int pfkey_broadcast_one(struct sk_buff *skb, struct sk_buff **skb2,
- int allocation, struct sock *sk)
+ gfp_t allocation, struct sock *sk)
{
int err = -ENOBUFS;
#define BROADCAST_ONE 1
#define BROADCAST_REGISTERED 2
#define BROADCAST_PROMISC_ONLY 4
-static int pfkey_broadcast(struct sk_buff *skb, int allocation,
+static int pfkey_broadcast(struct sk_buff *skb, gfp_t allocation,
int broadcast_flags, struct sock *one_sk)
{
struct sock *sk;
sa->sadb_sa_exttype = SADB_EXT_SA;
sa->sadb_sa_spi = x->id.spi;
sa->sadb_sa_replay = x->props.replay_window;
- sa->sadb_sa_state = SADB_SASTATE_DYING;
- if (x->km.state == XFRM_STATE_VALID && !x->km.dying)
- sa->sadb_sa_state = SADB_SASTATE_MATURE;
- else if (x->km.state == XFRM_STATE_ACQ)
+ switch (x->km.state) {
+ case XFRM_STATE_VALID:
+ sa->sadb_sa_state = x->km.dying ?
+ SADB_SASTATE_DYING : SADB_SASTATE_MATURE;
+ break;
+ case XFRM_STATE_ACQ:
sa->sadb_sa_state = SADB_SASTATE_LARVAL;
- else if (x->km.state == XFRM_STATE_EXPIRED)
+ break;
+ default:
sa->sadb_sa_state = SADB_SASTATE_DEAD;
+ break;
+ }
sa->sadb_sa_auth = 0;
if (x->aalg) {
struct xfrm_algo_desc *a = xfrm_aalg_get_byname(x->aalg->alg_name, 0);
sa->sadb_sa_flags |= SADB_SAFLAGS_NOECN;
if (x->props.flags & XFRM_STATE_DECAP_DSCP)
sa->sadb_sa_flags |= SADB_SAFLAGS_DECAP_DSCP;
+ if (x->props.flags & XFRM_STATE_NOPMTUDISC)
+ sa->sadb_sa_flags |= SADB_SAFLAGS_NOPMTUDISC;
/* hard time */
if (hsc & 2) {
x->props.flags |= XFRM_STATE_NOECN;
if (sa->sadb_sa_flags & SADB_SAFLAGS_DECAP_DSCP)
x->props.flags |= XFRM_STATE_DECAP_DSCP;
+ if (sa->sadb_sa_flags & SADB_SAFLAGS_NOPMTUDISC)
+ x->props.flags |= XFRM_STATE_NOPMTUDISC;
lifetime = (struct sadb_lifetime*) ext_hdrs[SADB_EXT_LIFETIME_HARD-1];
if (lifetime != NULL) {
}
}
- x->type = xfrm_get_type(proto, x->props.family);
- if (x->type == NULL) {
- err = -ENOPROTOOPT;
- goto out;
- }
- if (x->type->init_state(x, NULL)) {
- err = -EINVAL;
+ err = xfrm_init_state(x);
+ if (err)
goto out;
- }
+
x->km.seq = hdr->sadb_msg_seq;
- x->km.state = XFRM_STATE_VALID;
return x;
out:
static inline int event2poltype(int event)
{
switch (event) {
- case XFRM_SAP_DELETED:
+ case XFRM_MSG_DELPOLICY:
return SADB_X_SPDDELETE;
- case XFRM_SAP_ADDED:
+ case XFRM_MSG_NEWPOLICY:
return SADB_X_SPDADD;
- case XFRM_SAP_UPDATED:
+ case XFRM_MSG_UPDPOLICY:
return SADB_X_SPDUPDATE;
- case XFRM_SAP_EXPIRED:
+ case XFRM_MSG_POLEXPIRE:
// return SADB_X_SPDEXPIRE;
default:
printk("pfkey: Unknown policy event %d\n", event);
static inline int event2keytype(int event)
{
switch (event) {
- case XFRM_SAP_DELETED:
+ case XFRM_MSG_DELSA:
return SADB_DELETE;
- case XFRM_SAP_ADDED:
+ case XFRM_MSG_NEWSA:
return SADB_ADD;
- case XFRM_SAP_UPDATED:
+ case XFRM_MSG_UPDSA:
return SADB_UPDATE;
- case XFRM_SAP_EXPIRED:
+ case XFRM_MSG_EXPIRE:
return SADB_EXPIRE;
default:
printk("pfkey: Unknown SA event %d\n", event);
struct sadb_msg *hdr;
int hsc = 3;
- if (c->event == XFRM_SAP_DELETED)
+ if (c->event == XFRM_MSG_DELSA)
hsc = 0;
- if (c->event == XFRM_SAP_EXPIRED) {
- if (c->data)
- hsc = 2;
- else
- hsc = 1;
- }
-
skb = pfkey_xfrm_state2msg(x, 0, hsc);
if (IS_ERR(skb))
if (err < 0) {
x->km.state = XFRM_STATE_DEAD;
xfrm_state_put(x);
- return err;
+ goto out;
}
if (hdr->sadb_msg_type == SADB_ADD)
- c.event = XFRM_SAP_ADDED;
+ c.event = XFRM_MSG_NEWSA;
else
- c.event = XFRM_SAP_UPDATED;
+ c.event = XFRM_MSG_UPDSA;
c.seq = hdr->sadb_msg_seq;
c.pid = hdr->sadb_msg_pid;
km_state_notify(x, &c);
+out:
xfrm_state_put(x);
-
return err;
}
c.seq = hdr->sadb_msg_seq;
c.pid = hdr->sadb_msg_pid;
- c.event = XFRM_SAP_DELETED;
+ c.event = XFRM_MSG_DELSA;
km_state_notify(x, &c);
xfrm_state_put(x);
return 0;
}
-static struct sk_buff *compose_sadb_supported(struct sadb_msg *orig, int allocation)
+static struct sk_buff *compose_sadb_supported(struct sadb_msg *orig,
+ gfp_t allocation)
{
struct sk_buff *skb;
struct sadb_msg *hdr;
if (!skb)
return -ENOBUFS;
hdr = (struct sadb_msg *) skb_put(skb, sizeof(struct sadb_msg));
- hdr->sadb_msg_satype = pfkey_proto2satype(c->data);
+ hdr->sadb_msg_satype = pfkey_proto2satype(c->data.proto);
hdr->sadb_msg_seq = c->seq;
hdr->sadb_msg_pid = c->pid;
hdr->sadb_msg_version = PF_KEY_V2;
return -EINVAL;
xfrm_state_flush(proto);
- c.data = proto;
+ c.data.proto = proto;
c.seq = hdr->sadb_msg_seq;
c.pid = hdr->sadb_msg_pid;
- c.event = XFRM_SAP_FLUSHED;
+ c.event = XFRM_MSG_FLUSHSA;
km_state_notify(NULL, &c);
return 0;
out_hdr = (struct sadb_msg *) out_skb->data;
out_hdr->sadb_msg_version = PF_KEY_V2;
- if (c->data && c->event == XFRM_SAP_DELETED)
+ if (c->data.byid && c->event == XFRM_MSG_DELPOLICY)
out_hdr->sadb_msg_type = SADB_X_SPDDELETE2;
else
out_hdr->sadb_msg_type = event2poltype(c->event);
}
if (hdr->sadb_msg_type == SADB_X_SPDUPDATE)
- c.event = XFRM_SAP_UPDATED;
- else
- c.event = XFRM_SAP_ADDED;
+ c.event = XFRM_MSG_UPDPOLICY;
+ else
+ c.event = XFRM_MSG_NEWPOLICY;
c.seq = hdr->sadb_msg_seq;
c.pid = hdr->sadb_msg_pid;
c.seq = hdr->sadb_msg_seq;
c.pid = hdr->sadb_msg_pid;
- c.event = XFRM_SAP_DELETED;
+ c.event = XFRM_MSG_DELPOLICY;
km_policy_notify(xp, pol->sadb_x_policy_dir-1, &c);
xfrm_pol_put(xp);
static int pfkey_spdget(struct sock *sk, struct sk_buff *skb, struct sadb_msg *hdr, void **ext_hdrs)
{
+ unsigned int dir;
int err;
struct sadb_x_policy *pol;
struct xfrm_policy *xp;
if ((pol = ext_hdrs[SADB_X_EXT_POLICY-1]) == NULL)
return -EINVAL;
- xp = xfrm_policy_byid(0, pol->sadb_x_policy_id,
+ dir = xfrm_policy_id2dir(pol->sadb_x_policy_id);
+ if (dir >= XFRM_POLICY_MAX)
+ return -EINVAL;
+
+ xp = xfrm_policy_byid(dir, pol->sadb_x_policy_id,
hdr->sadb_msg_type == SADB_X_SPDDELETE2);
if (xp == NULL)
return -ENOENT;
c.seq = hdr->sadb_msg_seq;
c.pid = hdr->sadb_msg_pid;
if (hdr->sadb_msg_type == SADB_X_SPDDELETE2) {
- c.data = 1; // to signal pfkey of SADB_X_SPDDELETE2
- c.event = XFRM_SAP_DELETED;
- km_policy_notify(xp, pol->sadb_x_policy_dir-1, &c);
+ c.data.byid = 1;
+ c.event = XFRM_MSG_DELPOLICY;
+ km_policy_notify(xp, dir, &c);
} else {
- err = key_pol_get_resp(sk, xp, hdr, pol->sadb_x_policy_dir-1);
+ err = key_pol_get_resp(sk, xp, hdr, dir);
}
xfrm_pol_put(xp);
struct km_event c;
xfrm_policy_flush();
- c.event = XFRM_SAP_FLUSHED;
+ c.event = XFRM_MSG_FLUSHPOLICY;
c.pid = hdr->sadb_msg_pid;
c.seq = hdr->sadb_msg_seq;
km_policy_notify(NULL, 0, &c);
int hard;
int hsc;
- hard = c->data;
+ hard = c->data.hard;
if (hard)
hsc = 2;
else
static int pfkey_send_notify(struct xfrm_state *x, struct km_event *c)
{
switch (c->event) {
- case XFRM_SAP_EXPIRED:
+ case XFRM_MSG_EXPIRE:
return key_notify_sa_expire(x, c);
- case XFRM_SAP_DELETED:
- case XFRM_SAP_ADDED:
- case XFRM_SAP_UPDATED:
+ case XFRM_MSG_DELSA:
+ case XFRM_MSG_NEWSA:
+ case XFRM_MSG_UPDSA:
return key_notify_sa(x, c);
- case XFRM_SAP_FLUSHED:
+ case XFRM_MSG_FLUSHSA:
return key_notify_sa_flush(c);
default:
printk("pfkey: Unknown SA event %d\n", c->event);
static int pfkey_send_policy_notify(struct xfrm_policy *xp, int dir, struct km_event *c)
{
switch (c->event) {
- case XFRM_SAP_EXPIRED:
+ case XFRM_MSG_POLEXPIRE:
return key_notify_policy_expire(xp, c);
- case XFRM_SAP_DELETED:
- case XFRM_SAP_ADDED:
- case XFRM_SAP_UPDATED:
+ case XFRM_MSG_DELPOLICY:
+ case XFRM_MSG_NEWPOLICY:
+ case XFRM_MSG_UPDPOLICY:
return key_notify_policy(xp, dir, c);
- case XFRM_SAP_FLUSHED:
+ case XFRM_MSG_FLUSHPOLICY:
return key_notify_policy_flush(c);
default:
printk("pfkey: Unknown policy event %d\n", c->event);