Lines Matching +full:route +full:- +full:ptp
1 // SPDX-License-Identifier: GPL-2.0-or-later
29 * Bradford Johnson : IP-over-DDP (experimental)
30 * Jay Schulist : Moved IP-over-DDP to its own
59 #include <net/route.h>
97 if (to->sat_port != at->src_port) in atalk_search_socket()
100 if (to->sat_addr.s_net == ATADDR_ANYNET && in atalk_search_socket()
101 to->sat_addr.s_node == ATADDR_BCAST) in atalk_search_socket()
104 if (to->sat_addr.s_net == at->src_net && in atalk_search_socket()
105 (to->sat_addr.s_node == at->src_node || in atalk_search_socket()
106 to->sat_addr.s_node == ATADDR_BCAST || in atalk_search_socket()
107 to->sat_addr.s_node == ATADDR_ANYNODE)) in atalk_search_socket()
110 /* XXXX.0 -- we got a request for this router. make sure in atalk_search_socket()
112 if (to->sat_addr.s_node == ATADDR_ANYNODE && in atalk_search_socket()
113 to->sat_addr.s_net != ATADDR_ANYNET && in atalk_search_socket()
114 atif->address.s_node == at->src_node) { in atalk_search_socket()
115 to->sat_addr.s_node = atif->address.s_node; in atalk_search_socket()
126 * atalk_find_or_insert_socket - Try to find a socket matching ADDR
145 if (at->src_net == sat->sat_addr.s_net && in atalk_find_or_insert_socket()
146 at->src_node == sat->sat_addr.s_node && in atalk_find_or_insert_socket()
147 at->src_port == sat->sat_port) in atalk_find_or_insert_socket()
162 sk->sk_timer.expires = jiffies + SOCK_DESTROY_TIME; in atalk_destroy_timer()
163 add_timer(&sk->sk_timer); in atalk_destroy_timer()
171 skb_queue_purge(&sk->sk_receive_queue); in atalk_destroy_socket()
174 timer_setup(&sk->sk_timer, atalk_destroy_timer, 0); in atalk_destroy_socket()
175 sk->sk_timer.expires = jiffies + SOCK_DESTROY_TIME; in atalk_destroy_socket()
176 add_timer(&sk->sk_timer); in atalk_destroy_socket()
187 /* Anti-deadlock ordering is atalk_routes_lock --> iface_lock -DaveM */
199 * Drop a device. Doesn't drop any of its routes - that is the caller's
209 if (tmp->dev == dev) { in atif_drop_device()
210 *iface = tmp->next; in atif_drop_device()
213 dev->atalk_ptr = NULL; in atif_drop_device()
215 iface = &tmp->next; in atif_drop_device()
229 iface->dev = dev; in atif_add_device()
230 dev->atalk_ptr = iface; in atif_add_device()
231 iface->address = *sa; in atif_add_device()
232 iface->status = 0; in atif_add_device()
235 iface->next = atalk_interfaces; in atif_add_device()
245 int netrange = ntohs(atif->nets.nr_lastnet) - in atif_probe_device()
246 ntohs(atif->nets.nr_firstnet) + 1; in atif_probe_device()
247 int probe_net = ntohs(atif->address.s_net); in atif_probe_device()
248 int probe_node = atif->address.s_node; in atif_probe_device()
253 probe_net = ntohs(atif->nets.nr_firstnet); in atif_probe_device()
261 atif->status |= ATIF_PROBE; in atif_probe_device()
264 atif->address.s_net = htons(probe_net); in atif_probe_device()
266 atif->address.s_node = (nodect + probe_node) & 0xFF; in atif_probe_device()
267 if (atif->address.s_node > 0 && in atif_probe_device()
268 atif->address.s_node < 254) { in atif_probe_device()
272 if (!(atif->status & ATIF_PROBE_FAIL)) { in atif_probe_device()
273 atif->status &= ~ATIF_PROBE; in atif_probe_device()
277 atif->status &= ~ATIF_PROBE_FAIL; in atif_probe_device()
280 if (probe_net > ntohs(atif->nets.nr_lastnet)) in atif_probe_device()
281 probe_net = ntohs(atif->nets.nr_firstnet); in atif_probe_device()
283 atif->status &= ~ATIF_PROBE; in atif_probe_device()
285 return -EADDRINUSE; /* Network is full... */ in atif_probe_device()
293 int netrange = ntohs(atif->nets.nr_lastnet) - in atif_proxy_probe_device()
294 ntohs(atif->nets.nr_firstnet) + 1; in atif_proxy_probe_device()
296 int probe_net = ntohs(atif->address.s_net); in atif_proxy_probe_device()
302 probe_net = ntohs(atif->nets.nr_firstnet); in atif_proxy_probe_device()
313 proxy_addr->s_net = htons(probe_net); in atif_proxy_probe_device()
315 proxy_addr->s_node = (nodect + probe_node) & 0xFF; in atif_proxy_probe_device()
316 if (proxy_addr->s_node > 0 && in atif_proxy_probe_device()
317 proxy_addr->s_node < 254) { in atif_proxy_probe_device()
322 if (ret != -EADDRINUSE) in atif_proxy_probe_device()
327 if (probe_net > ntohs(atif->nets.nr_lastnet)) in atif_proxy_probe_device()
328 probe_net = ntohs(atif->nets.nr_firstnet); in atif_proxy_probe_device()
331 return -EADDRINUSE; /* Network is full... */ in atif_proxy_probe_device()
337 struct atalk_iface *iface = dev->atalk_ptr; in atalk_find_dev_addr()
338 return iface ? &iface->address : NULL; in atalk_find_dev_addr()
348 * Return a point-to-point interface only if in atalk_find_primary()
349 * there is no non-ptp interface available. in atalk_find_primary()
352 for (iface = atalk_interfaces; iface; iface = iface->next) { in atalk_find_primary()
353 if (!fiface && !(iface->dev->flags & IFF_LOOPBACK)) in atalk_find_primary()
355 if (!(iface->dev->flags & (IFF_LOOPBACK | IFF_POINTOPOINT))) { in atalk_find_primary()
356 retval = &iface->address; in atalk_find_primary()
362 retval = &fiface->address; in atalk_find_primary()
364 retval = &atalk_interfaces->address; in atalk_find_primary()
373 * Find a match for 'any network' - ie any of our interfaces with that
378 struct atalk_iface *iface = dev->atalk_ptr; in atalk_find_anynet()
380 if (!iface || iface->status & ATIF_PROBE) in atalk_find_anynet()
384 iface->address.s_node != node && in atalk_find_anynet()
400 for (iface = atalk_interfaces; iface; iface = iface->next) { in atalk_find_interface()
403 iface->address.s_node == node) && in atalk_find_interface()
404 iface->address.s_net == net && in atalk_find_interface()
405 !(iface->status & ATIF_PROBE)) in atalk_find_interface()
408 /* XXXX.0 -- net.0 returns the iface associated with net */ in atalk_find_interface()
410 ntohs(iface->nets.nr_firstnet) <= ntohs(net) && in atalk_find_interface()
411 ntohs(net) <= ntohs(iface->nets.nr_lastnet)) in atalk_find_interface()
420 * Find a route for an AppleTalk packet. This ought to get cached in
422 * that a route must be direct to broadcast.
428 * host route, because some host routes might overlap in atrtr_find()
435 for (r = atalk_routes; r; r = r->next) { in atrtr_find()
436 if (!(r->flags & RTF_UP)) in atrtr_find()
439 if (r->target.s_net == target->s_net) { in atrtr_find()
440 if (r->flags & RTF_HOST) { in atrtr_find()
442 * if this host route is for the target, in atrtr_find()
445 if (r->target.s_node == target->s_node) in atrtr_find()
449 * this route will work if there isn't a in atrtr_find()
450 * direct host route, so cache it in atrtr_find()
457 * if we found a network route but not a direct host in atrtr_find()
458 * route, then return it in atrtr_find()
464 else /* No route can be found */ in atrtr_find()
479 return atr ? atr->dev : NULL; in atrtr_get_dev()
498 struct sockaddr_at *ta = (struct sockaddr_at *)&r->rt_dst; in atrtr_create()
499 struct sockaddr_at *ga = (struct sockaddr_at *)&r->rt_gateway; in atrtr_create()
502 int retval = -EINVAL; in atrtr_create()
510 if (ta->sat_family != AF_APPLETALK || in atrtr_create()
511 (!devhint && ga->sat_family != AF_APPLETALK)) in atrtr_create()
516 for (rt = atalk_routes; rt; rt = rt->next) { in atrtr_create()
517 if (r->rt_flags != rt->flags) in atrtr_create()
520 if (ta->sat_addr.s_net == rt->target.s_net) { in atrtr_create()
521 if (!(rt->flags & RTF_HOST)) in atrtr_create()
523 if (ta->sat_addr.s_node == rt->target.s_node) in atrtr_create()
532 for (iface = atalk_interfaces; iface; iface = iface->next) { in atrtr_create()
534 ntohs(ga->sat_addr.s_net) >= in atrtr_create()
535 ntohs(iface->nets.nr_firstnet) && in atrtr_create()
536 ntohs(ga->sat_addr.s_net) <= in atrtr_create()
537 ntohs(iface->nets.nr_lastnet)) in atrtr_create()
540 if (ga->sat_addr.s_net == iface->address.s_net && in atrtr_create()
541 ga->sat_addr.s_node == iface->address.s_node) in atrtr_create()
546 retval = -ENETUNREACH; in atrtr_create()
550 devhint = riface->dev; in atrtr_create()
556 retval = -ENOBUFS; in atrtr_create()
560 rt->next = atalk_routes; in atrtr_create()
565 rt->target = ta->sat_addr; in atrtr_create()
566 dev_put(rt->dev); /* Release old device */ in atrtr_create()
568 rt->dev = devhint; in atrtr_create()
569 rt->flags = r->rt_flags; in atrtr_create()
570 rt->gateway = ga->sat_addr; in atrtr_create()
579 /* Delete a route. Find it and discard it */
588 if (tmp->target.s_net == addr->s_net && in atrtr_delete()
589 (!(tmp->flags&RTF_GATEWAY) || in atrtr_delete()
590 tmp->target.s_node == addr->s_node)) { in atrtr_delete()
591 *r = tmp->next; in atrtr_delete()
592 dev_put(tmp->dev); in atrtr_delete()
596 r = &tmp->next; in atrtr_delete()
598 retval = -ENOENT; in atrtr_delete()
615 if (tmp->dev == dev) { in atrtr_device_down()
616 *r = tmp->next; in atrtr_device_down()
620 r = &tmp->next; in atrtr_device_down()
638 * delete our use of them (iface and route).
671 return -EFAULT; in atif_ioctl()
675 return -ENODEV; in atif_ioctl()
683 return -EPERM; in atif_ioctl()
684 if (sa->sat_family != AF_APPLETALK) in atif_ioctl()
685 return -EINVAL; in atif_ioctl()
686 if (dev->type != ARPHRD_ETHER && in atif_ioctl()
687 dev->type != ARPHRD_LOOPBACK && in atif_ioctl()
688 dev->type != ARPHRD_LOCALTLK && in atif_ioctl()
689 dev->type != ARPHRD_PPP) in atif_ioctl()
690 return -EPROTONOSUPPORT; in atif_ioctl()
692 nr = (struct atalk_netrange *)&sa->sat_zero[0]; in atif_ioctl()
696 * if this is a point-to-point iface, and we already in atif_ioctl()
698 * should not add a route in atif_ioctl()
700 if ((dev->flags & IFF_POINTOPOINT) && in atif_ioctl()
701 atalk_find_interface(sa->sat_addr.s_net, in atif_ioctl()
702 sa->sat_addr.s_node)) { in atif_ioctl()
703 printk(KERN_DEBUG "AppleTalk: point-to-point " in atif_ioctl()
713 if (dev->type == ARPHRD_ETHER && nr->nr_phase != 2) in atif_ioctl()
714 return -EPROTONOSUPPORT; in atif_ioctl()
715 if (sa->sat_addr.s_node == ATADDR_BCAST || in atif_ioctl()
716 sa->sat_addr.s_node == 254) in atif_ioctl()
717 return -EINVAL; in atif_ioctl()
720 if (atif->status & ATIF_PROBE) in atif_ioctl()
721 return -EBUSY; in atif_ioctl()
723 atif->address.s_net = sa->sat_addr.s_net; in atif_ioctl()
724 atif->address.s_node = sa->sat_addr.s_node; in atif_ioctl()
727 atif = atif_add_device(dev, &sa->sat_addr); in atif_ioctl()
729 return -ENOMEM; in atif_ioctl()
731 atif->nets = *nr; in atif_ioctl()
738 if (!(dev->flags & IFF_LOOPBACK) && in atif_ioctl()
739 !(dev->flags & IFF_POINTOPOINT) && in atif_ioctl()
742 return -EADDRINUSE; in atif_ioctl()
745 /* Hey it worked - add the direct routes */ in atif_ioctl()
747 sa->sat_family = AF_APPLETALK; in atif_ioctl()
748 sa->sat_addr.s_net = atif->address.s_net; in atif_ioctl()
749 sa->sat_addr.s_node = atif->address.s_node; in atif_ioctl()
752 sa->sat_family = AF_APPLETALK; in atif_ioctl()
753 sa->sat_addr.s_node = ATADDR_ANYNODE; in atif_ioctl()
754 if (dev->flags & IFF_LOOPBACK || in atif_ioctl()
755 dev->flags & IFF_POINTOPOINT) in atif_ioctl()
759 if (nr->nr_firstnet == htons(0) && in atif_ioctl()
760 nr->nr_lastnet == htons(0xFFFE)) { in atif_ioctl()
761 sa->sat_addr.s_net = atif->address.s_net; in atif_ioctl()
765 limit = ntohs(nr->nr_lastnet); in atif_ioctl()
766 if (limit - ntohs(nr->nr_firstnet) > 4096) { in atif_ioctl()
769 return -EINVAL; in atif_ioctl()
772 for (ct = ntohs(nr->nr_firstnet); in atif_ioctl()
774 sa->sat_addr.s_net = htons(ct); in atif_ioctl()
783 return -EADDRNOTAVAIL; in atif_ioctl()
785 sa->sat_family = AF_APPLETALK; in atif_ioctl()
786 sa->sat_addr = atif->address; in atif_ioctl()
791 return -EADDRNOTAVAIL; in atif_ioctl()
793 sa->sat_family = AF_APPLETALK; in atif_ioctl()
794 sa->sat_addr.s_net = atif->address.s_net; in atif_ioctl()
795 sa->sat_addr.s_node = ATADDR_BCAST; in atif_ioctl()
801 return -EPERM; in atif_ioctl()
802 if (sa->sat_family != AF_APPLETALK) in atif_ioctl()
803 return -EINVAL; in atif_ioctl()
809 return -EPERM; in atif_ioctl()
810 if (sa->sat_family != AF_APPLETALK) in atif_ioctl()
811 return -EINVAL; in atif_ioctl()
816 if (dev->type != ARPHRD_ETHER) in atif_ioctl()
817 return -EPROTONOSUPPORT; in atif_ioctl()
827 return -EADDRNOTAVAIL; in atif_ioctl()
829 nr = (struct atalk_netrange *)&(atif->nets); in atif_ioctl()
834 if (dev->type == ARPHRD_ETHER && nr->nr_phase != 2) in atif_ioctl()
835 return -EPROTONOSUPPORT; in atif_ioctl()
837 if (sa->sat_addr.s_node == ATADDR_BCAST || in atif_ioctl()
838 sa->sat_addr.s_node == 254) in atif_ioctl()
839 return -EINVAL; in atif_ioctl()
845 if (atif_proxy_probe_device(atif, &(sa->sat_addr)) < 0) in atif_ioctl()
846 return -EADDRINUSE; in atif_ioctl()
858 return -EPERM; in atif_ioctl()
859 if (sa->sat_family != AF_APPLETALK) in atif_ioctl()
860 return -EINVAL; in atif_ioctl()
862 return -EADDRNOTAVAIL; in atif_ioctl()
865 aarp_proxy_remove(atif->dev, &(sa->sat_addr)); in atif_ioctl()
876 if (rt->rt_dev) { in atrtr_ioctl_addrt()
879 if (copy_from_user(name, rt->rt_dev, IFNAMSIZ-1)) in atrtr_ioctl_addrt()
880 return -EFAULT; in atrtr_ioctl_addrt()
881 name[IFNAMSIZ-1] = '\0'; in atrtr_ioctl_addrt()
885 return -ENODEV; in atrtr_ioctl_addrt()
896 return -EFAULT; in atrtr_ioctl()
901 return -EINVAL; in atrtr_ioctl()
903 &rt.rt_dst)->sat_addr); in atrtr_ioctl()
908 return -EINVAL; in atrtr_ioctl()
926 while (len--) { in atalk_sum_partial()
933 /* Checksum skb data -- similar to skb_checksum */
942 if ((copy = start - offset) > 0) { in atalk_sum_skb()
945 sum = atalk_sum_partial(skb->data + offset, copy, sum); in atalk_sum_skb()
946 if ((len -= copy) == 0) in atalk_sum_skb()
953 for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { in atalk_sum_skb()
955 const skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; in atalk_sum_skb()
959 if ((copy = end - offset) > 0) { in atalk_sum_skb()
966 offset - start, copy, sum); in atalk_sum_skb()
969 if (!(len -= copy)) in atalk_sum_skb()
981 end = start + frag_iter->len; in atalk_sum_skb()
982 if ((copy = end - offset) > 0) { in atalk_sum_skb()
985 sum = atalk_sum_skb(frag_iter, offset - start, in atalk_sum_skb()
987 if ((len -= copy) == 0) in atalk_sum_skb()
1004 sum = atalk_sum_skb(skb, 4, len-4, 0); in atalk_checksum()
1024 int rc = -ESOCKTNOSUPPORT; in atalk_create()
1027 return -EAFNOSUPPORT; in atalk_create()
1033 if (sock->type != SOCK_RAW && sock->type != SOCK_DGRAM) in atalk_create()
1036 rc = -EPERM; in atalk_create()
1037 if (sock->type == SOCK_RAW && !kern && !capable(CAP_NET_RAW)) in atalk_create()
1040 rc = -ENOMEM; in atalk_create()
1045 sock->ops = &atalk_dgram_ops; in atalk_create()
1057 struct sock *sk = sock->sk; in atalk_release()
1064 sock->sk = NULL; in atalk_release()
1074 * atalk_pick_and_bind_port - Pick a source port when one is not given
1089 for (sat->sat_port = ATPORT_RESERVED; in atalk_pick_and_bind_port()
1090 sat->sat_port < ATPORT_LAST; in atalk_pick_and_bind_port()
1091 sat->sat_port++) { in atalk_pick_and_bind_port()
1097 if (at->src_net == sat->sat_addr.s_net && in atalk_pick_and_bind_port()
1098 at->src_node == sat->sat_addr.s_node && in atalk_pick_and_bind_port()
1099 at->src_port == sat->sat_port) in atalk_pick_and_bind_port()
1105 at_sk(sk)->src_port = sat->sat_port; in atalk_pick_and_bind_port()
1112 retval = -EBUSY; in atalk_pick_and_bind_port()
1123 int n = -EADDRNOTAVAIL; in atalk_autobind()
1125 if (!ap || ap->s_net == htons(ATADDR_ANYNET)) in atalk_autobind()
1128 at->src_net = sat.sat_addr.s_net = ap->s_net; in atalk_autobind()
1129 at->src_node = sat.sat_addr.s_node = ap->s_node; in atalk_autobind()
1142 struct sock *sk = sock->sk; in atalk_bind()
1148 return -EINVAL; in atalk_bind()
1150 if (addr->sat_family != AF_APPLETALK) in atalk_bind()
1151 return -EAFNOSUPPORT; in atalk_bind()
1154 if (addr->sat_addr.s_net == htons(ATADDR_ANYNET)) { in atalk_bind()
1157 err = -EADDRNOTAVAIL; in atalk_bind()
1161 at->src_net = addr->sat_addr.s_net = ap->s_net; in atalk_bind()
1162 at->src_node = addr->sat_addr.s_node = ap->s_node; in atalk_bind()
1164 err = -EADDRNOTAVAIL; in atalk_bind()
1165 if (!atalk_find_interface(addr->sat_addr.s_net, in atalk_bind()
1166 addr->sat_addr.s_node)) in atalk_bind()
1169 at->src_net = addr->sat_addr.s_net; in atalk_bind()
1170 at->src_node = addr->sat_addr.s_node; in atalk_bind()
1173 if (addr->sat_port == ATADDR_ANYPORT) { in atalk_bind()
1179 at->src_port = addr->sat_port; in atalk_bind()
1181 err = -EADDRINUSE; in atalk_bind()
1197 struct sock *sk = sock->sk; in atalk_connect()
1202 sk->sk_state = TCP_CLOSE; in atalk_connect()
1203 sock->state = SS_UNCONNECTED; in atalk_connect()
1206 return -EINVAL; in atalk_connect()
1210 if (addr->sat_family != AF_APPLETALK) in atalk_connect()
1211 return -EAFNOSUPPORT; in atalk_connect()
1213 if (addr->sat_addr.s_node == ATADDR_BCAST && in atalk_connect()
1217 current->comm); in atalk_connect()
1219 return -EACCES; in atalk_connect()
1224 err = -EBUSY; in atalk_connect()
1229 err = -ENETUNREACH; in atalk_connect()
1230 if (!atrtr_get_dev(&addr->sat_addr)) in atalk_connect()
1233 at->dest_port = addr->sat_port; in atalk_connect()
1234 at->dest_net = addr->sat_addr.s_net; in atalk_connect()
1235 at->dest_node = addr->sat_addr.s_node; in atalk_connect()
1237 sock->state = SS_CONNECTED; in atalk_connect()
1238 sk->sk_state = TCP_ESTABLISHED; in atalk_connect()
1253 struct sock *sk = sock->sk; in atalk_getname()
1258 err = -ENOBUFS; in atalk_getname()
1266 err = -ENOTCONN; in atalk_getname()
1267 if (sk->sk_state != TCP_ESTABLISHED) in atalk_getname()
1270 sat.sat_addr.s_net = at->dest_net; in atalk_getname()
1271 sat.sat_addr.s_node = at->dest_node; in atalk_getname()
1272 sat.sat_port = at->dest_port; in atalk_getname()
1274 sat.sat_addr.s_net = at->src_net; in atalk_getname()
1275 sat.sat_addr.s_node = at->src_node; in atalk_getname()
1276 sat.sat_port = at->src_port; in atalk_getname()
1291 return skb->data[12] == 22; in is_ip_over_ddp()
1305 skb->protocol = htons(ETH_P_IP); in handle_ip_over_ddp()
1307 skb->dev = dev; in handle_ip_over_ddp()
1311 stats->rx_packets++; in handle_ip_over_ddp()
1312 stats->rx_bytes += skb->len + 13; in handle_ip_over_ddp()
1328 * Don't route multicast, etc., packets, or packets sent to "this in atalk_route_packet()
1331 if (skb->pkt_type != PACKET_HOST || !ddp->deh_dnet) { in atalk_route_packet()
1338 if (dev->type == ARPHRD_PPP) in atalk_route_packet()
1344 ta.s_net = ddp->deh_dnet; in atalk_route_packet()
1345 ta.s_node = ddp->deh_dnode; in atalk_route_packet()
1347 /* Route the packet */ in atalk_route_packet()
1354 /* FIXME: use skb->cb to be able to use shared skbs */ in atalk_route_packet()
1357 * Route goes through another gateway, so set the target to the in atalk_route_packet()
1361 if (rt->flags & RTF_GATEWAY) { in atalk_route_packet()
1362 ta.s_net = rt->gateway.s_net; in atalk_route_packet()
1363 ta.s_node = rt->gateway.s_node; in atalk_route_packet()
1366 /* Fix up skb->len field */ in atalk_route_packet()
1368 (rt->dev->hard_header_len + in atalk_route_packet()
1369 ddp_dl->header_length + (len_hops & 1023)))); in atalk_route_packet()
1371 /* FIXME: use skb->cb to be able to use shared skbs */ in atalk_route_packet()
1372 ddp->deh_len_hops = htons(len_hops); in atalk_route_packet()
1383 * Note. ddp-> becomes invalid at the realloc. in atalk_route_packet()
1386 /* 22 bytes - 12 ether, 2 len, 3 802.2 5 snap */ in atalk_route_packet()
1400 if (aarp_send_ddp(rt->dev, skb, &ta, NULL) == NET_XMIT_DROP) in atalk_route_packet()
1410 * atalk_rcv - Receive a packet (in skb) from device dev
1417 * decoder, and on entry skb->transport_header is the DDP header, skb->len
1418 * is the DDP header, skb->len is the DDP length. The physical headers
1445 len_hops = ntohs(ddp->deh_len_hops); in atalk_rcv()
1448 origlen = skb->len; in atalk_rcv()
1449 skb_trim(skb, min_t(unsigned int, skb->len, len_hops & 1023)); in atalk_rcv()
1452 * Size check to see if ddp->deh_len was crap in atalk_rcv()
1456 if (skb->len < sizeof(*ddp) || skb->len < (len_hops & 1023)) { in atalk_rcv()
1458 "skb->len=%u)\n", len_hops & 1023, skb->len); in atalk_rcv()
1466 if (ddp->deh_sum && in atalk_rcv()
1467 atalk_checksum(skb, len_hops & 1023) != ddp->deh_sum) in atalk_rcv()
1468 /* Not a valid AppleTalk frame - dustbin time */ in atalk_rcv()
1472 if (!ddp->deh_dnet) /* Net 0 is 'this network' */ in atalk_rcv()
1473 atif = atalk_find_anynet(ddp->deh_dnode, dev); in atalk_rcv()
1475 atif = atalk_find_interface(ddp->deh_dnet, ddp->deh_dnode); in atalk_rcv()
1478 /* Not ours, so we route the packet via the correct in atalk_rcv()
1488 * Which socket - atalk_search_socket() looks for a *full match* in atalk_rcv()
1491 tosat.sat_addr.s_net = ddp->deh_dnet; in atalk_rcv()
1492 tosat.sat_addr.s_node = ddp->deh_dnode; in atalk_rcv()
1493 tosat.sat_port = ddp->deh_dport; in atalk_rcv()
1529 if (!ap || skb->len < sizeof(__be16) || skb->len > 1023) in ltalk_rcv()
1540 ddp = skb_push(skb, sizeof(*ddp) - 4); in ltalk_rcv()
1550 ddp->deh_dnode = skb_mac_header(skb)[0]; /* From physical header */ in ltalk_rcv()
1551 ddp->deh_snode = skb_mac_header(skb)[1]; /* From physical header */ in ltalk_rcv()
1553 ddp->deh_dnet = ap->s_net; /* Network number */ in ltalk_rcv()
1554 ddp->deh_snet = ap->s_net; in ltalk_rcv()
1555 ddp->deh_sum = 0; /* No checksum */ in ltalk_rcv()
1560 ddp->deh_len_hops = htons(skb->len + (DDP_MAXHOPS << 10)); in ltalk_rcv()
1572 struct sock *sk = sock->sk; in atalk_sendmsg()
1574 DECLARE_SOCKADDR(struct sockaddr_at *, usat, msg->msg_name); in atalk_sendmsg()
1575 int flags = msg->msg_flags; in atalk_sendmsg()
1586 return -EINVAL; in atalk_sendmsg()
1589 return -EMSGSIZE; in atalk_sendmsg()
1593 err = -EBUSY; in atalk_sendmsg()
1598 err = -EINVAL; in atalk_sendmsg()
1599 if (msg->msg_namelen < sizeof(*usat) || in atalk_sendmsg()
1600 usat->sat_family != AF_APPLETALK) in atalk_sendmsg()
1603 err = -EPERM; in atalk_sendmsg()
1605 if (usat->sat_addr.s_node == ATADDR_BCAST && in atalk_sendmsg()
1610 err = -ENOTCONN; in atalk_sendmsg()
1611 if (sk->sk_state != TCP_ESTABLISHED) in atalk_sendmsg()
1614 usat->sat_family = AF_APPLETALK; in atalk_sendmsg()
1615 usat->sat_port = at->dest_port; in atalk_sendmsg()
1616 usat->sat_addr.s_node = at->dest_node; in atalk_sendmsg()
1617 usat->sat_addr.s_net = at->dest_net; in atalk_sendmsg()
1624 size = sizeof(struct ddpehdr) + len + ddp_dl->header_length; in atalk_sendmsg()
1626 if (usat->sat_addr.s_net || usat->sat_addr.s_node == ATADDR_ANYNODE) { in atalk_sendmsg()
1627 rt = atrtr_find(&usat->sat_addr); in atalk_sendmsg()
1632 at_hint.s_net = at->src_net; in atalk_sendmsg()
1636 err = -ENETUNREACH; in atalk_sendmsg()
1640 dev = rt->dev; in atalk_sendmsg()
1643 sk, size, dev->name); in atalk_sendmsg()
1645 hard_header_len = dev->hard_header_len; in atalk_sendmsg()
1647 if (usat->sat_addr.s_node == ATADDR_BCAST && in atalk_sendmsg()
1648 (dev->flags & IFF_LOOPBACK || !(rt->flags & RTF_GATEWAY))) { in atalk_sendmsg()
1656 if (rt_lo && rt_lo->dev->hard_header_len > hard_header_len) in atalk_sendmsg()
1657 hard_header_len = rt_lo->dev->hard_header_len; in atalk_sendmsg()
1667 skb_reserve(skb, ddp_dl->header_length); in atalk_sendmsg()
1669 skb->dev = dev; in atalk_sendmsg()
1674 ddp->deh_len_hops = htons(len + sizeof(*ddp)); in atalk_sendmsg()
1675 ddp->deh_dnet = usat->sat_addr.s_net; in atalk_sendmsg()
1676 ddp->deh_snet = at->src_net; in atalk_sendmsg()
1677 ddp->deh_dnode = usat->sat_addr.s_node; in atalk_sendmsg()
1678 ddp->deh_snode = at->src_node; in atalk_sendmsg()
1679 ddp->deh_dport = usat->sat_port; in atalk_sendmsg()
1680 ddp->deh_sport = at->src_port; in atalk_sendmsg()
1687 err = -EFAULT; in atalk_sendmsg()
1691 if (sk->sk_no_check_tx) in atalk_sendmsg()
1692 ddp->deh_sum = 0; in atalk_sendmsg()
1694 ddp->deh_sum = atalk_checksum(skb, len + sizeof(*ddp)); in atalk_sendmsg()
1700 if (ddp->deh_dnode == ATADDR_BCAST && in atalk_sendmsg()
1701 !(rt->flags & RTF_GATEWAY) && !(dev->flags & IFF_LOOPBACK)) { in atalk_sendmsg()
1710 aarp_send_ddp(dev, skb2, &usat->sat_addr, NULL); in atalk_sendmsg()
1714 if (dev->flags & IFF_LOOPBACK || loopback) { in atalk_sendmsg()
1718 if (ddp->deh_dnode == ATADDR_BCAST) { in atalk_sendmsg()
1721 err = -ENETUNREACH; in atalk_sendmsg()
1724 dev = rt_lo->dev; in atalk_sendmsg()
1725 skb->dev = dev; in atalk_sendmsg()
1727 ddp_dl->request(ddp_dl, skb, dev->dev_addr); in atalk_sendmsg()
1730 if (rt->flags & RTF_GATEWAY) { in atalk_sendmsg()
1731 gsat.sat_addr = rt->gateway; in atalk_sendmsg()
1738 aarp_send_ddp(dev, skb, &usat->sat_addr, NULL); in atalk_sendmsg()
1750 struct sock *sk = sock->sk; in atalk_recvmsg()
1763 /* FIXME: use skb->cb to be able to use shared skbs */ in atalk_recvmsg()
1765 copied = ntohs(ddp->deh_len_hops) & 1023; in atalk_recvmsg()
1767 if (sk->sk_type != SOCK_RAW) { in atalk_recvmsg()
1769 copied -= offset; in atalk_recvmsg()
1774 msg->msg_flags |= MSG_TRUNC; in atalk_recvmsg()
1778 if (!err && msg->msg_name) { in atalk_recvmsg()
1779 DECLARE_SOCKADDR(struct sockaddr_at *, sat, msg->msg_name); in atalk_recvmsg()
1780 sat->sat_family = AF_APPLETALK; in atalk_recvmsg()
1781 sat->sat_port = ddp->deh_sport; in atalk_recvmsg()
1782 sat->sat_addr.s_node = ddp->deh_snode; in atalk_recvmsg()
1783 sat->sat_addr.s_net = ddp->deh_snet; in atalk_recvmsg()
1784 msg->msg_namelen = sizeof(*sat); in atalk_recvmsg()
1800 int rc = -ENOIOCTLCMD; in atalk_ioctl()
1801 struct sock *sk = sock->sk; in atalk_ioctl()
1807 long amount = sk->sk_sndbuf - sk_wmem_alloc_get(sk); in atalk_ioctl()
1818 spin_lock_irq(&sk->sk_receive_queue.lock); in atalk_ioctl()
1819 skb = skb_peek(&sk->sk_receive_queue); in atalk_ioctl()
1821 amount = skb->len - sizeof(struct ddpehdr); in atalk_ioctl()
1822 spin_unlock_irq(&sk->sk_receive_queue.lock); in atalk_ioctl()
1829 rc = -EPERM; in atalk_ioctl()
1858 if (copy_from_user(&rt.rt_dst, &ur->rt_dst, in atalk_compat_routing_ioctl()
1860 get_user(rt.rt_flags, &ur->rt_flags) || in atalk_compat_routing_ioctl()
1861 get_user(rt.rt_metric, &ur->rt_metric) || in atalk_compat_routing_ioctl()
1862 get_user(rt.rt_mtu, &ur->rt_mtu) || in atalk_compat_routing_ioctl()
1863 get_user(rt.rt_window, &ur->rt_window) || in atalk_compat_routing_ioctl()
1864 get_user(rt.rt_irtt, &ur->rt_irtt) || in atalk_compat_routing_ioctl()
1865 get_user(rtdev, &ur->rt_dev)) in atalk_compat_routing_ioctl()
1866 return -EFAULT; in atalk_compat_routing_ioctl()
1871 return -EINVAL; in atalk_compat_routing_ioctl()
1873 &rt.rt_dst)->sat_addr); in atalk_compat_routing_ioctl()
1879 return -EINVAL; in atalk_compat_routing_ioctl()
1885 struct sock *sk = sock->sk; in atalk_compat_ioctl()
1900 return -ENOIOCTLCMD; in atalk_compat_ioctl()
1970 rc = -ENOMEM; in atalk_init()
2027 aarp_cleanup_module(); /* General aarp clean-up. */ in atalk_exit()