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); |