4 * This code REQUIRES 2.1.15 or higher/ NET3.038
7 * This module is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version
10 * 2 of the License, or (at your option) any later version.
13 * NET/ROM 001 Jonathan(G4KLX) Cloned from the AX25 code.
14 * NET/ROM 002 Darryl(G7LED) Fixes and address enhancement.
15 * Jonathan(G4KLX) Complete bind re-think.
16 * Alan(GW4PTS) Trivial tweaks into new format.
17 * NET/ROM 003 Jonathan(G4KLX) Added G8BPQ extensions.
18 * Added NET/ROM routing ioctl.
19 * Darryl(G7LED) Fix autobinding (on connect).
20 * Fixed nr_release(), set TCP_CLOSE, wakeup app
21 * context, THEN make the sock dead.
22 * Circuit ID check before allocating it on
24 * Alan(GW4PTS) sendmsg/recvmsg only. Fixed connect clear bug
25 * inherited from AX.25
26 * NET/ROM 004 Jonathan(G4KLX) Converted to module.
27 * NET/ROM 005 Jonathan(G4KLX) Linux 2.1
28 * Alan(GW4PTS) Started POSIXisms
29 * NET/ROM 006 Alan(GW4PTS) Brought in line with the ANK changes
30 * Jonathan(G4KLX) Removed hdrincl.
31 * NET/ROM 007 Jonathan(G4KLX) New timer architecture.
32 * Impmented Idle timer.
33 * Arnaldo C. Melo s/suser/capable/, micro cleanups
34 * Jeroen(PE1RXQ) Use sock_orphan() on release.
35 * Tomi(OH2BNS) Better frame type checking.
36 * Device refcnt fixes.
39 #include <linux/config.h>
40 #include <linux/module.h>
41 #include <linux/errno.h>
42 #include <linux/types.h>
43 #include <linux/socket.h>
45 #include <linux/kernel.h>
46 #include <linux/sched.h>
47 #include <linux/timer.h>
48 #include <linux/string.h>
49 #include <linux/sockios.h>
50 #include <linux/net.h>
51 #include <linux/stat.h>
53 #include <linux/inet.h>
54 #include <linux/netdevice.h>
55 #include <linux/if_arp.h>
56 #include <linux/skbuff.h>
58 #include <asm/uaccess.h>
59 #include <asm/system.h>
60 #include <linux/fcntl.h>
61 #include <linux/termios.h> /* For TIOCINQ/OUTQ */
63 #include <linux/interrupt.h>
64 #include <linux/notifier.h>
65 #include <net/netrom.h>
66 #include <linux/proc_fs.h>
69 #include <linux/init.h>
73 int sysctl_netrom_default_path_quality = NR_DEFAULT_QUAL;
74 int sysctl_netrom_obsolescence_count_initialiser = NR_DEFAULT_OBS;
75 int sysctl_netrom_network_ttl_initialiser = NR_DEFAULT_TTL;
76 int sysctl_netrom_transport_timeout = NR_DEFAULT_T1;
77 int sysctl_netrom_transport_maximum_tries = NR_DEFAULT_N2;
78 int sysctl_netrom_transport_acknowledge_delay = NR_DEFAULT_T2;
79 int sysctl_netrom_transport_busy_delay = NR_DEFAULT_T4;
80 int sysctl_netrom_transport_requested_window_size = NR_DEFAULT_WINDOW;
81 int sysctl_netrom_transport_no_activity_timeout = NR_DEFAULT_IDLE;
82 int sysctl_netrom_routing_control = NR_DEFAULT_ROUTING;
83 int sysctl_netrom_link_fails_count = NR_DEFAULT_FAILS;
85 static unsigned short circuit = 0x101;
87 static struct sock *volatile nr_list;
89 static struct proto_ops nr_proto_ops;
91 static void nr_free_sock(struct sock *sk)
98 static struct sock *nr_alloc_sock(void)
103 if ((sk = sk_alloc(PF_NETROM, GFP_ATOMIC, 1)) == NULL)
106 if ((nr = kmalloc(sizeof(*nr), GFP_ATOMIC)) == NULL) {
113 memset(nr, 0x00, sizeof(*nr));
115 sk->protinfo.nr = nr;
122 * Socket removal during an interrupt is now safe.
124 static void nr_remove_socket(struct sock *sk)
129 save_flags(flags); cli();
131 if ((s = nr_list) == sk) {
133 dev_put(sk->protinfo.nr->device);
134 restore_flags(flags);
138 while (s != NULL && s->next != NULL) {
141 dev_put(sk->protinfo.nr->device);
142 restore_flags(flags);
149 restore_flags(flags);
153 * Kill all bound sockets on a dropped device.
155 static void nr_kill_by_device(struct net_device *dev)
159 for (s = nr_list; s != NULL; s = s->next) {
160 if (s->protinfo.nr->device == dev)
161 nr_disconnect(s, ENETUNREACH);
166 * Handle device status changes.
168 static int nr_device_event(struct notifier_block *this, unsigned long event, void *ptr)
170 struct net_device *dev = (struct net_device *)ptr;
172 if (event != NETDEV_DOWN)
175 nr_kill_by_device(dev);
176 nr_rt_device_down(dev);
182 * Add a socket to the bound sockets list.
184 static void nr_insert_socket(struct sock *sk)
188 save_flags(flags); cli();
193 restore_flags(flags);
197 * Find a socket that wants to accept the Connect Request we just
200 static struct sock *nr_find_listener(ax25_address *addr)
208 for (s = nr_list; s != NULL; s = s->next) {
209 if (ax25cmp(&s->protinfo.nr->source_addr, addr) == 0 && s->state == TCP_LISTEN) {
210 restore_flags(flags);
215 restore_flags(flags);
220 * Find a connected NET/ROM socket given my circuit IDs.
222 static struct sock *nr_find_socket(unsigned char index, unsigned char id)
230 for (s = nr_list; s != NULL; s = s->next) {
231 if (s->protinfo.nr->my_index == index && s->protinfo.nr->my_id == id) {
232 restore_flags(flags);
237 restore_flags(flags);
243 * Find a connected NET/ROM socket given their circuit IDs.
245 static struct sock *nr_find_peer(unsigned char index, unsigned char id, ax25_address *dest)
253 for (s = nr_list; s != NULL; s = s->next) {
254 if (s->protinfo.nr->your_index == index && s->protinfo.nr->your_id == id && ax25cmp(&s->protinfo.nr->dest_addr, dest) == 0) {
255 restore_flags(flags);
260 restore_flags(flags);
266 * Find next free circuit ID.
268 static unsigned short nr_find_next_circuit(void)
270 unsigned short id = circuit;
277 if (i != 0 && j != 0)
278 if (nr_find_socket(i, j) == NULL)
290 void nr_destroy_socket(struct sock *);
293 * Handler for deferred kills.
295 static void nr_destroy_timer(unsigned long data)
297 nr_destroy_socket((struct sock *)data);
301 * This is called from user mode and the timers. Thus it protects itself against
302 * interrupt users but doesn't worry about being called during work.
303 * Once it is removed from the queue no interrupt or bottom half will
304 * touch it and we are (fairly 8-) ) safe.
306 void nr_destroy_socket(struct sock *sk) /* Not static as it's used by the timer */
311 save_flags(flags); cli();
313 nr_stop_heartbeat(sk);
317 nr_stop_idletimer(sk);
319 nr_remove_socket(sk);
320 nr_clear_queues(sk); /* Flush the queues */
322 while ((skb = skb_dequeue(&sk->receive_queue)) != NULL) {
323 if (skb->sk != sk) { /* A pending connection */
324 skb->sk->dead = 1; /* Queue the unaccepted socket for death */
325 nr_start_heartbeat(skb->sk);
326 skb->sk->protinfo.nr->state = NR_STATE_0;
332 if (atomic_read(&sk->wmem_alloc) != 0 || atomic_read(&sk->rmem_alloc) != 0) {
333 /* Defer: outstanding buffers */
334 init_timer(&sk->timer);
335 sk->timer.expires = jiffies + 10 * HZ;
336 sk->timer.function = nr_destroy_timer;
337 sk->timer.data = (unsigned long)sk;
338 add_timer(&sk->timer);
343 restore_flags(flags);
347 * Handling for system calls applied via the various interfaces to a
348 * NET/ROM socket object.
351 static int nr_setsockopt(struct socket *sock, int level, int optname,
352 char *optval, int optlen)
354 struct sock *sk = sock->sk;
357 if (level != SOL_NETROM)
360 if (optlen < sizeof(int))
363 if (get_user(opt, (int *)optval))
370 sk->protinfo.nr->t1 = opt * HZ;
376 sk->protinfo.nr->t2 = opt * HZ;
380 if (opt < 1 || opt > 31)
382 sk->protinfo.nr->n2 = opt;
388 sk->protinfo.nr->t4 = opt * HZ;
394 sk->protinfo.nr->idle = opt * 60 * HZ;
402 static int nr_getsockopt(struct socket *sock, int level, int optname,
403 char *optval, int *optlen)
405 struct sock *sk = sock->sk;
409 if (level != SOL_NETROM)
412 if (get_user(len, optlen))
420 val = sk->protinfo.nr->t1 / HZ;
424 val = sk->protinfo.nr->t2 / HZ;
428 val = sk->protinfo.nr->n2;
432 val = sk->protinfo.nr->t4 / HZ;
436 val = sk->protinfo.nr->idle / (60 * HZ);
443 len = min_t(unsigned int, len, sizeof(int));
445 if (put_user(len, optlen))
448 return copy_to_user(optval, &val, len) ? -EFAULT : 0;
451 static int nr_listen(struct socket *sock, int backlog)
453 struct sock *sk = sock->sk;
455 if (sk->state != TCP_LISTEN) {
456 memset(&sk->protinfo.nr->user_addr, '\0', AX25_ADDR_LEN);
457 sk->max_ack_backlog = backlog;
458 sk->state = TCP_LISTEN;
465 static int nr_create(struct socket *sock, int protocol)
470 if (sock->type != SOCK_SEQPACKET || protocol != 0)
471 return -ESOCKTNOSUPPORT;
473 if ((sk = nr_alloc_sock()) == NULL)
476 nr = sk->protinfo.nr;
478 sock_init_data(sock, sk);
480 sock->ops = &nr_proto_ops;
481 sk->protocol = protocol;
483 skb_queue_head_init(&nr->ack_queue);
484 skb_queue_head_init(&nr->reseq_queue);
485 skb_queue_head_init(&nr->frag_queue);
487 init_timer(&nr->t1timer);
488 init_timer(&nr->t2timer);
489 init_timer(&nr->t4timer);
490 init_timer(&nr->idletimer);
492 nr->t1 = sysctl_netrom_transport_timeout;
493 nr->t2 = sysctl_netrom_transport_acknowledge_delay;
494 nr->n2 = sysctl_netrom_transport_maximum_tries;
495 nr->t4 = sysctl_netrom_transport_busy_delay;
496 nr->idle = sysctl_netrom_transport_no_activity_timeout;
497 nr->window = sysctl_netrom_transport_requested_window_size;
500 nr->state = NR_STATE_0;
505 static struct sock *nr_make_new(struct sock *osk)
510 if (osk->type != SOCK_SEQPACKET)
513 if ((sk = nr_alloc_sock()) == NULL)
516 nr = sk->protinfo.nr;
518 sock_init_data(NULL, sk);
520 sk->type = osk->type;
521 sk->socket = osk->socket;
522 sk->priority = osk->priority;
523 sk->protocol = osk->protocol;
524 sk->rcvbuf = osk->rcvbuf;
525 sk->sndbuf = osk->sndbuf;
526 sk->debug = osk->debug;
527 sk->state = TCP_ESTABLISHED;
528 sk->sleep = osk->sleep;
529 sk->zapped = osk->zapped;
531 skb_queue_head_init(&nr->ack_queue);
532 skb_queue_head_init(&nr->reseq_queue);
533 skb_queue_head_init(&nr->frag_queue);
535 init_timer(&nr->t1timer);
536 init_timer(&nr->t2timer);
537 init_timer(&nr->t4timer);
538 init_timer(&nr->idletimer);
540 nr->t1 = osk->protinfo.nr->t1;
541 nr->t2 = osk->protinfo.nr->t2;
542 nr->n2 = osk->protinfo.nr->n2;
543 nr->t4 = osk->protinfo.nr->t4;
544 nr->idle = osk->protinfo.nr->idle;
545 nr->window = osk->protinfo.nr->window;
547 nr->device = osk->protinfo.nr->device;
548 nr->bpqext = osk->protinfo.nr->bpqext;
553 static int nr_release(struct socket *sock)
555 struct sock *sk = sock->sk;
557 if (sk == NULL) return 0;
559 switch (sk->protinfo.nr->state) {
564 nr_disconnect(sk, 0);
565 nr_destroy_socket(sk);
570 sk->protinfo.nr->n2count = 0;
571 nr_write_internal(sk, NR_DISCREQ);
572 nr_start_t1timer(sk);
575 nr_stop_idletimer(sk);
576 sk->protinfo.nr->state = NR_STATE_2;
577 sk->state = TCP_CLOSE;
578 sk->shutdown |= SEND_SHUTDOWN;
579 sk->state_change(sk);
594 static int nr_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
596 struct sock *sk = sock->sk;
597 struct full_sockaddr_ax25 *addr = (struct full_sockaddr_ax25 *)uaddr;
598 struct net_device *dev;
599 ax25_address *user, *source;
604 if (addr_len < sizeof(struct sockaddr_ax25) || addr_len > sizeof(struct
608 if (addr_len < (addr->fsa_ax25.sax25_ndigis * sizeof(ax25_address) + sizeof(struct sockaddr_ax25)))
611 if (addr->fsa_ax25.sax25_family != AF_NETROM)
614 if ((dev = nr_dev_get(&addr->fsa_ax25.sax25_call)) == NULL) {
615 SOCK_DEBUG(sk, "NET/ROM: bind failed: invalid node callsign\n");
616 return -EADDRNOTAVAIL;
620 * Only the super user can set an arbitrary user callsign.
622 if (addr->fsa_ax25.sax25_ndigis == 1) {
623 if (!capable(CAP_NET_BIND_SERVICE)) {
627 sk->protinfo.nr->user_addr = addr->fsa_digipeater[0];
628 sk->protinfo.nr->source_addr = addr->fsa_ax25.sax25_call;
630 source = &addr->fsa_ax25.sax25_call;
632 if ((user = ax25_findbyuid(current->euid)) == NULL) {
633 if (ax25_uid_policy && !capable(CAP_NET_BIND_SERVICE)) {
640 sk->protinfo.nr->user_addr = *user;
641 sk->protinfo.nr->source_addr = *source;
644 sk->protinfo.nr->device = dev;
645 nr_insert_socket(sk);
648 SOCK_DEBUG(sk, "NET/ROM: socket is bound\n");
652 static int nr_connect(struct socket *sock, struct sockaddr *uaddr,
653 int addr_len, int flags)
655 struct sock *sk = sock->sk;
656 struct sockaddr_ax25 *addr = (struct sockaddr_ax25 *)uaddr;
657 ax25_address *user, *source = NULL;
658 struct net_device *dev;
660 if (sk->state == TCP_ESTABLISHED && sock->state == SS_CONNECTING) {
661 sock->state = SS_CONNECTED;
662 return 0; /* Connect completed during a ERESTARTSYS event */
665 if (sk->state == TCP_CLOSE && sock->state == SS_CONNECTING) {
666 sock->state = SS_UNCONNECTED;
667 return -ECONNREFUSED;
670 if (sk->state == TCP_ESTABLISHED)
671 return -EISCONN; /* No reconnect on a seqpacket socket */
673 sk->state = TCP_CLOSE;
674 sock->state = SS_UNCONNECTED;
676 if (addr_len != sizeof(struct sockaddr_ax25) && addr_len != sizeof(struct full_sockaddr_ax25))
679 if (addr->sax25_family != AF_NETROM)
682 if (sk->zapped) { /* Must bind first - autobinding in this may or may not work */
685 if ((dev = nr_dev_first()) == NULL)
688 source = (ax25_address *)dev->dev_addr;
690 if ((user = ax25_findbyuid(current->euid)) == NULL) {
691 if (ax25_uid_policy && !capable(CAP_NET_ADMIN)) {
698 sk->protinfo.nr->user_addr = *user;
699 sk->protinfo.nr->source_addr = *source;
700 sk->protinfo.nr->device = dev;
702 nr_insert_socket(sk); /* Finish the bind */
705 sk->protinfo.nr->dest_addr = addr->sax25_call;
707 circuit = nr_find_next_circuit();
709 sk->protinfo.nr->my_index = circuit / 256;
710 sk->protinfo.nr->my_id = circuit % 256;
714 /* Move to connecting socket, start sending Connect Requests */
715 sock->state = SS_CONNECTING;
716 sk->state = TCP_SYN_SENT;
718 nr_establish_data_link(sk);
720 sk->protinfo.nr->state = NR_STATE_1;
722 nr_start_heartbeat(sk);
725 if (sk->state != TCP_ESTABLISHED && (flags & O_NONBLOCK))
728 cli(); /* To avoid races on the sleep */
731 * A Connect Ack with Choke or timeout or failed routing will go to closed.
733 while (sk->state == TCP_SYN_SENT) {
734 interruptible_sleep_on(sk->sleep);
735 if (signal_pending(current)) {
741 if (sk->state != TCP_ESTABLISHED) {
743 sock->state = SS_UNCONNECTED;
744 return sock_error(sk); /* Always set at this point */
747 sock->state = SS_CONNECTED;
754 static int nr_accept(struct socket *sock, struct socket *newsock, int flags)
760 if ((sk = sock->sk) == NULL)
763 if (sk->type != SOCK_SEQPACKET)
766 if (sk->state != TCP_LISTEN)
770 * The write queue this time is holding sockets ready to use
771 * hooked into the SABM we saved
775 if ((skb = skb_dequeue(&sk->receive_queue)) == NULL) {
776 if (flags & O_NONBLOCK) {
780 interruptible_sleep_on(sk->sleep);
781 if (signal_pending(current)) {
786 } while (skb == NULL);
790 newsk->socket = newsock;
791 newsk->sleep = &newsock->wait;
794 /* Now attach up the new socket */
802 static int nr_getname(struct socket *sock, struct sockaddr *uaddr,
803 int *uaddr_len, int peer)
805 struct full_sockaddr_ax25 *sax = (struct full_sockaddr_ax25 *)uaddr;
806 struct sock *sk = sock->sk;
809 if (sk->state != TCP_ESTABLISHED)
811 sax->fsa_ax25.sax25_family = AF_NETROM;
812 sax->fsa_ax25.sax25_ndigis = 1;
813 sax->fsa_ax25.sax25_call = sk->protinfo.nr->user_addr;
814 sax->fsa_digipeater[0] = sk->protinfo.nr->dest_addr;
815 *uaddr_len = sizeof(struct full_sockaddr_ax25);
817 sax->fsa_ax25.sax25_family = AF_NETROM;
818 sax->fsa_ax25.sax25_ndigis = 0;
819 sax->fsa_ax25.sax25_call = sk->protinfo.nr->source_addr;
820 *uaddr_len = sizeof(struct sockaddr_ax25);
826 int nr_rx_frame(struct sk_buff *skb, struct net_device *dev)
830 ax25_address *src, *dest, *user;
831 unsigned short circuit_index, circuit_id;
832 unsigned short peer_circuit_index, peer_circuit_id;
833 unsigned short frametype, flags, window, timeout;
835 skb->sk = NULL; /* Initially we don't know who it's for */
838 * skb->data points to the netrom frame start
841 src = (ax25_address *)(skb->data + 0);
842 dest = (ax25_address *)(skb->data + 7);
844 circuit_index = skb->data[15];
845 circuit_id = skb->data[16];
846 peer_circuit_index = skb->data[17];
847 peer_circuit_id = skb->data[18];
848 frametype = skb->data[19] & 0x0F;
849 flags = skb->data[19] & 0xF0;
855 * Check for an incoming IP over NET/ROM frame.
857 if (circuit_index == NR_PROTO_IP && circuit_id == NR_PROTO_IP) {
858 skb_pull(skb, NR_NETWORK_LEN + NR_TRANSPORT_LEN);
859 skb->h.raw = skb->data;
861 return nr_rx_ip(skb, dev);
873 * These frame types we understand.
879 * Everything else is ignored.
885 * Find an existing socket connection, based on circuit ID, if it's
886 * a Connect Request base it on their circuit ID.
888 * Circuit ID 0/0 is not valid but it could still be a "reset" for a
889 * circuit that no longer exists at the other end ...
894 if (circuit_index == 0 && circuit_id == 0) {
895 if (frametype == NR_CONNACK && flags == NR_CHOKE_FLAG)
896 sk = nr_find_peer(peer_circuit_index, peer_circuit_id, src);
898 if (frametype == NR_CONNREQ)
899 sk = nr_find_peer(circuit_index, circuit_id, src);
901 sk = nr_find_socket(circuit_index, circuit_id);
905 skb->h.raw = skb->data;
907 if (frametype == NR_CONNACK && skb->len == 22)
908 sk->protinfo.nr->bpqext = 1;
910 sk->protinfo.nr->bpqext = 0;
912 return nr_process_rx_frame(sk, skb);
916 * Now it should be a CONNREQ.
918 if (frametype != NR_CONNREQ) {
920 * Here it would be nice to be able to send a reset but
921 * NET/ROM doesn't have one. The following hack would
922 * have been a way to extend the protocol but apparently
923 * it kills BPQ boxes... :-(
927 * Never reply to a CONNACK/CHOKE.
929 if (frametype != NR_CONNACK || flags != NR_CHOKE_FLAG)
930 nr_transmit_refusal(skb, 1);
935 sk = nr_find_listener(dest);
937 user = (ax25_address *)(skb->data + 21);
939 if (sk == NULL || sk->ack_backlog == sk->max_ack_backlog || (make = nr_make_new(sk)) == NULL) {
940 nr_transmit_refusal(skb, 0);
944 window = skb->data[20];
947 make->state = TCP_ESTABLISHED;
949 /* Fill in his circuit details */
950 make->protinfo.nr->source_addr = *dest;
951 make->protinfo.nr->dest_addr = *src;
952 make->protinfo.nr->user_addr = *user;
954 make->protinfo.nr->your_index = circuit_index;
955 make->protinfo.nr->your_id = circuit_id;
957 circuit = nr_find_next_circuit();
959 make->protinfo.nr->my_index = circuit / 256;
960 make->protinfo.nr->my_id = circuit % 256;
964 /* Window negotiation */
965 if (window < make->protinfo.nr->window)
966 make->protinfo.nr->window = window;
968 /* L4 timeout negotiation */
969 if (skb->len == 37) {
970 timeout = skb->data[36] * 256 + skb->data[35];
971 if (timeout * HZ < make->protinfo.nr->t1)
972 make->protinfo.nr->t1 = timeout * HZ;
973 make->protinfo.nr->bpqext = 1;
975 make->protinfo.nr->bpqext = 0;
978 nr_write_internal(make, NR_CONNACK);
980 make->protinfo.nr->condition = 0x00;
981 make->protinfo.nr->vs = 0;
982 make->protinfo.nr->va = 0;
983 make->protinfo.nr->vr = 0;
984 make->protinfo.nr->vl = 0;
985 make->protinfo.nr->state = NR_STATE_3;
989 dev_hold(make->protinfo.nr->device);
991 nr_insert_socket(make);
993 skb_queue_head(&sk->receive_queue, skb);
995 nr_start_heartbeat(make);
996 nr_start_idletimer(make);
999 sk->data_ready(sk, skb->len);
1004 static int nr_sendmsg(struct socket *sock, struct msghdr *msg, int len, struct scm_cookie *scm)
1006 struct sock *sk = sock->sk;
1007 struct sockaddr_ax25 *usax = (struct sockaddr_ax25 *)msg->msg_name;
1009 struct sockaddr_ax25 sax;
1010 struct sk_buff *skb;
1011 unsigned char *asmptr;
1014 if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_EOR))
1018 return -EADDRNOTAVAIL;
1020 if (sk->shutdown & SEND_SHUTDOWN) {
1021 send_sig(SIGPIPE, current, 0);
1025 if (sk->protinfo.nr->device == NULL)
1026 return -ENETUNREACH;
1029 if (msg->msg_namelen < sizeof(sax))
1032 if (ax25cmp(&sk->protinfo.nr->dest_addr, &sax.sax25_call) != 0)
1034 if (sax.sax25_family != AF_NETROM)
1037 if (sk->state != TCP_ESTABLISHED)
1039 sax.sax25_family = AF_NETROM;
1040 sax.sax25_call = sk->protinfo.nr->dest_addr;
1043 SOCK_DEBUG(sk, "NET/ROM: sendto: Addresses built.\n");
1045 /* Build a packet */
1046 SOCK_DEBUG(sk, "NET/ROM: sendto: building packet.\n");
1047 size = len + AX25_BPQ_HEADER_LEN + AX25_MAX_HEADER_LEN + NR_NETWORK_LEN + NR_TRANSPORT_LEN;
1049 if ((skb = sock_alloc_send_skb(sk, size, msg->msg_flags & MSG_DONTWAIT, &err)) == NULL)
1052 skb_reserve(skb, size - len);
1055 * Push down the NET/ROM header
1058 asmptr = skb_push(skb, NR_TRANSPORT_LEN);
1059 SOCK_DEBUG(sk, "Building NET/ROM Header.\n");
1061 /* Build a NET/ROM Transport header */
1063 *asmptr++ = sk->protinfo.nr->your_index;
1064 *asmptr++ = sk->protinfo.nr->your_id;
1065 *asmptr++ = 0; /* To be filled in later */
1066 *asmptr++ = 0; /* Ditto */
1067 *asmptr++ = NR_INFO;
1068 SOCK_DEBUG(sk, "Built header.\n");
1071 * Put the data on the end
1074 skb->h.raw = skb_put(skb, len);
1076 asmptr = skb->h.raw;
1077 SOCK_DEBUG(sk, "NET/ROM: Appending user data\n");
1079 /* User data follows immediately after the NET/ROM transport header */
1080 memcpy_fromiovec(asmptr, msg->msg_iov, len);
1081 SOCK_DEBUG(sk, "NET/ROM: Transmitting buffer\n");
1083 if (sk->state != TCP_ESTABLISHED) {
1088 nr_output(sk, skb); /* Shove it onto the queue */
1093 static int nr_recvmsg(struct socket *sock, struct msghdr *msg, int size,
1094 int flags, struct scm_cookie *scm)
1096 struct sock *sk = sock->sk;
1097 struct sockaddr_ax25 *sax = (struct sockaddr_ax25 *)msg->msg_name;
1099 struct sk_buff *skb;
1103 * This works for seqpacket too. The receiver has ordered the queue for
1104 * us! We do one quick check first though
1107 if (sk->state != TCP_ESTABLISHED)
1110 /* Now we can treat all alike */
1111 if ((skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT, flags & MSG_DONTWAIT, &er)) == NULL)
1114 skb->h.raw = skb->data;
1117 if (copied > size) {
1119 msg->msg_flags |= MSG_TRUNC;
1122 skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
1125 sax->sax25_family = AF_NETROM;
1126 memcpy(sax->sax25_call.ax25_call, skb->data + 7, AX25_ADDR_LEN);
1129 msg->msg_namelen = sizeof(*sax);
1131 skb_free_datagram(sk, skb);
1137 static int nr_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
1139 struct sock *sk = sock->sk;
1144 amount = sk->sndbuf - atomic_read(&sk->wmem_alloc);
1147 return put_user(amount, (int *)arg);
1151 struct sk_buff *skb;
1153 /* These two are safe on a single CPU system as only user tasks fiddle here */
1154 if ((skb = skb_peek(&sk->receive_queue)) != NULL)
1156 return put_user(amount, (int *)arg);
1161 if (sk->stamp.tv_sec == 0)
1163 return copy_to_user((void *)arg, &sk->stamp, sizeof(struct timeval)) ? -EFAULT : 0;
1169 case SIOCGIFDSTADDR:
1170 case SIOCSIFDSTADDR:
1171 case SIOCGIFBRDADDR:
1172 case SIOCSIFBRDADDR:
1173 case SIOCGIFNETMASK:
1174 case SIOCSIFNETMASK:
1182 if (!capable(CAP_NET_ADMIN)) return -EPERM;
1183 return nr_rt_ioctl(cmd, (void *)arg);
1186 return dev_ioctl(cmd, (void *)arg);
1193 static int nr_get_info(char *buffer, char **start, off_t offset, int length)
1196 struct net_device *dev;
1197 const char *devname;
1204 len += sprintf(buffer, "user_addr dest_node src_node dev my your st vs vr va t1 t2 t4 idle n2 wnd Snd-Q Rcv-Q inode\n");
1206 for (s = nr_list; s != NULL; s = s->next) {
1207 if ((dev = s->protinfo.nr->device) == NULL)
1210 devname = dev->name;
1212 len += sprintf(buffer + len, "%-9s ",
1213 ax2asc(&s->protinfo.nr->user_addr));
1214 len += sprintf(buffer + len, "%-9s ",
1215 ax2asc(&s->protinfo.nr->dest_addr));
1216 len += sprintf(buffer + len, "%-9s %-3s %02X/%02X %02X/%02X %2d %3d %3d %3d %3lu/%03lu %2lu/%02lu %3lu/%03lu %3lu/%03lu %2d/%02d %3d %5d %5d %ld\n",
1217 ax2asc(&s->protinfo.nr->source_addr),
1219 s->protinfo.nr->my_index,
1220 s->protinfo.nr->my_id,
1221 s->protinfo.nr->your_index,
1222 s->protinfo.nr->your_id,
1223 s->protinfo.nr->state,
1227 ax25_display_timer(&s->protinfo.nr->t1timer) / HZ,
1228 s->protinfo.nr->t1 / HZ,
1229 ax25_display_timer(&s->protinfo.nr->t2timer) / HZ,
1230 s->protinfo.nr->t2 / HZ,
1231 ax25_display_timer(&s->protinfo.nr->t4timer) / HZ,
1232 s->protinfo.nr->t4 / HZ,
1233 ax25_display_timer(&s->protinfo.nr->idletimer) / (60 * HZ),
1234 s->protinfo.nr->idle / (60 * HZ),
1235 s->protinfo.nr->n2count,
1237 s->protinfo.nr->window,
1238 atomic_read(&s->wmem_alloc),
1239 atomic_read(&s->rmem_alloc),
1240 s->socket != NULL ? s->socket->inode->i_ino : 0L);
1249 if (pos > offset + length)
1255 *start = buffer + (offset - begin);
1256 len -= (offset - begin);
1258 if (len > length) len = length;
1263 static struct net_proto_family nr_family_ops = {
1268 static struct proto_ops SOCKOPS_WRAPPED(nr_proto_ops) = {
1271 release: nr_release,
1273 connect: nr_connect,
1274 socketpair: sock_no_socketpair,
1276 getname: nr_getname,
1277 poll: datagram_poll,
1280 shutdown: sock_no_shutdown,
1281 setsockopt: nr_setsockopt,
1282 getsockopt: nr_getsockopt,
1283 sendmsg: nr_sendmsg,
1284 recvmsg: nr_recvmsg,
1286 sendpage: sock_no_sendpage,
1289 #include <linux/smp_lock.h>
1290 SOCKOPS_WRAP(nr_proto, PF_NETROM);
1292 static struct notifier_block nr_dev_notifier = {
1293 notifier_call: nr_device_event,
1296 static struct net_device *dev_nr;
1298 static char banner[] __initdata = KERN_INFO "G4KLX NET/ROM for Linux. Version 0.7 for AX25.037 Linux 2.4\n";
1300 static int __init nr_proto_init(void)
1304 if (nr_ndevs > 0x7fffffff/sizeof(struct net_device)) {
1305 printk(KERN_ERR "NET/ROM: nr_proto_init - nr_ndevs parameter to large\n");
1309 if ((dev_nr = kmalloc(nr_ndevs * sizeof(struct net_device), GFP_KERNEL)) == NULL) {
1310 printk(KERN_ERR "NET/ROM: nr_proto_init - unable to allocate device structure\n");
1314 memset(dev_nr, 0x00, nr_ndevs * sizeof(struct net_device));
1316 for (i = 0; i < nr_ndevs; i++) {
1317 sprintf(dev_nr[i].name, "nr%d", i);
1318 dev_nr[i].init = nr_init;
1319 register_netdev(&dev_nr[i]);
1322 sock_register(&nr_family_ops);
1323 register_netdevice_notifier(&nr_dev_notifier);
1326 ax25_protocol_register(AX25_P_NETROM, nr_route_frame);
1327 ax25_linkfail_register(nr_link_failed);
1329 #ifdef CONFIG_SYSCTL
1330 nr_register_sysctl();
1335 proc_net_create("nr", 0, nr_get_info);
1336 proc_net_create("nr_neigh", 0, nr_neigh_get_info);
1337 proc_net_create("nr_nodes", 0, nr_nodes_get_info);
1341 module_init(nr_proto_init);
1346 MODULE_PARM(nr_ndevs, "i");
1347 MODULE_PARM_DESC(nr_ndevs, "number of NET/ROM devices");
1349 MODULE_AUTHOR("Jonathan Naylor G4KLX <g4klx@g4klx.demon.co.uk>");
1350 MODULE_DESCRIPTION("The amateur radio NET/ROM network and transport layer protocol");
1351 MODULE_LICENSE("GPL");
1353 static void __exit nr_exit(void)
1357 proc_net_remove("nr");
1358 proc_net_remove("nr_neigh");
1359 proc_net_remove("nr_nodes");
1360 nr_loopback_clear();
1364 ax25_protocol_release(AX25_P_NETROM);
1365 ax25_linkfail_release(nr_link_failed);
1367 unregister_netdevice_notifier(&nr_dev_notifier);
1369 #ifdef CONFIG_SYSCTL
1370 nr_unregister_sysctl();
1372 sock_unregister(PF_NETROM);
1374 for (i = 0; i < nr_ndevs; i++) {
1375 if (dev_nr[i].priv != NULL) {
1376 kfree(dev_nr[i].priv);
1377 dev_nr[i].priv = NULL;
1378 unregister_netdev(&dev_nr[i]);
1384 module_exit(nr_exit);