Lines Matching full:xp

1970 static void copy_templates(struct xfrm_policy *xp, struct xfrm_user_tmpl *ut,  in copy_templates()  argument
1975 xp->xfrm_nr = nr; in copy_templates()
1977 struct xfrm_tmpl *t = &xp->xfrm_vec[i]; in copy_templates()
2106 static void copy_from_user_policy(struct xfrm_policy *xp, struct xfrm_userpolicy_info *p) in copy_from_user_policy() argument
2108 xp->priority = p->priority; in copy_from_user_policy()
2109 xp->index = p->index; in copy_from_user_policy()
2110 memcpy(&xp->selector, &p->sel, sizeof(xp->selector)); in copy_from_user_policy()
2111 memcpy(&xp->lft, &p->lft, sizeof(xp->lft)); in copy_from_user_policy()
2112 xp->action = p->action; in copy_from_user_policy()
2113 xp->flags = p->flags; in copy_from_user_policy()
2114 xp->family = p->sel.family; in copy_from_user_policy()
2115 /* XXX xp->share = p->share; */ in copy_from_user_policy()
2118 static void copy_to_user_policy(struct xfrm_policy *xp, struct xfrm_userpolicy_info *p, int dir) in copy_to_user_policy() argument
2121 memcpy(&p->sel, &xp->selector, sizeof(p->sel)); in copy_to_user_policy()
2122 memcpy(&p->lft, &xp->lft, sizeof(p->lft)); in copy_to_user_policy()
2123 memcpy(&p->curlft, &xp->curlft, sizeof(p->curlft)); in copy_to_user_policy()
2124 p->priority = xp->priority; in copy_to_user_policy()
2125 p->index = xp->index; in copy_to_user_policy()
2126 p->sel.family = xp->family; in copy_to_user_policy()
2128 p->action = xp->action; in copy_to_user_policy()
2129 p->flags = xp->flags; in copy_to_user_policy()
2130 p->share = XFRM_SHARE_ANY; /* XXX xp->share */ in copy_to_user_policy()
2139 struct xfrm_policy *xp = xfrm_policy_alloc(net, GFP_KERNEL); in xfrm_policy_construct() local
2142 if (!xp) { in xfrm_policy_construct()
2147 copy_from_user_policy(xp, p); in xfrm_policy_construct()
2149 err = copy_from_user_policy_type(&xp->type, attrs, extack); in xfrm_policy_construct()
2153 if (!(err = copy_from_user_tmpl(xp, attrs, p->dir, extack))) in xfrm_policy_construct()
2154 err = copy_from_user_sec_ctx(xp, attrs); in xfrm_policy_construct()
2158 xfrm_mark_get(attrs, &xp->mark); in xfrm_policy_construct()
2161 xp->if_id = nla_get_u32(attrs[XFRMA_IF_ID]); in xfrm_policy_construct()
2165 err = xfrm_dev_policy_add(net, xp, in xfrm_policy_construct()
2172 return xp; in xfrm_policy_construct()
2175 xp->walk.dead = 1; in xfrm_policy_construct()
2176 xfrm_policy_destroy(xp); in xfrm_policy_construct()
2186 struct xfrm_policy *xp; in xfrm_add_policy() local
2198 xp = xfrm_policy_construct(net, p, attrs, &err, extack); in xfrm_add_policy()
2199 if (!xp) in xfrm_add_policy()
2207 err = xfrm_policy_insert(p->dir, xp, excl); in xfrm_add_policy()
2208 xfrm_audit_policy_add(xp, err ? 0 : 1, true); in xfrm_add_policy()
2211 xfrm_dev_policy_delete(xp); in xfrm_add_policy()
2212 xfrm_dev_policy_free(xp); in xfrm_add_policy()
2213 security_xfrm_policy_free(xp->security); in xfrm_add_policy()
2214 kfree(xp); in xfrm_add_policy()
2221 km_policy_notify(xp, p->dir, &c); in xfrm_add_policy()
2223 xfrm_pol_put(xp); in xfrm_add_policy()
2228 static int copy_to_user_tmpl(struct xfrm_policy *xp, struct sk_buff *skb) in copy_to_user_tmpl() argument
2233 if (xp->xfrm_nr == 0) in copy_to_user_tmpl()
2236 if (xp->xfrm_nr > XFRM_MAX_DEPTH) in copy_to_user_tmpl()
2239 for (i = 0; i < xp->xfrm_nr; i++) { in copy_to_user_tmpl()
2241 struct xfrm_tmpl *kp = &xp->xfrm_vec[i]; in copy_to_user_tmpl()
2257 sizeof(struct xfrm_user_tmpl) * xp->xfrm_nr, vec); in copy_to_user_tmpl()
2268 static inline int copy_to_user_sec_ctx(struct xfrm_policy *xp, struct sk_buff *skb) in copy_to_user_sec_ctx() argument
2270 if (xp->security) in copy_to_user_sec_ctx()
2271 return copy_sec_ctx(xp->security, skb); in copy_to_user_sec_ctx()
2302 static int dump_one_policy(struct xfrm_policy *xp, int dir, int count, void *ptr) in dump_one_policy() argument
2318 copy_to_user_policy(xp, p, dir); in dump_one_policy()
2319 err = copy_to_user_tmpl(xp, skb); in dump_one_policy()
2321 err = copy_to_user_sec_ctx(xp, skb); in dump_one_policy()
2323 err = copy_to_user_policy_type(xp->type, skb); in dump_one_policy()
2325 err = xfrm_mark_put(skb, &xp->mark); in dump_one_policy()
2327 err = xfrm_if_id_put(skb, xp->if_id); in dump_one_policy()
2328 if (!err && xp->xdo.dev) in dump_one_policy()
2329 err = copy_user_offload(&xp->xdo, skb); in dump_one_policy()
2386 struct xfrm_policy *xp, in xfrm_policy_netlink() argument
2402 err = dump_one_policy(xp, dir, 0, &info); in xfrm_policy_netlink()
2505 struct xfrm_policy *xp; in xfrm_get_policy() local
2531 xp = xfrm_policy_byid(net, &m, if_id, type, p->dir, in xfrm_get_policy()
2549 xp = xfrm_policy_bysel_ctx(net, &m, if_id, type, p->dir, in xfrm_get_policy()
2553 if (xp == NULL) in xfrm_get_policy()
2559 resp_skb = xfrm_policy_netlink(skb, xp, p->dir, nlh->nlmsg_seq); in xfrm_get_policy()
2567 xfrm_audit_policy_delete(xp, err ? 0 : 1, true); in xfrm_get_policy()
2576 km_policy_notify(xp, p->dir, &c); in xfrm_get_policy()
2580 xfrm_pol_put(xp); in xfrm_get_policy()
2833 struct xfrm_policy *xp; in xfrm_add_pol_expire() local
2855 xp = xfrm_policy_byid(net, &m, if_id, type, p->dir, p->index, in xfrm_add_pol_expire()
2873 xp = xfrm_policy_bysel_ctx(net, &m, if_id, type, p->dir, in xfrm_add_pol_expire()
2877 if (xp == NULL) in xfrm_add_pol_expire()
2880 if (unlikely(xp->walk.dead)) in xfrm_add_pol_expire()
2885 xfrm_policy_delete(xp, p->dir); in xfrm_add_pol_expire()
2886 xfrm_audit_policy_delete(xp, 1, true); in xfrm_add_pol_expire()
2888 km_policy_expired(xp, p->dir, up->hard, nlh->nlmsg_pid); in xfrm_add_pol_expire()
2891 xfrm_pol_put(xp); in xfrm_add_pol_expire()
2938 struct xfrm_policy *xp; in xfrm_add_acquire() local
2967 /* build an XP */ in xfrm_add_acquire()
2968 xp = xfrm_policy_construct(net, &ua->policy, attrs, &err, extack); in xfrm_add_acquire()
2969 if (!xp) in xfrm_add_acquire()
2975 xp->mark.m = x->mark.m = mark.m; in xfrm_add_acquire()
2976 xp->mark.v = x->mark.v = mark.v; in xfrm_add_acquire()
2979 for (i = 0; i < xp->xfrm_nr; i++, ut++) { in xfrm_add_acquire()
2980 struct xfrm_tmpl *t = &xp->xfrm_vec[i]; in xfrm_add_acquire()
2988 err = km_query(x, t, xp); in xfrm_add_acquire()
2993 kfree(xp); in xfrm_add_acquire()
3721 struct xfrm_policy *xp) in xfrm_acquire_msgsize() argument
3724 + nla_total_size(sizeof(struct xfrm_user_tmpl) * xp->xfrm_nr) in xfrm_acquire_msgsize()
3732 struct xfrm_tmpl *xt, struct xfrm_policy *xp) in build_acquire() argument
3747 copy_to_user_policy(xp, &ua->policy, XFRM_POLICY_OUT); in build_acquire()
3753 err = copy_to_user_tmpl(xp, skb); in build_acquire()
3757 err = copy_to_user_policy_type(xp->type, skb); in build_acquire()
3759 err = xfrm_mark_put(skb, &xp->mark); in build_acquire()
3761 err = xfrm_if_id_put(skb, xp->if_id); in build_acquire()
3762 if (!err && xp->xdo.dev) in build_acquire()
3763 err = copy_user_offload(&xp->xdo, skb); in build_acquire()
3776 struct xfrm_policy *xp) in xfrm_send_acquire() argument
3782 skb = nlmsg_new(xfrm_acquire_msgsize(x, xp), GFP_ATOMIC); in xfrm_send_acquire()
3786 err = build_acquire(skb, x, xt, xp); in xfrm_send_acquire()
3801 struct xfrm_policy *xp; in xfrm_compile_policy() local
3837 xp = xfrm_policy_alloc(net, GFP_ATOMIC); in xfrm_compile_policy()
3838 if (xp == NULL) { in xfrm_compile_policy()
3843 copy_from_user_policy(xp, p); in xfrm_compile_policy()
3844 xp->type = XFRM_POLICY_TYPE_MAIN; in xfrm_compile_policy()
3845 copy_templates(xp, ut, nr); in xfrm_compile_policy()
3849 return xp; in xfrm_compile_policy()
3852 static inline unsigned int xfrm_polexpire_msgsize(struct xfrm_policy *xp) in xfrm_polexpire_msgsize() argument
3855 + nla_total_size(sizeof(struct xfrm_user_tmpl) * xp->xfrm_nr) in xfrm_polexpire_msgsize()
3856 + nla_total_size(xfrm_user_sec_ctx_size(xp->security)) in xfrm_polexpire_msgsize()
3861 static int build_polexpire(struct sk_buff *skb, struct xfrm_policy *xp, in build_polexpire() argument
3874 copy_to_user_policy(xp, &upe->pol, dir); in build_polexpire()
3875 err = copy_to_user_tmpl(xp, skb); in build_polexpire()
3877 err = copy_to_user_sec_ctx(xp, skb); in build_polexpire()
3879 err = copy_to_user_policy_type(xp->type, skb); in build_polexpire()
3881 err = xfrm_mark_put(skb, &xp->mark); in build_polexpire()
3883 err = xfrm_if_id_put(skb, xp->if_id); in build_polexpire()
3884 if (!err && xp->xdo.dev) in build_polexpire()
3885 err = copy_user_offload(&xp->xdo, skb); in build_polexpire()
3896 static int xfrm_exp_policy_notify(struct xfrm_policy *xp, int dir, const struct km_event *c) in xfrm_exp_policy_notify() argument
3898 struct net *net = xp_net(xp); in xfrm_exp_policy_notify()
3902 skb = nlmsg_new(xfrm_polexpire_msgsize(xp), GFP_ATOMIC); in xfrm_exp_policy_notify()
3906 err = build_polexpire(skb, xp, dir, c); in xfrm_exp_policy_notify()
3912 static int xfrm_notify_policy(struct xfrm_policy *xp, int dir, const struct km_event *c) in xfrm_notify_policy() argument
3914 unsigned int len = nla_total_size(sizeof(struct xfrm_user_tmpl) * xp->xfrm_nr); in xfrm_notify_policy()
3915 struct net *net = xp_net(xp); in xfrm_notify_policy()
3949 id->index = xp->index; in xfrm_notify_policy()
3951 memcpy(&id->sel, &xp->selector, sizeof(id->sel)); in xfrm_notify_policy()
3961 copy_to_user_policy(xp, p, dir); in xfrm_notify_policy()
3962 err = copy_to_user_tmpl(xp, skb); in xfrm_notify_policy()
3964 err = copy_to_user_policy_type(xp->type, skb); in xfrm_notify_policy()
3966 err = xfrm_mark_put(skb, &xp->mark); in xfrm_notify_policy()
3968 err = xfrm_if_id_put(skb, xp->if_id); in xfrm_notify_policy()
3969 if (!err && xp->xdo.dev) in xfrm_notify_policy()
3970 err = copy_user_offload(&xp->xdo, skb); in xfrm_notify_policy()
4011 static int xfrm_send_policy_notify(struct xfrm_policy *xp, int dir, const struct km_event *c) in xfrm_send_policy_notify() argument
4018 return xfrm_notify_policy(xp, dir, c); in xfrm_send_policy_notify()
4022 return xfrm_exp_policy_notify(xp, dir, c); in xfrm_send_policy_notify()