diff options
Diffstat (limited to 'net/ipv4/fib_semantics.c')
| -rw-r--r-- | net/ipv4/fib_semantics.c | 33 | 
1 files changed, 23 insertions, 10 deletions
diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c index f1888c683426..a803cdd9400a 100644 --- a/net/ipv4/fib_semantics.c +++ b/net/ipv4/fib_semantics.c @@ -504,6 +504,7 @@ void rtmsg_fib(int event, __be32 key, struct fib_alias *fa,  	       int dst_len, u32 tb_id, const struct nl_info *info,  	       unsigned int nlm_flags)  { +	struct fib_rt_info fri;  	struct sk_buff *skb;  	u32 seq = info->nlh ? info->nlh->nlmsg_seq : 0;  	int err = -ENOBUFS; @@ -512,9 +513,15 @@ void rtmsg_fib(int event, __be32 key, struct fib_alias *fa,  	if (!skb)  		goto errout; -	err = fib_dump_info(skb, info->portid, seq, event, tb_id, -			    fa->fa_type, key, dst_len, -			    fa->fa_tos, fa->fa_info, nlm_flags); +	fri.fi = fa->fa_info; +	fri.tb_id = tb_id; +	fri.dst = key; +	fri.dst_len = dst_len; +	fri.tos = fa->fa_tos; +	fri.type = fa->fa_type; +	fri.offload = fa->offload; +	fri.trap = fa->trap; +	err = fib_dump_info(skb, info->portid, seq, event, &fri, nlm_flags);  	if (err < 0) {  		/* -EMSGSIZE implies BUG in fib_nlmsg_size() */  		WARN_ON(err == -EMSGSIZE); @@ -1725,10 +1732,11 @@ static int fib_add_multipath(struct sk_buff *skb, struct fib_info *fi)  #endif  int fib_dump_info(struct sk_buff *skb, u32 portid, u32 seq, int event, -		  u32 tb_id, u8 type, __be32 dst, int dst_len, u8 tos, -		  struct fib_info *fi, unsigned int flags) +		  struct fib_rt_info *fri, unsigned int flags)  { -	unsigned int nhs = fib_info_num_path(fi); +	unsigned int nhs = fib_info_num_path(fri->fi); +	struct fib_info *fi = fri->fi; +	u32 tb_id = fri->tb_id;  	struct nlmsghdr *nlh;  	struct rtmsg *rtm; @@ -1738,22 +1746,22 @@ int fib_dump_info(struct sk_buff *skb, u32 portid, u32 seq, int event,  	rtm = nlmsg_data(nlh);  	rtm->rtm_family = AF_INET; -	rtm->rtm_dst_len = dst_len; +	rtm->rtm_dst_len = fri->dst_len;  	rtm->rtm_src_len = 0; -	rtm->rtm_tos = tos; +	rtm->rtm_tos = fri->tos;  	if (tb_id < 256)  		rtm->rtm_table = tb_id;  	else  		rtm->rtm_table = RT_TABLE_COMPAT;  	if (nla_put_u32(skb, RTA_TABLE, tb_id))  		goto nla_put_failure; -	rtm->rtm_type = type; +	rtm->rtm_type = fri->type;  	rtm->rtm_flags = fi->fib_flags;  	rtm->rtm_scope = fi->fib_scope;  	rtm->rtm_protocol = fi->fib_protocol;  	if (rtm->rtm_dst_len && -	    nla_put_in_addr(skb, RTA_DST, dst)) +	    nla_put_in_addr(skb, RTA_DST, fri->dst))  		goto nla_put_failure;  	if (fi->fib_priority &&  	    nla_put_u32(skb, RTA_PRIORITY, fi->fib_priority)) @@ -1795,6 +1803,11 @@ int fib_dump_info(struct sk_buff *skb, u32 portid, u32 seq, int event,  			goto nla_put_failure;  	} +	if (fri->offload) +		rtm->rtm_flags |= RTM_F_OFFLOAD; +	if (fri->trap) +		rtm->rtm_flags |= RTM_F_TRAP; +  	nlmsg_end(skb, nlh);  	return 0;  |