diff options
Diffstat (limited to 'net/decnet/dn_route.c')
| -rw-r--r-- | net/decnet/dn_route.c | 28 | 
1 files changed, 16 insertions, 12 deletions
diff --git a/net/decnet/dn_route.c b/net/decnet/dn_route.c index fe32388ea24..daccc4a36d8 100644 --- a/net/decnet/dn_route.c +++ b/net/decnet/dn_route.c @@ -752,7 +752,7 @@ static int dn_to_neigh_output(struct sk_buff *skb)  	return n->output(n, skb);  } -static int dn_output(struct sk_buff *skb) +static int dn_output(struct sock *sk, struct sk_buff *skb)  {  	struct dst_entry *dst = skb_dst(skb);  	struct dn_route *rt = (struct dn_route *)dst; @@ -838,6 +838,18 @@ drop:   * Used to catch bugs. This should never normally get   * called.   */ +static int dn_rt_bug_sk(struct sock *sk, struct sk_buff *skb) +{ +	struct dn_skb_cb *cb = DN_SKB_CB(skb); + +	net_dbg_ratelimited("dn_rt_bug: skb from:%04x to:%04x\n", +			    le16_to_cpu(cb->src), le16_to_cpu(cb->dst)); + +	kfree_skb(skb); + +	return NET_RX_DROP; +} +  static int dn_rt_bug(struct sk_buff *skb)  {  	struct dn_skb_cb *cb = DN_SKB_CB(skb); @@ -1288,8 +1300,6 @@ int dn_route_output_sock(struct dst_entry __rcu **pprt, struct flowidn *fl, stru  	err = __dn_route_output_key(pprt, fl, flags & MSG_TRYHARD);  	if (err == 0 && fl->flowidn_proto) { -		if (!(flags & MSG_DONTWAIT)) -			fl->flowidn_flags |= FLOWI_FLAG_CAN_SLEEP;  		*pprt = xfrm_lookup(&init_net, *pprt,  				    flowidn_to_flowi(fl), sk, 0);  		if (IS_ERR(*pprt)) { @@ -1465,7 +1475,7 @@ make_route:  	rt->n = neigh;  	rt->dst.lastuse = jiffies; -	rt->dst.output = dn_rt_bug; +	rt->dst.output = dn_rt_bug_sk;  	switch (res.type) {  	case RTN_UNICAST:  		rt->dst.input = dn_forward; @@ -1668,12 +1678,8 @@ static int dn_cache_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh)  	if (fld.flowidn_iif) {  		struct net_device *dev; -		if ((dev = dev_get_by_index(&init_net, fld.flowidn_iif)) == NULL) { -			kfree_skb(skb); -			return -ENODEV; -		} -		if (!dev->dn_ptr) { -			dev_put(dev); +		dev = __dev_get_by_index(&init_net, fld.flowidn_iif); +		if (!dev || !dev->dn_ptr) {  			kfree_skb(skb);  			return -ENODEV;  		} @@ -1695,8 +1701,6 @@ static int dn_cache_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh)  		err = dn_route_output_key((struct dst_entry **)&rt, &fld, 0);  	} -	if (skb->dev) -		dev_put(skb->dev);  	skb->dev = NULL;  	if (err)  		goto out_free;  | 
