Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4b3550ef authored by Patrick McHardy's avatar Patrick McHardy Committed by David S. Miller
Browse files

[NET_SCHED]: Use nla_nest_start/nla_nest_end



Use nla_nest_start/nla_nest_end for dumping nested attributes.

Signed-off-by: default avatarPatrick McHardy <kaber@trash.net>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent cee63723
Loading
Loading
Loading
Loading
+46 −38
Original line number Diff line number Diff line
@@ -69,7 +69,7 @@ static int tcf_dump_walker(struct sk_buff *skb, struct netlink_callback *cb,
{
	struct tcf_common *p;
	int err = 0, index = -1,i = 0, s_i = 0, n_i = 0;
	struct nlattr *r ;
	struct nlattr *nest;

	read_lock_bh(hinfo->lock);

@@ -84,15 +84,17 @@ static int tcf_dump_walker(struct sk_buff *skb, struct netlink_callback *cb,
				continue;
			a->priv = p;
			a->order = n_i;
			r = (struct nlattr *)skb_tail_pointer(skb);
			NLA_PUT(skb, a->order, 0, NULL);

			nest = nla_nest_start(skb, a->order);
			if (nest == NULL)
				goto nla_put_failure;
			err = tcf_action_dump_1(skb, a, 0, 0);
			if (err < 0) {
				index--;
				nlmsg_trim(skb, r);
				nlmsg_trim(skb, nest);
				goto done;
			}
			r->nla_len = skb_tail_pointer(skb) - (u8 *)r;
			nla_nest_end(skb, nest);
			n_i++;
			if (n_i >= TCA_ACT_MAX_PRIO)
				goto done;
@@ -105,7 +107,7 @@ static int tcf_dump_walker(struct sk_buff *skb, struct netlink_callback *cb,
	return n_i;

nla_put_failure:
	nlmsg_trim(skb, r);
	nla_nest_cancel(skb, nest);
	goto done;
}

@@ -113,11 +115,12 @@ static int tcf_del_walker(struct sk_buff *skb, struct tc_action *a,
			  struct tcf_hashinfo *hinfo)
{
	struct tcf_common *p, *s_p;
	struct nlattr *r ;
	struct nlattr *nest;
	int i= 0, n_i = 0;

	r = (struct nlattr *)skb_tail_pointer(skb);
	NLA_PUT(skb, a->order, 0, NULL);
	nest = nla_nest_start(skb, a->order);
	if (nest == NULL)
		goto nla_put_failure;
	NLA_PUT(skb, TCA_KIND, IFNAMSIZ, a->ops->kind);
	for (i = 0; i < (hinfo->hmask + 1); i++) {
		p = hinfo->htab[tcf_hash(i, hinfo->hmask)];
@@ -131,11 +134,11 @@ static int tcf_del_walker(struct sk_buff *skb, struct tc_action *a,
		}
	}
	NLA_PUT(skb, TCA_FCNT, 4, &n_i);
	r->nla_len = skb_tail_pointer(skb) - (u8 *)r;
	nla_nest_end(skb, nest);

	return n_i;
nla_put_failure:
	nlmsg_trim(skb, r);
	nla_nest_cancel(skb, nest);
	return -EINVAL;
}

@@ -415,7 +418,7 @@ tcf_action_dump_1(struct sk_buff *skb, struct tc_action *a, int bind, int ref)
{
	int err = -EINVAL;
	unsigned char *b = skb_tail_pointer(skb);
	struct nlattr *r;
	struct nlattr *nest;

	if (a->ops == NULL || a->ops->dump == NULL)
		return err;
@@ -423,10 +426,11 @@ tcf_action_dump_1(struct sk_buff *skb, struct tc_action *a, int bind, int ref)
	NLA_PUT(skb, TCA_KIND, IFNAMSIZ, a->ops->kind);
	if (tcf_action_copy_stats(skb, a, 0))
		goto nla_put_failure;
	r = (struct nlattr *)skb_tail_pointer(skb);
	NLA_PUT(skb, TCA_OPTIONS, 0, NULL);
	nest = nla_nest_start(skb, TCA_OPTIONS);
	if (nest == NULL)
		goto nla_put_failure;
	if ((err = tcf_action_dump_old(skb, a, bind, ref)) > 0) {
		r->nla_len = skb_tail_pointer(skb) - (u8 *)r;
		nla_nest_end(skb, nest);
		return err;
	}

@@ -441,17 +445,17 @@ tcf_action_dump(struct sk_buff *skb, struct tc_action *act, int bind, int ref)
{
	struct tc_action *a;
	int err = -EINVAL;
	unsigned char *b = skb_tail_pointer(skb);
	struct nlattr *r ;
	struct nlattr *nest;

	while ((a = act) != NULL) {
		r = (struct nlattr *)skb_tail_pointer(skb);
		act = a->next;
		NLA_PUT(skb, a->order, 0, NULL);
		nest = nla_nest_start(skb, a->order);
		if (nest == NULL)
			goto nla_put_failure;
		err = tcf_action_dump_1(skb, a, bind, ref);
		if (err < 0)
			goto errout;
		r->nla_len = skb_tail_pointer(skb) - (u8 *)r;
		nla_nest_end(skb, nest);
	}

	return 0;
@@ -459,7 +463,7 @@ tcf_action_dump(struct sk_buff *skb, struct tc_action *act, int bind, int ref)
nla_put_failure:
	err = -EINVAL;
errout:
	nlmsg_trim(skb, b);
	nla_nest_cancel(skb, nest);
	return err;
}

@@ -627,7 +631,7 @@ tca_get_fill(struct sk_buff *skb, struct tc_action *a, u32 pid, u32 seq,
	struct tcamsg *t;
	struct nlmsghdr *nlh;
	unsigned char *b = skb_tail_pointer(skb);
	struct nlattr *x;
	struct nlattr *nest;

	nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*t), flags);

@@ -636,13 +640,14 @@ tca_get_fill(struct sk_buff *skb, struct tc_action *a, u32 pid, u32 seq,
	t->tca__pad1 = 0;
	t->tca__pad2 = 0;

	x = (struct nlattr *)skb_tail_pointer(skb);
	NLA_PUT(skb, TCA_ACT_TAB, 0, NULL);
	nest = nla_nest_start(skb, TCA_ACT_TAB);
	if (nest == NULL)
		goto nla_put_failure;

	if (tcf_action_dump(skb, a, bind, ref) < 0)
		goto nla_put_failure;

	x->nla_len = skb_tail_pointer(skb) - (u8 *)x;
	nla_nest_end(skb, nest);

	nlh->nlmsg_len = skb_tail_pointer(skb) - b;
	return skb->len;
@@ -743,7 +748,7 @@ static int tca_action_flush(struct nlattr *nla, struct nlmsghdr *n, u32 pid)
	struct nlmsghdr *nlh;
	struct tcamsg *t;
	struct netlink_callback dcb;
	struct nlattr *x;
	struct nlattr *nest;
	struct nlattr *tb[TCA_ACT_MAX+1];
	struct nlattr *kind;
	struct tc_action *a = create_a(0);
@@ -779,14 +784,15 @@ static int tca_action_flush(struct nlattr *nla, struct nlmsghdr *n, u32 pid)
	t->tca__pad1 = 0;
	t->tca__pad2 = 0;

	x = (struct nlattr *)skb_tail_pointer(skb);
	NLA_PUT(skb, TCA_ACT_TAB, 0, NULL);
	nest = nla_nest_start(skb, TCA_ACT_TAB);
	if (nest == NULL)
		goto nla_put_failure;

	err = a->ops->walk(skb, &dcb, RTM_DELACTION, a);
	if (err < 0)
		goto nla_put_failure;

	x->nla_len = skb_tail_pointer(skb) - (u8 *)x;
	nla_nest_end(skb, nest);

	nlh->nlmsg_len = skb_tail_pointer(skb) - b;
	nlh->nlmsg_flags |= NLM_F_ROOT;
@@ -875,7 +881,7 @@ static int tcf_add_notify(struct tc_action *a, u32 pid, u32 seq, int event,
	struct tcamsg *t;
	struct nlmsghdr *nlh;
	struct sk_buff *skb;
	struct nlattr *x;
	struct nlattr *nest;
	unsigned char *b;
	int err = 0;

@@ -891,13 +897,14 @@ static int tcf_add_notify(struct tc_action *a, u32 pid, u32 seq, int event,
	t->tca__pad1 = 0;
	t->tca__pad2 = 0;

	x = (struct nlattr *)skb_tail_pointer(skb);
	NLA_PUT(skb, TCA_ACT_TAB, 0, NULL);
	nest = nla_nest_start(skb, TCA_ACT_TAB);
	if (nest == NULL)
		goto nla_put_failure;

	if (tcf_action_dump(skb, a, 0, 0) < 0)
		goto nla_put_failure;

	x->nla_len = skb_tail_pointer(skb) - (u8 *)x;
	nla_nest_end(skb, nest);

	nlh->nlmsg_len = skb_tail_pointer(skb) - b;
	NETLINK_CB(skb).dst_group = RTNLGRP_TC;
@@ -1025,7 +1032,7 @@ tc_dump_action(struct sk_buff *skb, struct netlink_callback *cb)
	struct net *net = skb->sk->sk_net;
	struct nlmsghdr *nlh;
	unsigned char *b = skb_tail_pointer(skb);
	struct nlattr *x;
	struct nlattr *nest;
	struct tc_action_ops *a_o;
	struct tc_action a;
	int ret = 0;
@@ -1060,18 +1067,19 @@ tc_dump_action(struct sk_buff *skb, struct netlink_callback *cb)
	t->tca__pad1 = 0;
	t->tca__pad2 = 0;

	x = (struct nlattr *)skb_tail_pointer(skb);
	NLA_PUT(skb, TCA_ACT_TAB, 0, NULL);
	nest = nla_nest_start(skb, TCA_ACT_TAB);
	if (nest == NULL)
		goto nla_put_failure;

	ret = a_o->walk(skb, cb, RTM_GETACTION, &a);
	if (ret < 0)
		goto nla_put_failure;

	if (ret > 0) {
		x->nla_len = skb_tail_pointer(skb) - (u8 *)x;
		nla_nest_end(skb, nest);
		ret = skb->len;
	} else
		nlmsg_trim(skb, x);
		nla_nest_cancel(skb, nest);

	nlh->nlmsg_len = skb_tail_pointer(skb) - b;
	if (NETLINK_CB(cb->skb).pid && ret)
+7 −6
Original line number Diff line number Diff line
@@ -54,7 +54,7 @@ static int tcf_act_police_walker(struct sk_buff *skb, struct netlink_callback *c
{
	struct tcf_common *p;
	int err = 0, index = -1, i = 0, s_i = 0, n_i = 0;
	struct nlattr *r;
	struct nlattr *nest;

	read_lock_bh(&police_lock);

@@ -69,18 +69,19 @@ static int tcf_act_police_walker(struct sk_buff *skb, struct netlink_callback *c
				continue;
			a->priv = p;
			a->order = index;
			r = (struct nlattr *)skb_tail_pointer(skb);
			NLA_PUT(skb, a->order, 0, NULL);
			nest = nla_nest_start(skb, a->order);
			if (nest == NULL)
				goto nla_put_failure;
			if (type == RTM_DELACTION)
				err = tcf_action_dump_1(skb, a, 0, 1);
			else
				err = tcf_action_dump_1(skb, a, 0, 0);
			if (err < 0) {
				index--;
				nlmsg_trim(skb, r);
				nla_nest_cancel(skb, nest);
				goto done;
			}
			r->nla_len = skb_tail_pointer(skb) - (u8 *)r;
			nla_nest_end(skb, nest);
			n_i++;
		}
	}
@@ -91,7 +92,7 @@ static int tcf_act_police_walker(struct sk_buff *skb, struct netlink_callback *c
	return n_i;

nla_put_failure:
	nlmsg_trim(skb, r);
	nla_nest_cancel(skb, nest);
	goto done;
}

+9 −5
Original line number Diff line number Diff line
@@ -544,18 +544,22 @@ int tcf_exts_dump(struct sk_buff *skb, struct tcf_exts *exts,
		 * to work with both old and new modes of entering
		 * tc data even if iproute2  was newer - jhs
		 */
		struct nlattr *p_rta = (struct nlattr *)skb_tail_pointer(skb);
		struct nlattr *nest;

		if (exts->action->type != TCA_OLD_COMPAT) {
			NLA_PUT(skb, map->action, 0, NULL);
			nest = nla_nest_start(skb, map->action);
			if (nest == NULL)
				goto nla_put_failure;
			if (tcf_action_dump(skb, exts->action, 0, 0) < 0)
				goto nla_put_failure;
			p_rta->nla_len = skb_tail_pointer(skb) - (u8 *)p_rta;
			nla_nest_end(skb, nest);
		} else if (map->police) {
			NLA_PUT(skb, map->police, 0, NULL);
			nest = nla_nest_start(skb, map->police);
			if (nest == NULL)
				goto nla_put_failure;
			if (tcf_action_dump_old(skb, exts->action, 0, 0) < 0)
				goto nla_put_failure;
			p_rta->nla_len = skb_tail_pointer(skb) - (u8 *)p_rta;
			nla_nest_end(skb, nest);
		}
	}
#endif
+6 −6
Original line number Diff line number Diff line
@@ -246,16 +246,16 @@ static int basic_dump(struct tcf_proto *tp, unsigned long fh,
		      struct sk_buff *skb, struct tcmsg *t)
{
	struct basic_filter *f = (struct basic_filter *) fh;
	unsigned char *b = skb_tail_pointer(skb);
	struct nlattr *nla;
	struct nlattr *nest;

	if (f == NULL)
		return skb->len;

	t->tcm_handle = f->handle;

	nla = (struct nlattr *) b;
	NLA_PUT(skb, TCA_OPTIONS, 0, NULL);
	nest = nla_nest_start(skb, TCA_OPTIONS);
	if (nest == NULL)
		goto nla_put_failure;

	if (f->res.classid)
		NLA_PUT(skb, TCA_BASIC_CLASSID, sizeof(u32), &f->res.classid);
@@ -264,11 +264,11 @@ static int basic_dump(struct tcf_proto *tp, unsigned long fh,
	    tcf_em_tree_dump(skb, &f->ematches, TCA_BASIC_EMATCHES) < 0)
		goto nla_put_failure;

	nla->nla_len = skb_tail_pointer(skb) - b;
	nla_nest_end(skb, nest);
	return skb->len;

nla_put_failure:
	nlmsg_trim(skb, b);
	nla_nest_cancel(skb, nest);
	return -1;
}

+5 −4
Original line number Diff line number Diff line
@@ -334,7 +334,7 @@ static int fw_dump(struct tcf_proto *tp, unsigned long fh,
	struct fw_head *head = (struct fw_head *)tp->root;
	struct fw_filter *f = (struct fw_filter*)fh;
	unsigned char *b = skb_tail_pointer(skb);
	struct nlattr *nla;
	struct nlattr *nest;

	if (f == NULL)
		return skb->len;
@@ -344,8 +344,9 @@ static int fw_dump(struct tcf_proto *tp, unsigned long fh,
	if (!f->res.classid && !tcf_exts_is_available(&f->exts))
		return skb->len;

	nla = (struct nlattr*)b;
	NLA_PUT(skb, TCA_OPTIONS, 0, NULL);
	nest = nla_nest_start(skb, TCA_OPTIONS);
	if (nest == NULL)
		goto nla_put_failure;

	if (f->res.classid)
		NLA_PUT(skb, TCA_FW_CLASSID, 4, &f->res.classid);
@@ -359,7 +360,7 @@ static int fw_dump(struct tcf_proto *tp, unsigned long fh,
	if (tcf_exts_dump(skb, &f->exts, &fw_ext_map) < 0)
		goto nla_put_failure;

	nla->nla_len = skb_tail_pointer(skb) - b;
	nla_nest_end(skb, nest);

	if (tcf_exts_dump_stats(skb, &f->exts, &fw_ext_map) < 0)
		goto nla_put_failure;
Loading