diff options
Diffstat (limited to 'net/appletalk/ddp.c')
| -rw-r--r-- | net/appletalk/ddp.c | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/net/appletalk/ddp.c b/net/appletalk/ddp.c index 1d31b3a3f1e5..7982656b9c83 100644 --- a/net/appletalk/ddp.c +++ b/net/appletalk/ddp.c | |||
| @@ -100,8 +100,7 @@ static struct sock *atalk_search_socket(struct sockaddr_at *to, | |||
| 100 | continue; | 100 | continue; |
| 101 | 101 | ||
| 102 | if (to->sat_addr.s_net == ATADDR_ANYNET && | 102 | if (to->sat_addr.s_net == ATADDR_ANYNET && |
| 103 | to->sat_addr.s_node == ATADDR_BCAST && | 103 | to->sat_addr.s_node == ATADDR_BCAST) |
| 104 | at->src_net == atif->address.s_net) | ||
| 105 | goto found; | 104 | goto found; |
| 106 | 105 | ||
| 107 | if (to->sat_addr.s_net == at->src_net && | 106 | if (to->sat_addr.s_net == at->src_net && |
| @@ -1443,8 +1442,10 @@ static int atalk_rcv(struct sk_buff *skb, struct net_device *dev, | |||
| 1443 | else | 1442 | else |
| 1444 | atif = atalk_find_interface(ddp->deh_dnet, ddp->deh_dnode); | 1443 | atif = atalk_find_interface(ddp->deh_dnet, ddp->deh_dnode); |
| 1445 | 1444 | ||
| 1446 | /* Not ours, so we route the packet via the correct AppleTalk iface */ | ||
| 1447 | if (!atif) { | 1445 | if (!atif) { |
| 1446 | /* Not ours, so we route the packet via the correct | ||
| 1447 | * AppleTalk iface | ||
| 1448 | */ | ||
| 1448 | atalk_route_packet(skb, dev, ddp, &ddphv, origlen); | 1449 | atalk_route_packet(skb, dev, ddp, &ddphv, origlen); |
| 1449 | goto out; | 1450 | goto out; |
| 1450 | } | 1451 | } |
| @@ -1592,9 +1593,6 @@ static int atalk_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr | |||
| 1592 | 1593 | ||
| 1593 | if (usat->sat_addr.s_net || usat->sat_addr.s_node == ATADDR_ANYNODE) { | 1594 | if (usat->sat_addr.s_net || usat->sat_addr.s_node == ATADDR_ANYNODE) { |
| 1594 | rt = atrtr_find(&usat->sat_addr); | 1595 | rt = atrtr_find(&usat->sat_addr); |
| 1595 | if (!rt) | ||
| 1596 | return -ENETUNREACH; | ||
| 1597 | |||
| 1598 | dev = rt->dev; | 1596 | dev = rt->dev; |
| 1599 | } else { | 1597 | } else { |
| 1600 | struct atalk_addr at_hint; | 1598 | struct atalk_addr at_hint; |
| @@ -1603,11 +1601,12 @@ static int atalk_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr | |||
| 1603 | at_hint.s_net = at->src_net; | 1601 | at_hint.s_net = at->src_net; |
| 1604 | 1602 | ||
| 1605 | rt = atrtr_find(&at_hint); | 1603 | rt = atrtr_find(&at_hint); |
| 1606 | if (!rt) | ||
| 1607 | return -ENETUNREACH; | ||
| 1608 | |||
| 1609 | dev = rt->dev; | 1604 | dev = rt->dev; |
| 1610 | } | 1605 | } |
| 1606 | if (!rt) | ||
| 1607 | return -ENETUNREACH; | ||
| 1608 | |||
| 1609 | dev = rt->dev; | ||
| 1611 | 1610 | ||
| 1612 | SOCK_DEBUG(sk, "SK %p: Size needed %d, device %s\n", | 1611 | SOCK_DEBUG(sk, "SK %p: Size needed %d, device %s\n", |
| 1613 | sk, size, dev->name); | 1612 | sk, size, dev->name); |
| @@ -1677,6 +1676,20 @@ static int atalk_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr | |||
| 1677 | SOCK_DEBUG(sk, "SK %p: Loop back.\n", sk); | 1676 | SOCK_DEBUG(sk, "SK %p: Loop back.\n", sk); |
| 1678 | /* loop back */ | 1677 | /* loop back */ |
| 1679 | skb_orphan(skb); | 1678 | skb_orphan(skb); |
| 1679 | if (ddp->deh_dnode == ATADDR_BCAST) { | ||
| 1680 | struct atalk_addr at_lo; | ||
| 1681 | |||
| 1682 | at_lo.s_node = 0; | ||
| 1683 | at_lo.s_net = 0; | ||
| 1684 | |||
| 1685 | rt = atrtr_find(&at_lo); | ||
| 1686 | if (!rt) { | ||
| 1687 | kfree_skb(skb); | ||
| 1688 | return -ENETUNREACH; | ||
| 1689 | } | ||
| 1690 | dev = rt->dev; | ||
| 1691 | skb->dev = dev; | ||
| 1692 | } | ||
| 1680 | ddp_dl->request(ddp_dl, skb, dev->dev_addr); | 1693 | ddp_dl->request(ddp_dl, skb, dev->dev_addr); |
| 1681 | } else { | 1694 | } else { |
| 1682 | SOCK_DEBUG(sk, "SK %p: send out.\n", sk); | 1695 | SOCK_DEBUG(sk, "SK %p: send out.\n", sk); |
