Lines Matching refs:xp

1524 static void copy_templates(struct xfrm_policy *xp, struct xfrm_user_tmpl *ut,
1529 xp->xfrm_nr = nr;
1531 struct xfrm_tmpl *t = &xp->xfrm_vec[i];
1642 static void copy_from_user_policy(struct xfrm_policy *xp, struct xfrm_userpolicy_info *p)
1644 xp->priority = p->priority;
1645 xp->index = p->index;
1646 memcpy(&xp->selector, &p->sel, sizeof(xp->selector));
1647 memcpy(&xp->lft, &p->lft, sizeof(xp->lft));
1648 xp->action = p->action;
1649 xp->flags = p->flags;
1650 xp->family = p->sel.family;
1651 /* XXX xp->share = p->share; */
1654 static void copy_to_user_policy(struct xfrm_policy *xp, struct xfrm_userpolicy_info *p, int dir)
1657 memcpy(&p->sel, &xp->selector, sizeof(p->sel));
1658 memcpy(&p->lft, &xp->lft, sizeof(p->lft));
1659 memcpy(&p->curlft, &xp->curlft, sizeof(p->curlft));
1660 p->priority = xp->priority;
1661 p->index = xp->index;
1662 p->sel.family = xp->family;
1664 p->action = xp->action;
1665 p->flags = xp->flags;
1666 p->share = XFRM_SHARE_ANY; /* XXX xp->share */
1671 struct xfrm_policy *xp = xfrm_policy_alloc(net, GFP_KERNEL);
1674 if (!xp) {
1679 copy_from_user_policy(xp, p);
1681 err = copy_from_user_policy_type(&xp->type, attrs);
1685 if (!(err = copy_from_user_tmpl(xp, attrs)))
1686 err = copy_from_user_sec_ctx(xp, attrs);
1690 xfrm_mark_get(attrs, &xp->mark);
1693 xp->if_id = nla_get_u32(attrs[XFRMA_IF_ID]);
1695 return xp;
1698 xp->walk.dead = 1;
1699 xfrm_policy_destroy(xp);
1708 struct xfrm_policy *xp;
1720 xp = xfrm_policy_construct(net, p, attrs, &err);
1721 if (!xp)
1729 err = xfrm_policy_insert(p->dir, xp, excl);
1730 xfrm_audit_policy_add(xp, err ? 0 : 1, true);
1733 security_xfrm_policy_free(xp->security);
1734 kfree(xp);
1741 km_policy_notify(xp, p->dir, &c);
1743 xfrm_pol_put(xp);
1748 static int copy_to_user_tmpl(struct xfrm_policy *xp, struct sk_buff *skb)
1753 if (xp->xfrm_nr == 0)
1756 for (i = 0; i < xp->xfrm_nr; i++) {
1758 struct xfrm_tmpl *kp = &xp->xfrm_vec[i];
1774 sizeof(struct xfrm_user_tmpl) * xp->xfrm_nr, vec);
1785 static inline int copy_to_user_sec_ctx(struct xfrm_policy *xp, struct sk_buff *skb)
1787 if (xp->security)
1788 return copy_sec_ctx(xp->security, skb);
1819 static int dump_one_policy(struct xfrm_policy *xp, int dir, int count, void *ptr)
1835 copy_to_user_policy(xp, p, dir);
1836 err = copy_to_user_tmpl(xp, skb);
1838 err = copy_to_user_sec_ctx(xp, skb);
1840 err = copy_to_user_policy_type(xp->type, skb);
1842 err = xfrm_mark_put(skb, &xp->mark);
1844 err = xfrm_if_id_put(skb, xp->if_id);
1901 struct xfrm_policy *xp,
1917 err = dump_one_policy(xp, dir, 0, &info);
2019 struct xfrm_policy *xp;
2045 xp = xfrm_policy_byid(net, &m, if_id, type, p->dir,
2063 xp = xfrm_policy_bysel_ctx(net, &m, if_id, type, p->dir,
2067 if (xp == NULL)
2073 resp_skb = xfrm_policy_netlink(skb, xp, p->dir, nlh->nlmsg_seq);
2081 xfrm_audit_policy_delete(xp, err ? 0 : 1, true);
2090 km_policy_notify(xp, p->dir, &c);
2094 xfrm_pol_put(xp);
2325 struct xfrm_policy *xp;
2347 xp = xfrm_policy_byid(net, &m, if_id, type, p->dir, p->index,
2365 xp = xfrm_policy_bysel_ctx(net, &m, if_id, type, p->dir,
2369 if (xp == NULL)
2372 if (unlikely(xp->walk.dead))
2377 xfrm_policy_delete(xp, p->dir);
2378 xfrm_audit_policy_delete(xp, 1, true);
2380 km_policy_expired(xp, p->dir, up->hard, nlh->nlmsg_pid);
2383 xfrm_pol_put(xp);
2425 struct xfrm_policy *xp;
2448 xp = xfrm_policy_construct(net, &ua->policy, attrs, &err);
2449 if (!xp)
2455 xp->mark.m = x->mark.m = mark.m;
2456 xp->mark.v = x->mark.v = mark.v;
2459 for (i = 0; i < xp->xfrm_nr; i++, ut++) {
2460 struct xfrm_tmpl *t = &xp->xfrm_vec[i];
2468 err = km_query(x, t, xp);
2473 kfree(xp);
3122 struct xfrm_policy *xp)
3125 + nla_total_size(sizeof(struct xfrm_user_tmpl) * xp->xfrm_nr)
3132 struct xfrm_tmpl *xt, struct xfrm_policy *xp)
3147 copy_to_user_policy(xp, &ua->policy, XFRM_POLICY_OUT);
3153 err = copy_to_user_tmpl(xp, skb);
3157 err = copy_to_user_policy_type(xp->type, skb);
3159 err = xfrm_mark_put(skb, &xp->mark);
3161 err = xfrm_if_id_put(skb, xp->if_id);
3172 struct xfrm_policy *xp)
3178 skb = nlmsg_new(xfrm_acquire_msgsize(x, xp), GFP_ATOMIC);
3182 err = build_acquire(skb, x, xt, xp);
3197 struct xfrm_policy *xp;
3233 xp = xfrm_policy_alloc(net, GFP_ATOMIC);
3234 if (xp == NULL) {
3239 copy_from_user_policy(xp, p);
3240 xp->type = XFRM_POLICY_TYPE_MAIN;
3241 copy_templates(xp, ut, nr);
3245 return xp;
3248 static inline unsigned int xfrm_polexpire_msgsize(struct xfrm_policy *xp)
3251 + nla_total_size(sizeof(struct xfrm_user_tmpl) * xp->xfrm_nr)
3252 + nla_total_size(xfrm_user_sec_ctx_size(xp->security))
3257 static int build_polexpire(struct sk_buff *skb, struct xfrm_policy *xp,
3270 copy_to_user_policy(xp, &upe->pol, dir);
3271 err = copy_to_user_tmpl(xp, skb);
3273 err = copy_to_user_sec_ctx(xp, skb);
3275 err = copy_to_user_policy_type(xp->type, skb);
3277 err = xfrm_mark_put(skb, &xp->mark);
3279 err = xfrm_if_id_put(skb, xp->if_id);
3290 static int xfrm_exp_policy_notify(struct xfrm_policy *xp, int dir, const struct km_event *c)
3292 struct net *net = xp_net(xp);
3296 skb = nlmsg_new(xfrm_polexpire_msgsize(xp), GFP_ATOMIC);
3300 err = build_polexpire(skb, xp, dir, c);
3306 static int xfrm_notify_policy(struct xfrm_policy *xp, int dir, const struct km_event *c)
3308 unsigned int len = nla_total_size(sizeof(struct xfrm_user_tmpl) * xp->xfrm_nr);
3309 struct net *net = xp_net(xp);
3343 id->index = xp->index;
3345 memcpy(&id->sel, &xp->selector, sizeof(id->sel));
3355 copy_to_user_policy(xp, p, dir);
3356 err = copy_to_user_tmpl(xp, skb);
3358 err = copy_to_user_policy_type(xp->type, skb);
3360 err = xfrm_mark_put(skb, &xp->mark);
3362 err = xfrm_if_id_put(skb, xp->if_id);
3403 static int xfrm_send_policy_notify(struct xfrm_policy *xp, int dir, const struct km_event *c)
3410 return xfrm_notify_policy(xp, dir, c);
3414 return xfrm_exp_policy_notify(xp, dir, c);