Lines Matching defs:xp
2014 static void copy_templates(struct xfrm_policy *xp, struct xfrm_user_tmpl *ut,
2019 xp->xfrm_nr = nr;
2021 struct xfrm_tmpl *t = &xp->xfrm_vec[i];
2150 static void copy_from_user_policy(struct xfrm_policy *xp, struct xfrm_userpolicy_info *p)
2152 xp->priority = p->priority;
2153 xp->index = p->index;
2154 memcpy(&xp->selector, &p->sel, sizeof(xp->selector));
2155 memcpy(&xp->lft, &p->lft, sizeof(xp->lft));
2156 xp->action = p->action;
2157 xp->flags = p->flags;
2158 xp->family = p->sel.family;
2159 /* XXX xp->share = p->share; */
2162 static void copy_to_user_policy(struct xfrm_policy *xp, struct xfrm_userpolicy_info *p, int dir)
2165 memcpy(&p->sel, &xp->selector, sizeof(p->sel));
2166 memcpy(&p->lft, &xp->lft, sizeof(p->lft));
2167 memcpy(&p->curlft, &xp->curlft, sizeof(p->curlft));
2168 p->priority = xp->priority;
2169 p->index = xp->index;
2170 p->sel.family = xp->family;
2172 p->action = xp->action;
2173 p->flags = xp->flags;
2174 p->share = XFRM_SHARE_ANY; /* XXX xp->share */
2183 struct xfrm_policy *xp = xfrm_policy_alloc(net, GFP_KERNEL);
2186 if (!xp) {
2191 copy_from_user_policy(xp, p);
2193 err = copy_from_user_policy_type(&xp->type, attrs, extack);
2197 if (!(err = copy_from_user_tmpl(xp, attrs, p->dir, extack)))
2198 err = copy_from_user_sec_ctx(xp, attrs);
2202 xfrm_mark_get(attrs, &xp->mark);
2205 xp->if_id = nla_get_u32(attrs[XFRMA_IF_ID]);
2209 err = xfrm_dev_policy_add(net, xp,
2216 return xp;
2219 xp->walk.dead = 1;
2220 xfrm_policy_destroy(xp);
2230 struct xfrm_policy *xp;
2242 xp = xfrm_policy_construct(net, p, attrs, &err, extack);
2243 if (!xp)
2251 err = xfrm_policy_insert(p->dir, xp, excl);
2252 xfrm_audit_policy_add(xp, err ? 0 : 1, true);
2255 xfrm_dev_policy_delete(xp);
2256 xfrm_dev_policy_free(xp);
2257 security_xfrm_policy_free(xp->security);
2258 kfree(xp);
2265 km_policy_notify(xp, p->dir, &c);
2267 xfrm_pol_put(xp);
2272 static int copy_to_user_tmpl(struct xfrm_policy *xp, struct sk_buff *skb)
2277 if (xp->xfrm_nr == 0)
2280 if (xp->xfrm_nr > XFRM_MAX_DEPTH)
2283 for (i = 0; i < xp->xfrm_nr; i++) {
2285 struct xfrm_tmpl *kp = &xp->xfrm_vec[i];
2301 sizeof(struct xfrm_user_tmpl) * xp->xfrm_nr, vec);
2312 static inline int copy_to_user_sec_ctx(struct xfrm_policy *xp, struct sk_buff *skb)
2314 if (xp->security)
2315 return copy_sec_ctx(xp->security, skb);
2346 static int dump_one_policy(struct xfrm_policy *xp, int dir, int count, void *ptr)
2362 copy_to_user_policy(xp, p, dir);
2363 err = copy_to_user_tmpl(xp, skb);
2365 err = copy_to_user_sec_ctx(xp, skb);
2367 err = copy_to_user_policy_type(xp->type, skb);
2369 err = xfrm_mark_put(skb, &xp->mark);
2371 err = xfrm_if_id_put(skb, xp->if_id);
2372 if (!err && xp->xdo.dev)
2373 err = copy_user_offload(&xp->xdo, skb);
2430 struct xfrm_policy *xp,
2446 err = dump_one_policy(xp, dir, 0, &info);
2549 struct xfrm_policy *xp;
2575 xp = xfrm_policy_byid(net, &m, if_id, type, p->dir,
2593 xp = xfrm_policy_bysel_ctx(net, &m, if_id, type, p->dir,
2597 if (xp == NULL)
2603 resp_skb = xfrm_policy_netlink(skb, xp, p->dir, nlh->nlmsg_seq);
2611 xfrm_audit_policy_delete(xp, err ? 0 : 1, true);
2620 km_policy_notify(xp, p->dir, &c);
2624 xfrm_pol_put(xp);
2877 struct xfrm_policy *xp;
2899 xp = xfrm_policy_byid(net, &m, if_id, type, p->dir, p->index,
2917 xp = xfrm_policy_bysel_ctx(net, &m, if_id, type, p->dir,
2921 if (xp == NULL)
2924 if (unlikely(xp->walk.dead))
2929 xfrm_policy_delete(xp, p->dir);
2930 xfrm_audit_policy_delete(xp, 1, true);
2932 km_policy_expired(xp, p->dir, up->hard, nlh->nlmsg_pid);
2935 xfrm_pol_put(xp);
2982 struct xfrm_policy *xp;
3012 xp = xfrm_policy_construct(net, &ua->policy, attrs, &err, extack);
3013 if (!xp)
3019 xp->mark.m = x->mark.m = mark.m;
3020 xp->mark.v = x->mark.v = mark.v;
3023 for (i = 0; i < xp->xfrm_nr; i++, ut++) {
3024 struct xfrm_tmpl *t = &xp->xfrm_vec[i];
3032 err = km_query(x, t, xp);
3037 kfree(xp);
3774 struct xfrm_policy *xp)
3777 + nla_total_size(sizeof(struct xfrm_user_tmpl) * xp->xfrm_nr)
3785 struct xfrm_tmpl *xt, struct xfrm_policy *xp)
3800 copy_to_user_policy(xp, &ua->policy, XFRM_POLICY_OUT);
3806 err = copy_to_user_tmpl(xp, skb);
3810 err = copy_to_user_policy_type(xp->type, skb);
3812 err = xfrm_mark_put(skb, &xp->mark);
3814 err = xfrm_if_id_put(skb, xp->if_id);
3815 if (!err && xp->xdo.dev)
3816 err = copy_user_offload(&xp->xdo, skb);
3829 struct xfrm_policy *xp)
3835 skb = nlmsg_new(xfrm_acquire_msgsize(x, xp), GFP_ATOMIC);
3839 err = build_acquire(skb, x, xt, xp);
3854 struct xfrm_policy *xp;
3890 xp = xfrm_policy_alloc(net, GFP_ATOMIC);
3891 if (xp == NULL) {
3896 copy_from_user_policy(xp, p);
3897 xp->type = XFRM_POLICY_TYPE_MAIN;
3898 copy_templates(xp, ut, nr);
3902 return xp;
3905 static inline unsigned int xfrm_polexpire_msgsize(struct xfrm_policy *xp)
3908 + nla_total_size(sizeof(struct xfrm_user_tmpl) * xp->xfrm_nr)
3909 + nla_total_size(xfrm_user_sec_ctx_size(xp->security))
3914 static int build_polexpire(struct sk_buff *skb, struct xfrm_policy *xp,
3927 copy_to_user_policy(xp, &upe->pol, dir);
3928 err = copy_to_user_tmpl(xp, skb);
3930 err = copy_to_user_sec_ctx(xp, skb);
3932 err = copy_to_user_policy_type(xp->type, skb);
3934 err = xfrm_mark_put(skb, &xp->mark);
3936 err = xfrm_if_id_put(skb, xp->if_id);
3937 if (!err && xp->xdo.dev)
3938 err = copy_user_offload(&xp->xdo, skb);
3949 static int xfrm_exp_policy_notify(struct xfrm_policy *xp, int dir, const struct km_event *c)
3951 struct net *net = xp_net(xp);
3955 skb = nlmsg_new(xfrm_polexpire_msgsize(xp), GFP_ATOMIC);
3959 err = build_polexpire(skb, xp, dir, c);
3965 static int xfrm_notify_policy(struct xfrm_policy *xp, int dir, const struct km_event *c)
3967 unsigned int len = nla_total_size(sizeof(struct xfrm_user_tmpl) * xp->xfrm_nr);
3968 struct net *net = xp_net(xp);
4002 id->index = xp->index;
4004 memcpy(&id->sel, &xp->selector, sizeof(id->sel));
4014 copy_to_user_policy(xp, p, dir);
4015 err = copy_to_user_tmpl(xp, skb);
4017 err = copy_to_user_policy_type(xp->type, skb);
4019 err = xfrm_mark_put(skb, &xp->mark);
4021 err = xfrm_if_id_put(skb, xp->if_id);
4022 if (!err && xp->xdo.dev)
4023 err = copy_user_offload(&xp->xdo, skb);
4064 static int xfrm_send_policy_notify(struct xfrm_policy *xp, int dir, const struct km_event *c)
4071 return xfrm_notify_policy(xp, dir, c);
4075 return xfrm_exp_policy_notify(xp, dir, c);