• Home
  • Raw
  • Download

Lines Matching +full:route +full:- +full:ptp

28  *		Bradford Johnson	:	IP-over-DDP (experimental)
29 * Jay Schulist : Moved IP-over-DDP to its own
64 #include <net/route.h>
101 if (to->sat_port != at->src_port) in atalk_search_socket()
104 if (to->sat_addr.s_net == ATADDR_ANYNET && in atalk_search_socket()
105 to->sat_addr.s_node == ATADDR_BCAST) in atalk_search_socket()
108 if (to->sat_addr.s_net == at->src_net && in atalk_search_socket()
109 (to->sat_addr.s_node == at->src_node || in atalk_search_socket()
110 to->sat_addr.s_node == ATADDR_BCAST || in atalk_search_socket()
111 to->sat_addr.s_node == ATADDR_ANYNODE)) in atalk_search_socket()
114 /* XXXX.0 -- we got a request for this router. make sure in atalk_search_socket()
116 if (to->sat_addr.s_node == ATADDR_ANYNODE && in atalk_search_socket()
117 to->sat_addr.s_net != ATADDR_ANYNET && in atalk_search_socket()
118 atif->address.s_node == at->src_node) { in atalk_search_socket()
119 to->sat_addr.s_node = atif->address.s_node; in atalk_search_socket()
130 * atalk_find_or_insert_socket - Try to find a socket matching ADDR
149 if (at->src_net == sat->sat_addr.s_net && in atalk_find_or_insert_socket()
150 at->src_node == sat->sat_addr.s_node && in atalk_find_or_insert_socket()
151 at->src_port == sat->sat_port) in atalk_find_or_insert_socket()
166 sk->sk_timer.expires = jiffies + SOCK_DESTROY_TIME; in atalk_destroy_timer()
167 add_timer(&sk->sk_timer); in atalk_destroy_timer()
175 skb_queue_purge(&sk->sk_receive_queue); in atalk_destroy_socket()
178 timer_setup(&sk->sk_timer, atalk_destroy_timer, 0); in atalk_destroy_socket()
179 sk->sk_timer.expires = jiffies + SOCK_DESTROY_TIME; in atalk_destroy_socket()
180 add_timer(&sk->sk_timer); in atalk_destroy_socket()
191 /* Anti-deadlock ordering is atalk_routes_lock --> iface_lock -DaveM */
203 * Drop a device. Doesn't drop any of its routes - that is the caller's
213 if (tmp->dev == dev) { in atif_drop_device()
214 *iface = tmp->next; in atif_drop_device()
217 dev->atalk_ptr = NULL; in atif_drop_device()
219 iface = &tmp->next; in atif_drop_device()
233 iface->dev = dev; in atif_add_device()
234 dev->atalk_ptr = iface; in atif_add_device()
235 iface->address = *sa; in atif_add_device()
236 iface->status = 0; in atif_add_device()
239 iface->next = atalk_interfaces; in atif_add_device()
249 int netrange = ntohs(atif->nets.nr_lastnet) - in atif_probe_device()
250 ntohs(atif->nets.nr_firstnet) + 1; in atif_probe_device()
251 int probe_net = ntohs(atif->address.s_net); in atif_probe_device()
252 int probe_node = atif->address.s_node; in atif_probe_device()
257 probe_net = ntohs(atif->nets.nr_firstnet); in atif_probe_device()
265 atif->status |= ATIF_PROBE; in atif_probe_device()
268 atif->address.s_net = htons(probe_net); in atif_probe_device()
270 atif->address.s_node = (nodect + probe_node) & 0xFF; in atif_probe_device()
271 if (atif->address.s_node > 0 && in atif_probe_device()
272 atif->address.s_node < 254) { in atif_probe_device()
276 if (!(atif->status & ATIF_PROBE_FAIL)) { in atif_probe_device()
277 atif->status &= ~ATIF_PROBE; in atif_probe_device()
281 atif->status &= ~ATIF_PROBE_FAIL; in atif_probe_device()
284 if (probe_net > ntohs(atif->nets.nr_lastnet)) in atif_probe_device()
285 probe_net = ntohs(atif->nets.nr_firstnet); in atif_probe_device()
287 atif->status &= ~ATIF_PROBE; in atif_probe_device()
289 return -EADDRINUSE; /* Network is full... */ in atif_probe_device()
297 int netrange = ntohs(atif->nets.nr_lastnet) - in atif_proxy_probe_device()
298 ntohs(atif->nets.nr_firstnet) + 1; in atif_proxy_probe_device()
300 int probe_net = ntohs(atif->address.s_net); in atif_proxy_probe_device()
306 probe_net = ntohs(atif->nets.nr_firstnet); in atif_proxy_probe_device()
317 proxy_addr->s_net = htons(probe_net); in atif_proxy_probe_device()
319 proxy_addr->s_node = (nodect + probe_node) & 0xFF; in atif_proxy_probe_device()
320 if (proxy_addr->s_node > 0 && in atif_proxy_probe_device()
321 proxy_addr->s_node < 254) { in atif_proxy_probe_device()
326 if (ret != -EADDRINUSE) in atif_proxy_probe_device()
331 if (probe_net > ntohs(atif->nets.nr_lastnet)) in atif_proxy_probe_device()
332 probe_net = ntohs(atif->nets.nr_firstnet); in atif_proxy_probe_device()
335 return -EADDRINUSE; /* Network is full... */ in atif_proxy_probe_device()
341 struct atalk_iface *iface = dev->atalk_ptr; in atalk_find_dev_addr()
342 return iface ? &iface->address : NULL; in atalk_find_dev_addr()
352 * Return a point-to-point interface only if in atalk_find_primary()
353 * there is no non-ptp interface available. in atalk_find_primary()
356 for (iface = atalk_interfaces; iface; iface = iface->next) { in atalk_find_primary()
357 if (!fiface && !(iface->dev->flags & IFF_LOOPBACK)) in atalk_find_primary()
359 if (!(iface->dev->flags & (IFF_LOOPBACK | IFF_POINTOPOINT))) { in atalk_find_primary()
360 retval = &iface->address; in atalk_find_primary()
366 retval = &fiface->address; in atalk_find_primary()
368 retval = &atalk_interfaces->address; in atalk_find_primary()
377 * Find a match for 'any network' - ie any of our interfaces with that
382 struct atalk_iface *iface = dev->atalk_ptr; in atalk_find_anynet()
384 if (!iface || iface->status & ATIF_PROBE) in atalk_find_anynet()
388 iface->address.s_node != node && in atalk_find_anynet()
404 for (iface = atalk_interfaces; iface; iface = iface->next) { in atalk_find_interface()
407 iface->address.s_node == node) && in atalk_find_interface()
408 iface->address.s_net == net && in atalk_find_interface()
409 !(iface->status & ATIF_PROBE)) in atalk_find_interface()
412 /* XXXX.0 -- net.0 returns the iface associated with net */ in atalk_find_interface()
414 ntohs(iface->nets.nr_firstnet) <= ntohs(net) && in atalk_find_interface()
415 ntohs(net) <= ntohs(iface->nets.nr_lastnet)) in atalk_find_interface()
424 * Find a route for an AppleTalk packet. This ought to get cached in
426 * that a route must be direct to broadcast.
432 * host route, because some host routes might overlap in atrtr_find()
439 for (r = atalk_routes; r; r = r->next) { in atrtr_find()
440 if (!(r->flags & RTF_UP)) in atrtr_find()
443 if (r->target.s_net == target->s_net) { in atrtr_find()
444 if (r->flags & RTF_HOST) { in atrtr_find()
446 * if this host route is for the target, in atrtr_find()
449 if (r->target.s_node == target->s_node) in atrtr_find()
453 * this route will work if there isn't a in atrtr_find()
454 * direct host route, so cache it in atrtr_find()
461 * if we found a network route but not a direct host in atrtr_find()
462 * route, then return it in atrtr_find()
468 else /* No route can be found */ in atrtr_find()
483 return atr ? atr->dev : NULL; in atrtr_get_dev()
502 struct sockaddr_at *ta = (struct sockaddr_at *)&r->rt_dst; in atrtr_create()
503 struct sockaddr_at *ga = (struct sockaddr_at *)&r->rt_gateway; in atrtr_create()
506 int retval = -EINVAL; in atrtr_create()
514 if (ta->sat_family != AF_APPLETALK || in atrtr_create()
515 (!devhint && ga->sat_family != AF_APPLETALK)) in atrtr_create()
520 for (rt = atalk_routes; rt; rt = rt->next) { in atrtr_create()
521 if (r->rt_flags != rt->flags) in atrtr_create()
524 if (ta->sat_addr.s_net == rt->target.s_net) { in atrtr_create()
525 if (!(rt->flags & RTF_HOST)) in atrtr_create()
527 if (ta->sat_addr.s_node == rt->target.s_node) in atrtr_create()
536 for (iface = atalk_interfaces; iface; iface = iface->next) { in atrtr_create()
538 ntohs(ga->sat_addr.s_net) >= in atrtr_create()
539 ntohs(iface->nets.nr_firstnet) && in atrtr_create()
540 ntohs(ga->sat_addr.s_net) <= in atrtr_create()
541 ntohs(iface->nets.nr_lastnet)) in atrtr_create()
544 if (ga->sat_addr.s_net == iface->address.s_net && in atrtr_create()
545 ga->sat_addr.s_node == iface->address.s_node) in atrtr_create()
550 retval = -ENETUNREACH; in atrtr_create()
554 devhint = riface->dev; in atrtr_create()
560 retval = -ENOBUFS; in atrtr_create()
564 rt->next = atalk_routes; in atrtr_create()
569 rt->target = ta->sat_addr; in atrtr_create()
571 rt->dev = devhint; in atrtr_create()
572 rt->flags = r->rt_flags; in atrtr_create()
573 rt->gateway = ga->sat_addr; in atrtr_create()
582 /* Delete a route. Find it and discard it */
591 if (tmp->target.s_net == addr->s_net && in atrtr_delete()
592 (!(tmp->flags&RTF_GATEWAY) || in atrtr_delete()
593 tmp->target.s_node == addr->s_node)) { in atrtr_delete()
594 *r = tmp->next; in atrtr_delete()
595 dev_put(tmp->dev); in atrtr_delete()
599 r = &tmp->next; in atrtr_delete()
601 retval = -ENOENT; in atrtr_delete()
618 if (tmp->dev == dev) { in atrtr_device_down()
619 *r = tmp->next; in atrtr_device_down()
623 r = &tmp->next; in atrtr_device_down()
641 * delete our use of them (iface and route).
674 return -EFAULT; in atif_ioctl()
678 return -ENODEV; in atif_ioctl()
686 return -EPERM; in atif_ioctl()
687 if (sa->sat_family != AF_APPLETALK) in atif_ioctl()
688 return -EINVAL; in atif_ioctl()
689 if (dev->type != ARPHRD_ETHER && in atif_ioctl()
690 dev->type != ARPHRD_LOOPBACK && in atif_ioctl()
691 dev->type != ARPHRD_LOCALTLK && in atif_ioctl()
692 dev->type != ARPHRD_PPP) in atif_ioctl()
693 return -EPROTONOSUPPORT; in atif_ioctl()
695 nr = (struct atalk_netrange *)&sa->sat_zero[0]; in atif_ioctl()
699 * if this is a point-to-point iface, and we already in atif_ioctl()
701 * should not add a route in atif_ioctl()
703 if ((dev->flags & IFF_POINTOPOINT) && in atif_ioctl()
704 atalk_find_interface(sa->sat_addr.s_net, in atif_ioctl()
705 sa->sat_addr.s_node)) { in atif_ioctl()
706 printk(KERN_DEBUG "AppleTalk: point-to-point " in atif_ioctl()
716 if (dev->type == ARPHRD_ETHER && nr->nr_phase != 2) in atif_ioctl()
717 return -EPROTONOSUPPORT; in atif_ioctl()
718 if (sa->sat_addr.s_node == ATADDR_BCAST || in atif_ioctl()
719 sa->sat_addr.s_node == 254) in atif_ioctl()
720 return -EINVAL; in atif_ioctl()
723 if (atif->status & ATIF_PROBE) in atif_ioctl()
724 return -EBUSY; in atif_ioctl()
726 atif->address.s_net = sa->sat_addr.s_net; in atif_ioctl()
727 atif->address.s_node = sa->sat_addr.s_node; in atif_ioctl()
730 atif = atif_add_device(dev, &sa->sat_addr); in atif_ioctl()
732 return -ENOMEM; in atif_ioctl()
734 atif->nets = *nr; in atif_ioctl()
741 if (!(dev->flags & IFF_LOOPBACK) && in atif_ioctl()
742 !(dev->flags & IFF_POINTOPOINT) && in atif_ioctl()
745 return -EADDRINUSE; in atif_ioctl()
748 /* Hey it worked - add the direct routes */ in atif_ioctl()
750 sa->sat_family = AF_APPLETALK; in atif_ioctl()
751 sa->sat_addr.s_net = atif->address.s_net; in atif_ioctl()
752 sa->sat_addr.s_node = atif->address.s_node; in atif_ioctl()
755 sa->sat_family = AF_APPLETALK; in atif_ioctl()
756 sa->sat_addr.s_node = ATADDR_ANYNODE; in atif_ioctl()
757 if (dev->flags & IFF_LOOPBACK || in atif_ioctl()
758 dev->flags & IFF_POINTOPOINT) in atif_ioctl()
762 if (nr->nr_firstnet == htons(0) && in atif_ioctl()
763 nr->nr_lastnet == htons(0xFFFE)) { in atif_ioctl()
764 sa->sat_addr.s_net = atif->address.s_net; in atif_ioctl()
768 limit = ntohs(nr->nr_lastnet); in atif_ioctl()
769 if (limit - ntohs(nr->nr_firstnet) > 4096) { in atif_ioctl()
772 return -EINVAL; in atif_ioctl()
775 for (ct = ntohs(nr->nr_firstnet); in atif_ioctl()
777 sa->sat_addr.s_net = htons(ct); in atif_ioctl()
786 return -EADDRNOTAVAIL; in atif_ioctl()
788 sa->sat_family = AF_APPLETALK; in atif_ioctl()
789 sa->sat_addr = atif->address; in atif_ioctl()
794 return -EADDRNOTAVAIL; in atif_ioctl()
796 sa->sat_family = AF_APPLETALK; in atif_ioctl()
797 sa->sat_addr.s_net = atif->address.s_net; in atif_ioctl()
798 sa->sat_addr.s_node = ATADDR_BCAST; in atif_ioctl()
804 return -EPERM; in atif_ioctl()
805 if (sa->sat_family != AF_APPLETALK) in atif_ioctl()
806 return -EINVAL; in atif_ioctl()
812 return -EPERM; in atif_ioctl()
813 if (sa->sat_family != AF_APPLETALK) in atif_ioctl()
814 return -EINVAL; in atif_ioctl()
819 if (dev->type != ARPHRD_ETHER) in atif_ioctl()
820 return -EPROTONOSUPPORT; in atif_ioctl()
830 return -EADDRNOTAVAIL; in atif_ioctl()
832 nr = (struct atalk_netrange *)&(atif->nets); in atif_ioctl()
837 if (dev->type == ARPHRD_ETHER && nr->nr_phase != 2) in atif_ioctl()
838 return -EPROTONOSUPPORT; in atif_ioctl()
840 if (sa->sat_addr.s_node == ATADDR_BCAST || in atif_ioctl()
841 sa->sat_addr.s_node == 254) in atif_ioctl()
842 return -EINVAL; in atif_ioctl()
848 if (atif_proxy_probe_device(atif, &(sa->sat_addr)) < 0) in atif_ioctl()
849 return -EADDRINUSE; in atif_ioctl()
861 return -EPERM; in atif_ioctl()
862 if (sa->sat_family != AF_APPLETALK) in atif_ioctl()
863 return -EINVAL; in atif_ioctl()
865 return -EADDRNOTAVAIL; in atif_ioctl()
868 aarp_proxy_remove(atif->dev, &(sa->sat_addr)); in atif_ioctl()
872 return copy_to_user(arg, &atreq, sizeof(atreq)) ? -EFAULT : 0; in atif_ioctl()
881 return -EFAULT; in atrtr_ioctl()
886 return -EINVAL; in atrtr_ioctl()
888 &rt.rt_dst)->sat_addr); in atrtr_ioctl()
894 if (copy_from_user(name, rt.rt_dev, IFNAMSIZ-1)) in atrtr_ioctl()
895 return -EFAULT; in atrtr_ioctl()
896 name[IFNAMSIZ-1] = '\0'; in atrtr_ioctl()
899 return -ENODEV; in atrtr_ioctl()
904 return -EINVAL; in atrtr_ioctl()
922 while (len--) { in atalk_sum_partial()
929 /* Checksum skb data -- similar to skb_checksum */
938 if ((copy = start - offset) > 0) { in atalk_sum_skb()
941 sum = atalk_sum_partial(skb->data + offset, copy, sum); in atalk_sum_skb()
942 if ((len -= copy) == 0) in atalk_sum_skb()
949 for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { in atalk_sum_skb()
951 const skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; in atalk_sum_skb()
955 if ((copy = end - offset) > 0) { in atalk_sum_skb()
961 sum = atalk_sum_partial(vaddr + frag->page_offset + in atalk_sum_skb()
962 offset - start, copy, sum); in atalk_sum_skb()
965 if (!(len -= copy)) in atalk_sum_skb()
977 end = start + frag_iter->len; in atalk_sum_skb()
978 if ((copy = end - offset) > 0) { in atalk_sum_skb()
981 sum = atalk_sum_skb(frag_iter, offset - start, in atalk_sum_skb()
983 if ((len -= copy) == 0) in atalk_sum_skb()
1000 sum = atalk_sum_skb(skb, 4, len-4, 0); in atalk_checksum()
1020 int rc = -ESOCKTNOSUPPORT; in atalk_create()
1023 return -EAFNOSUPPORT; in atalk_create()
1029 if (sock->type != SOCK_RAW && sock->type != SOCK_DGRAM) in atalk_create()
1032 rc = -EPERM; in atalk_create()
1033 if (sock->type == SOCK_RAW && !kern && !capable(CAP_NET_RAW)) in atalk_create()
1036 rc = -ENOMEM; in atalk_create()
1041 sock->ops = &atalk_dgram_ops; in atalk_create()
1053 struct sock *sk = sock->sk; in atalk_release()
1060 sock->sk = NULL; in atalk_release()
1070 * atalk_pick_and_bind_port - Pick a source port when one is not given
1085 for (sat->sat_port = ATPORT_RESERVED; in atalk_pick_and_bind_port()
1086 sat->sat_port < ATPORT_LAST; in atalk_pick_and_bind_port()
1087 sat->sat_port++) { in atalk_pick_and_bind_port()
1093 if (at->src_net == sat->sat_addr.s_net && in atalk_pick_and_bind_port()
1094 at->src_node == sat->sat_addr.s_node && in atalk_pick_and_bind_port()
1095 at->src_port == sat->sat_port) in atalk_pick_and_bind_port()
1101 at_sk(sk)->src_port = sat->sat_port; in atalk_pick_and_bind_port()
1108 retval = -EBUSY; in atalk_pick_and_bind_port()
1119 int n = -EADDRNOTAVAIL; in atalk_autobind()
1121 if (!ap || ap->s_net == htons(ATADDR_ANYNET)) in atalk_autobind()
1124 at->src_net = sat.sat_addr.s_net = ap->s_net; in atalk_autobind()
1125 at->src_node = sat.sat_addr.s_node = ap->s_node; in atalk_autobind()
1138 struct sock *sk = sock->sk; in atalk_bind()
1144 return -EINVAL; in atalk_bind()
1146 if (addr->sat_family != AF_APPLETALK) in atalk_bind()
1147 return -EAFNOSUPPORT; in atalk_bind()
1150 if (addr->sat_addr.s_net == htons(ATADDR_ANYNET)) { in atalk_bind()
1153 err = -EADDRNOTAVAIL; in atalk_bind()
1157 at->src_net = addr->sat_addr.s_net = ap->s_net; in atalk_bind()
1158 at->src_node = addr->sat_addr.s_node = ap->s_node; in atalk_bind()
1160 err = -EADDRNOTAVAIL; in atalk_bind()
1161 if (!atalk_find_interface(addr->sat_addr.s_net, in atalk_bind()
1162 addr->sat_addr.s_node)) in atalk_bind()
1165 at->src_net = addr->sat_addr.s_net; in atalk_bind()
1166 at->src_node = addr->sat_addr.s_node; in atalk_bind()
1169 if (addr->sat_port == ATADDR_ANYPORT) { in atalk_bind()
1175 at->src_port = addr->sat_port; in atalk_bind()
1177 err = -EADDRINUSE; in atalk_bind()
1193 struct sock *sk = sock->sk; in atalk_connect()
1198 sk->sk_state = TCP_CLOSE; in atalk_connect()
1199 sock->state = SS_UNCONNECTED; in atalk_connect()
1202 return -EINVAL; in atalk_connect()
1206 if (addr->sat_family != AF_APPLETALK) in atalk_connect()
1207 return -EAFNOSUPPORT; in atalk_connect()
1209 if (addr->sat_addr.s_node == ATADDR_BCAST && in atalk_connect()
1213 current->comm); in atalk_connect()
1215 return -EACCES; in atalk_connect()
1220 err = -EBUSY; in atalk_connect()
1225 err = -ENETUNREACH; in atalk_connect()
1226 if (!atrtr_get_dev(&addr->sat_addr)) in atalk_connect()
1229 at->dest_port = addr->sat_port; in atalk_connect()
1230 at->dest_net = addr->sat_addr.s_net; in atalk_connect()
1231 at->dest_node = addr->sat_addr.s_node; in atalk_connect()
1233 sock->state = SS_CONNECTED; in atalk_connect()
1234 sk->sk_state = TCP_ESTABLISHED; in atalk_connect()
1249 struct sock *sk = sock->sk; in atalk_getname()
1254 err = -ENOBUFS; in atalk_getname()
1262 err = -ENOTCONN; in atalk_getname()
1263 if (sk->sk_state != TCP_ESTABLISHED) in atalk_getname()
1266 sat.sat_addr.s_net = at->dest_net; in atalk_getname()
1267 sat.sat_addr.s_node = at->dest_node; in atalk_getname()
1268 sat.sat_port = at->dest_port; in atalk_getname()
1270 sat.sat_addr.s_net = at->src_net; in atalk_getname()
1271 sat.sat_addr.s_node = at->src_node; in atalk_getname()
1272 sat.sat_port = at->src_port; in atalk_getname()
1287 return skb->data[12] == 22; in is_ip_over_ddp()
1301 skb->protocol = htons(ETH_P_IP); in handle_ip_over_ddp()
1303 skb->dev = dev; in handle_ip_over_ddp()
1307 stats->rx_packets++; in handle_ip_over_ddp()
1308 stats->rx_bytes += skb->len + 13; in handle_ip_over_ddp()
1324 * Don't route multicast, etc., packets, or packets sent to "this in atalk_route_packet()
1327 if (skb->pkt_type != PACKET_HOST || !ddp->deh_dnet) { in atalk_route_packet()
1334 if (dev->type == ARPHRD_PPP) in atalk_route_packet()
1340 ta.s_net = ddp->deh_dnet; in atalk_route_packet()
1341 ta.s_node = ddp->deh_dnode; in atalk_route_packet()
1343 /* Route the packet */ in atalk_route_packet()
1350 /* FIXME: use skb->cb to be able to use shared skbs */ in atalk_route_packet()
1353 * Route goes through another gateway, so set the target to the in atalk_route_packet()
1357 if (rt->flags & RTF_GATEWAY) { in atalk_route_packet()
1358 ta.s_net = rt->gateway.s_net; in atalk_route_packet()
1359 ta.s_node = rt->gateway.s_node; in atalk_route_packet()
1362 /* Fix up skb->len field */ in atalk_route_packet()
1364 (rt->dev->hard_header_len + in atalk_route_packet()
1365 ddp_dl->header_length + (len_hops & 1023)))); in atalk_route_packet()
1367 /* FIXME: use skb->cb to be able to use shared skbs */ in atalk_route_packet()
1368 ddp->deh_len_hops = htons(len_hops); in atalk_route_packet()
1379 * Note. ddp-> becomes invalid at the realloc. in atalk_route_packet()
1382 /* 22 bytes - 12 ether, 2 len, 3 802.2 5 snap */ in atalk_route_packet()
1396 if (aarp_send_ddp(rt->dev, skb, &ta, NULL) == NET_XMIT_DROP) in atalk_route_packet()
1406 * atalk_rcv - Receive a packet (in skb) from device dev
1407 * @skb - packet received
1408 * @dev - network device where the packet comes from
1409 * @pt - packet type
1412 * decoder, and on entry skb->transport_header is the DDP header, skb->len
1413 * is the DDP header, skb->len is the DDP length. The physical headers
1440 len_hops = ntohs(ddp->deh_len_hops); in atalk_rcv()
1443 origlen = skb->len; in atalk_rcv()
1444 skb_trim(skb, min_t(unsigned int, skb->len, len_hops & 1023)); in atalk_rcv()
1447 * Size check to see if ddp->deh_len was crap in atalk_rcv()
1451 if (skb->len < sizeof(*ddp) || skb->len < (len_hops & 1023)) { in atalk_rcv()
1453 "skb->len=%u)\n", len_hops & 1023, skb->len); in atalk_rcv()
1461 if (ddp->deh_sum && in atalk_rcv()
1462 atalk_checksum(skb, len_hops & 1023) != ddp->deh_sum) in atalk_rcv()
1463 /* Not a valid AppleTalk frame - dustbin time */ in atalk_rcv()
1467 if (!ddp->deh_dnet) /* Net 0 is 'this network' */ in atalk_rcv()
1468 atif = atalk_find_anynet(ddp->deh_dnode, dev); in atalk_rcv()
1470 atif = atalk_find_interface(ddp->deh_dnet, ddp->deh_dnode); in atalk_rcv()
1473 /* Not ours, so we route the packet via the correct in atalk_rcv()
1483 * Which socket - atalk_search_socket() looks for a *full match* in atalk_rcv()
1486 tosat.sat_addr.s_net = ddp->deh_dnet; in atalk_rcv()
1487 tosat.sat_addr.s_node = ddp->deh_dnode; in atalk_rcv()
1488 tosat.sat_port = ddp->deh_dport; in atalk_rcv()
1524 if (!ap || skb->len < sizeof(__be16) || skb->len > 1023) in ltalk_rcv()
1535 ddp = skb_push(skb, sizeof(*ddp) - 4); in ltalk_rcv()
1545 ddp->deh_dnode = skb_mac_header(skb)[0]; /* From physical header */ in ltalk_rcv()
1546 ddp->deh_snode = skb_mac_header(skb)[1]; /* From physical header */ in ltalk_rcv()
1548 ddp->deh_dnet = ap->s_net; /* Network number */ in ltalk_rcv()
1549 ddp->deh_snet = ap->s_net; in ltalk_rcv()
1550 ddp->deh_sum = 0; /* No checksum */ in ltalk_rcv()
1555 ddp->deh_len_hops = htons(skb->len + (DDP_MAXHOPS << 10)); in ltalk_rcv()
1567 struct sock *sk = sock->sk; in atalk_sendmsg()
1569 DECLARE_SOCKADDR(struct sockaddr_at *, usat, msg->msg_name); in atalk_sendmsg()
1570 int flags = msg->msg_flags; in atalk_sendmsg()
1581 return -EINVAL; in atalk_sendmsg()
1584 return -EMSGSIZE; in atalk_sendmsg()
1588 err = -EBUSY; in atalk_sendmsg()
1593 err = -EINVAL; in atalk_sendmsg()
1594 if (msg->msg_namelen < sizeof(*usat) || in atalk_sendmsg()
1595 usat->sat_family != AF_APPLETALK) in atalk_sendmsg()
1598 err = -EPERM; in atalk_sendmsg()
1600 if (usat->sat_addr.s_node == ATADDR_BCAST && in atalk_sendmsg()
1605 err = -ENOTCONN; in atalk_sendmsg()
1606 if (sk->sk_state != TCP_ESTABLISHED) in atalk_sendmsg()
1609 usat->sat_family = AF_APPLETALK; in atalk_sendmsg()
1610 usat->sat_port = at->dest_port; in atalk_sendmsg()
1611 usat->sat_addr.s_node = at->dest_node; in atalk_sendmsg()
1612 usat->sat_addr.s_net = at->dest_net; in atalk_sendmsg()
1619 size = sizeof(struct ddpehdr) + len + ddp_dl->header_length; in atalk_sendmsg()
1621 if (usat->sat_addr.s_net || usat->sat_addr.s_node == ATADDR_ANYNODE) { in atalk_sendmsg()
1622 rt = atrtr_find(&usat->sat_addr); in atalk_sendmsg()
1627 at_hint.s_net = at->src_net; in atalk_sendmsg()
1631 err = -ENETUNREACH; in atalk_sendmsg()
1635 dev = rt->dev; in atalk_sendmsg()
1638 sk, size, dev->name); in atalk_sendmsg()
1640 size += dev->hard_header_len; in atalk_sendmsg()
1647 skb_reserve(skb, ddp_dl->header_length); in atalk_sendmsg()
1648 skb_reserve(skb, dev->hard_header_len); in atalk_sendmsg()
1649 skb->dev = dev; in atalk_sendmsg()
1654 ddp->deh_len_hops = htons(len + sizeof(*ddp)); in atalk_sendmsg()
1655 ddp->deh_dnet = usat->sat_addr.s_net; in atalk_sendmsg()
1656 ddp->deh_snet = at->src_net; in atalk_sendmsg()
1657 ddp->deh_dnode = usat->sat_addr.s_node; in atalk_sendmsg()
1658 ddp->deh_snode = at->src_node; in atalk_sendmsg()
1659 ddp->deh_dport = usat->sat_port; in atalk_sendmsg()
1660 ddp->deh_sport = at->src_port; in atalk_sendmsg()
1667 err = -EFAULT; in atalk_sendmsg()
1671 if (sk->sk_no_check_tx) in atalk_sendmsg()
1672 ddp->deh_sum = 0; in atalk_sendmsg()
1674 ddp->deh_sum = atalk_checksum(skb, len + sizeof(*ddp)); in atalk_sendmsg()
1680 if (ddp->deh_dnode == ATADDR_BCAST && in atalk_sendmsg()
1681 !(rt->flags & RTF_GATEWAY) && !(dev->flags & IFF_LOOPBACK)) { in atalk_sendmsg()
1690 aarp_send_ddp(dev, skb2, &usat->sat_addr, NULL); in atalk_sendmsg()
1694 if (dev->flags & IFF_LOOPBACK || loopback) { in atalk_sendmsg()
1698 if (ddp->deh_dnode == ATADDR_BCAST) { in atalk_sendmsg()
1707 err = -ENETUNREACH; in atalk_sendmsg()
1710 dev = rt->dev; in atalk_sendmsg()
1711 skb->dev = dev; in atalk_sendmsg()
1713 ddp_dl->request(ddp_dl, skb, dev->dev_addr); in atalk_sendmsg()
1716 if (rt->flags & RTF_GATEWAY) { in atalk_sendmsg()
1717 gsat.sat_addr = rt->gateway; in atalk_sendmsg()
1724 aarp_send_ddp(dev, skb, &usat->sat_addr, NULL); in atalk_sendmsg()
1736 struct sock *sk = sock->sk; in atalk_recvmsg()
1750 /* FIXME: use skb->cb to be able to use shared skbs */ in atalk_recvmsg()
1752 copied = ntohs(ddp->deh_len_hops) & 1023; in atalk_recvmsg()
1754 if (sk->sk_type != SOCK_RAW) { in atalk_recvmsg()
1756 copied -= offset; in atalk_recvmsg()
1761 msg->msg_flags |= MSG_TRUNC; in atalk_recvmsg()
1765 if (!err && msg->msg_name) { in atalk_recvmsg()
1766 DECLARE_SOCKADDR(struct sockaddr_at *, sat, msg->msg_name); in atalk_recvmsg()
1767 sat->sat_family = AF_APPLETALK; in atalk_recvmsg()
1768 sat->sat_port = ddp->deh_sport; in atalk_recvmsg()
1769 sat->sat_addr.s_node = ddp->deh_snode; in atalk_recvmsg()
1770 sat->sat_addr.s_net = ddp->deh_snet; in atalk_recvmsg()
1771 msg->msg_namelen = sizeof(*sat); in atalk_recvmsg()
1787 int rc = -ENOIOCTLCMD; in atalk_ioctl()
1788 struct sock *sk = sock->sk; in atalk_ioctl()
1794 long amount = sk->sk_sndbuf - sk_wmem_alloc_get(sk); in atalk_ioctl()
1806 struct sk_buff *skb = skb_peek(&sk->sk_receive_queue); in atalk_ioctl()
1810 amount = skb->len - sizeof(struct ddpehdr); in atalk_ioctl()
1823 rc = -EPERM; in atalk_ioctl()
1857 return -ENOIOCTLCMD; in atalk_compat_ioctl()
1928 rc = -ENOMEM; in atalk_init()
1985 aarp_cleanup_module(); /* General aarp clean-up. */ in atalk_exit()