Lines Matching refs:xp

1756 static void copy_templates(struct xfrm_policy *xp, struct xfrm_user_tmpl *ut,
1761 xp->xfrm_nr = nr;
1763 struct xfrm_tmpl *t = &xp->xfrm_vec[i];
1890 static void copy_from_user_policy(struct xfrm_policy *xp, struct xfrm_userpolicy_info *p)
1892 xp->priority = p->priority;
1893 xp->index = p->index;
1894 memcpy(&xp->selector, &p->sel, sizeof(xp->selector));
1895 memcpy(&xp->lft, &p->lft, sizeof(xp->lft));
1896 xp->action = p->action;
1897 xp->flags = p->flags;
1898 xp->family = p->sel.family;
1899 /* XXX xp->share = p->share; */
1902 static void copy_to_user_policy(struct xfrm_policy *xp, struct xfrm_userpolicy_info *p, int dir)
1905 memcpy(&p->sel, &xp->selector, sizeof(p->sel));
1906 memcpy(&p->lft, &xp->lft, sizeof(p->lft));
1907 memcpy(&p->curlft, &xp->curlft, sizeof(p->curlft));
1908 p->priority = xp->priority;
1909 p->index = xp->index;
1910 p->sel.family = xp->family;
1912 p->action = xp->action;
1913 p->flags = xp->flags;
1914 p->share = XFRM_SHARE_ANY; /* XXX xp->share */
1923 struct xfrm_policy *xp = xfrm_policy_alloc(net, GFP_KERNEL);
1926 if (!xp) {
1931 copy_from_user_policy(xp, p);
1933 err = copy_from_user_policy_type(&xp->type, attrs, extack);
1937 if (!(err = copy_from_user_tmpl(xp, attrs, p->dir, extack)))
1938 err = copy_from_user_sec_ctx(xp, attrs);
1942 xfrm_mark_get(attrs, &xp->mark);
1945 xp->if_id = nla_get_u32(attrs[XFRMA_IF_ID]);
1949 err = xfrm_dev_policy_add(net, xp,
1956 return xp;
1959 xp->walk.dead = 1;
1960 xfrm_policy_destroy(xp);
1970 struct xfrm_policy *xp;
1982 xp = xfrm_policy_construct(net, p, attrs, &err, extack);
1983 if (!xp)
1991 err = xfrm_policy_insert(p->dir, xp, excl);
1992 xfrm_audit_policy_add(xp, err ? 0 : 1, true);
1995 xfrm_dev_policy_delete(xp);
1996 xfrm_dev_policy_free(xp);
1997 security_xfrm_policy_free(xp->security);
1998 kfree(xp);
2005 km_policy_notify(xp, p->dir, &c);
2007 xfrm_pol_put(xp);
2012 static int copy_to_user_tmpl(struct xfrm_policy *xp, struct sk_buff *skb)
2017 if (xp->xfrm_nr == 0)
2020 for (i = 0; i < xp->xfrm_nr; i++) {
2022 struct xfrm_tmpl *kp = &xp->xfrm_vec[i];
2038 sizeof(struct xfrm_user_tmpl) * xp->xfrm_nr, vec);
2049 static inline int copy_to_user_sec_ctx(struct xfrm_policy *xp, struct sk_buff *skb)
2051 if (xp->security)
2052 return copy_sec_ctx(xp->security, skb);
2083 static int dump_one_policy(struct xfrm_policy *xp, int dir, int count, void *ptr)
2099 copy_to_user_policy(xp, p, dir);
2100 err = copy_to_user_tmpl(xp, skb);
2102 err = copy_to_user_sec_ctx(xp, skb);
2104 err = copy_to_user_policy_type(xp->type, skb);
2106 err = xfrm_mark_put(skb, &xp->mark);
2108 err = xfrm_if_id_put(skb, xp->if_id);
2109 if (!err && xp->xdo.dev)
2110 err = copy_user_offload(&xp->xdo, skb);
2167 struct xfrm_policy *xp,
2183 err = dump_one_policy(xp, dir, 0, &info);
2286 struct xfrm_policy *xp;
2312 xp = xfrm_policy_byid(net, &m, if_id, type, p->dir,
2330 xp = xfrm_policy_bysel_ctx(net, &m, if_id, type, p->dir,
2334 if (xp == NULL)
2340 resp_skb = xfrm_policy_netlink(skb, xp, p->dir, nlh->nlmsg_seq);
2348 xfrm_dev_policy_delete(xp);
2349 xfrm_audit_policy_delete(xp, err ? 0 : 1, true);
2358 km_policy_notify(xp, p->dir, &c);
2362 xfrm_pol_put(xp);
2602 struct xfrm_policy *xp;
2624 xp = xfrm_policy_byid(net, &m, if_id, type, p->dir, p->index,
2642 xp = xfrm_policy_bysel_ctx(net, &m, if_id, type, p->dir,
2646 if (xp == NULL)
2649 if (unlikely(xp->walk.dead))
2654 xfrm_policy_delete(xp, p->dir);
2655 xfrm_audit_policy_delete(xp, 1, true);
2657 km_policy_expired(xp, p->dir, up->hard, nlh->nlmsg_pid);
2660 xfrm_pol_put(xp);
2707 struct xfrm_policy *xp;
2730 xp = xfrm_policy_construct(net, &ua->policy, attrs, &err, extack);
2731 if (!xp)
2737 xp->mark.m = x->mark.m = mark.m;
2738 xp->mark.v = x->mark.v = mark.v;
2741 for (i = 0; i < xp->xfrm_nr; i++, ut++) {
2742 struct xfrm_tmpl *t = &xp->xfrm_vec[i];
2750 err = km_query(x, t, xp);
2755 kfree(xp);
3411 struct xfrm_policy *xp)
3414 + nla_total_size(sizeof(struct xfrm_user_tmpl) * xp->xfrm_nr)
3421 struct xfrm_tmpl *xt, struct xfrm_policy *xp)
3436 copy_to_user_policy(xp, &ua->policy, XFRM_POLICY_OUT);
3442 err = copy_to_user_tmpl(xp, skb);
3446 err = copy_to_user_policy_type(xp->type, skb);
3448 err = xfrm_mark_put(skb, &xp->mark);
3450 err = xfrm_if_id_put(skb, xp->if_id);
3451 if (!err && xp->xdo.dev)
3452 err = copy_user_offload(&xp->xdo, skb);
3463 struct xfrm_policy *xp)
3469 skb = nlmsg_new(xfrm_acquire_msgsize(x, xp), GFP_ATOMIC);
3473 err = build_acquire(skb, x, xt, xp);
3488 struct xfrm_policy *xp;
3524 xp = xfrm_policy_alloc(net, GFP_ATOMIC);
3525 if (xp == NULL) {
3530 copy_from_user_policy(xp, p);
3531 xp->type = XFRM_POLICY_TYPE_MAIN;
3532 copy_templates(xp, ut, nr);
3536 return xp;
3539 static inline unsigned int xfrm_polexpire_msgsize(struct xfrm_policy *xp)
3542 + nla_total_size(sizeof(struct xfrm_user_tmpl) * xp->xfrm_nr)
3543 + nla_total_size(xfrm_user_sec_ctx_size(xp->security))
3548 static int build_polexpire(struct sk_buff *skb, struct xfrm_policy *xp,
3561 copy_to_user_policy(xp, &upe->pol, dir);
3562 err = copy_to_user_tmpl(xp, skb);
3564 err = copy_to_user_sec_ctx(xp, skb);
3566 err = copy_to_user_policy_type(xp->type, skb);
3568 err = xfrm_mark_put(skb, &xp->mark);
3570 err = xfrm_if_id_put(skb, xp->if_id);
3571 if (!err && xp->xdo.dev)
3572 err = copy_user_offload(&xp->xdo, skb);
3583 static int xfrm_exp_policy_notify(struct xfrm_policy *xp, int dir, const struct km_event *c)
3585 struct net *net = xp_net(xp);
3589 skb = nlmsg_new(xfrm_polexpire_msgsize(xp), GFP_ATOMIC);
3593 err = build_polexpire(skb, xp, dir, c);
3599 static int xfrm_notify_policy(struct xfrm_policy *xp, int dir, const struct km_event *c)
3601 unsigned int len = nla_total_size(sizeof(struct xfrm_user_tmpl) * xp->xfrm_nr);
3602 struct net *net = xp_net(xp);
3636 id->index = xp->index;
3638 memcpy(&id->sel, &xp->selector, sizeof(id->sel));
3648 copy_to_user_policy(xp, p, dir);
3649 err = copy_to_user_tmpl(xp, skb);
3651 err = copy_to_user_policy_type(xp->type, skb);
3653 err = xfrm_mark_put(skb, &xp->mark);
3655 err = xfrm_if_id_put(skb, xp->if_id);
3656 if (!err && xp->xdo.dev)
3657 err = copy_user_offload(&xp->xdo, skb);
3698 static int xfrm_send_policy_notify(struct xfrm_policy *xp, int dir, const struct km_event *c)
3705 return xfrm_notify_policy(xp, dir, c);
3709 return xfrm_exp_policy_notify(xp, dir, c);