[PATCH] Add a number of protocols to __SOCKADDR_ALLTYPES
__SOCKADDR_ALLTYPES is lacking a number of sockaddr_* variants so those can't be passed to syscalls such as bind, sendto, recvfrom oder getsockname or a warning or build error such as beacon.c: In function ‘main’: beacon.c:188:15: error: incompatible type for argument 2 of ‘bind’ if (bind(s, , len) == -1) { will hit. Adding a number of sockaddr_* fixes these problems. 2017-08-03 Ralf Baechle <r...@linux-mips.org> * socket/sys/socket.h (__SOCKADDR_ALLTYPES.): Add full_sockaddr_ax25 , sockaddr_ll, sockaddr_pkt and sockaddr_rose. --- socket/sys/socket.h | 4 1 file changed, 4 insertions(+) diff --git a/socket/sys/socket.h b/socket/sys/socket.h index bbfde8f602..061f457993 100644 --- a/socket/sys/socket.h +++ b/socket/sys/socket.h @@ -61,6 +61,7 @@ enum /* Add more `struct sockaddr_AF' types here as necessary. These are all the ones I found on NetBSD and Linux. */ # define __SOCKADDR_ALLTYPES \ + __SOCKADDR_ONETYPE (full_sockaddr_ax25) \ __SOCKADDR_ONETYPE (sockaddr) \ __SOCKADDR_ONETYPE (sockaddr_at) \ __SOCKADDR_ONETYPE (sockaddr_ax25) \ @@ -71,7 +72,10 @@ enum __SOCKADDR_ONETYPE (sockaddr_inarp) \ __SOCKADDR_ONETYPE (sockaddr_ipx) \ __SOCKADDR_ONETYPE (sockaddr_iso) \ + __SOCKADDR_ONETYPE (sockaddr_ll) \ __SOCKADDR_ONETYPE (sockaddr_ns) \ + __SOCKADDR_ONETYPE (sockaddr_pkt) \ + __SOCKADDR_ONETYPE (sockaddr_rose) \ __SOCKADDR_ONETYPE (sockaddr_un) \ __SOCKADDR_ONETYPE (sockaddr_x25) -- To unsubscribe from this list: send the line "unsubscribe linux-hams" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [BUG] AX.25 sockets not destroyed
On Thu, Feb 23, 2017 at 02:53:36PM +0100, f6bvp wrote: > 8c80b5ed5800 ax0 F6BVP-7 F4BWT-9 1 0 0 0 18446744073709549 100 0 3 0 300 > 0 0 9 10 5 2 256 * * * > 8c80b5ed5400 ax0 F6BVP-7 WA3MEZ-9 1 0 0 0 18446744073709549 100 0 3 0 300 > 0 0 9 10 5 2 256 * * * > then it displays a very large number for a while, The large number is an already expired t1 timer. That means the time to expiry is relativly small negative number like -1616 or as a hex number 0xf9b0 which will be divied by HZ (probably 1000) and displayed as a something like 18446744073709550. Looking further into it. Ralf -- To unsubscribe from this list: send the line "unsubscribe linux-hams" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH] NET: Fix /proc/net/arp for AX.25
When sending ARP requests over AX.25 links the hwaddress in the neighbour cache are not getting initialized. For such an incomplete arp entry ax2asc2 will generate an empty string resulting in /proc/net/arp output like the following: $ cat /proc/net/arp IP address HW type Flags HW addressMask Device 192.168.122.10x1 0x2 52:54:00:00:5d:5f *ens3 172.20.1.99 0x3 0x0 *bpq0 The missing field will confuse the procfs parsing of arp(8) resulting in incorrect output for the device such as the following: $ arp Address HWtype HWaddress Flags MaskIface gateway ether 52:54:00:00:5d:5f C ens3 172.20.1.99 (incomplete) ens3 This changes the content of /proc/net/arp to: $ cat /proc/net/arp IP address HW type Flags HW addressMask Device 172.20.1.99 0x3 0x0 * *bpq0 192.168.122.10x1 0x2 52:54:00:00:5d:5f *ens3 To do so it change ax2asc to put the string "*" in buf for a NULL address argument. Finally the HW address field is left aligned in a 17 character field (the length of an ethernet HW address in the usual hex notation) for readability. Signed-off-by: Ralf Baechle <r...@linux-mips.org> --- net/ipv4/arp.c | 12 ++-- 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c index 89a8cac4..51b27ae 100644 --- a/net/ipv4/arp.c +++ b/net/ipv4/arp.c @@ -1263,7 +1263,7 @@ void __init arp_init(void) /* * ax25 -> ASCII conversion */ -static char *ax2asc2(ax25_address *a, char *buf) +static void ax2asc2(ax25_address *a, char *buf) { char c, *s; int n; @@ -1285,10 +1285,10 @@ static char *ax2asc2(ax25_address *a, char *buf) *s++ = n + '0'; *s++ = '\0'; - if (*buf == '\0' || *buf == '-') - return "*"; - - return buf; + if (*buf == '\0' || *buf == '-') { + buf[0] = '*'; + buf[1] = '\0'; + } } #endif /* CONFIG_AX25 */ @@ -1322,7 +1322,7 @@ static void arp_format_neigh_entry(struct seq_file *seq, } #endif sprintf(tbuf, "%pI4", n->primary_key); - seq_printf(seq, "%-16s 0x%-10x0x%-10x%s *%s\n", + seq_printf(seq, "%-16s 0x%-10x0x%-10x%-17s *%s\n", tbuf, hatype, arp_state_to_flags(n), hbuffer, dev->name); read_unlock(>lock); } -- To unsubscribe from this list: send the line "unsubscribe linux-hams" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: AX.25 Kernel - problem - ax25_sendmsg returns EMSGSIZE !
On Sun, Oct 07, 2007 at 09:58:06PM +0200, Tihomir Heidelberg - 9a4gl wrote: Using kernel 2.6.21.6 here. If you write to AX.25 socket bytes more then MTU, write will return -1 and errno will be set to 90 (EMSGSIZE = [Message too long]). This happend in net/ax25/af_ax25.c in function ax25_sendmsg at: if (len ax25-ax25_dev-dev-mtu) { err = -EMSGSIZE; goto out; } This is a Linux 2.6.2 change, I append the patch which introduced the change below. I'm cc'ing Stephen Hemminger who hopefully recalls why his patch did introduce this change. (git users: commit id is 89aeba7545d7a2947e2f8f5fdee70f841c14 which is only available in tglx's history tree on kernel.org) Old kernels, 2.2.x and 2.4.x accepted write with data length larger then MTU and for SOCK_SEQPACKET sockets the ax25_output function did the fragmentation job. According to man 2 write, write should return number of bytes written. I think that: 1. ax25_sendmsg should accept data larger then mtu and pass the data to ax25_output. 2. ax25_output should do fragmentation and queue frames into device queue. 3. ax25_output should stop fragmenting when device queue is full 4. ax25_output should return number of bytes queued on device 5. ax25_sendmsg should return number of bytes accepted for xmiting Agreed. Also, as I see, currently ax25 stack is not checking if dev_queue_xmit fails. Does this means that AX.25 kernel can loose some frames when device queue is full ? Yes. This isn't a bug - packet delivery is unreliable. But what I'd really like to see is the AX.25 stack to throttle itself instead of continuing to stuff packets into an overflowing queue. By the way, this problem is having OpenBCM V1.07b3, very popular BBS software (http://dnx274.dyndns.org/baybox/) which writes as much data as it prepared. 73 de Tihomir Heidelberg, 9a4gl(_a_t_)hamradio(d_o_t)hr 73 de DL5RB op Ralf -- Loc.JN47BS / CQ 14 / ITU 28 / DOK A21 Packet: [EMAIL PROTECTED] From 89aeba7545d7a2947e2f8f5fdee70f841c14 Mon Sep 17 00:00:00 2001 From: Stephen Hemminger [EMAIL PROTECTED] Date: Thu, 8 Jan 2004 09:53:15 -0800 Subject: [PATCH] [AX25]: Use size_t for size in {send,recv}msg. diff --git a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c index 4fb1519..43472c6 100644 --- a/net/ax25/af_ax25.c +++ b/net/ax25/af_ax25.c @@ -1401,7 +1401,7 @@ out: } static int ax25_sendmsg(struct kiocb *iocb, struct socket *sock, - struct msghdr *msg, int len) + struct msghdr *msg, size_t len) { struct sockaddr_ax25 *usax = (struct sockaddr_ax25 *)msg-msg_name; struct sock *sk = sock-sk; @@ -1410,7 +1410,8 @@ static int ax25_sendmsg(struct kiocb *iocb, struct socket *sock, ax25_digi dtmp, *dp; unsigned char *asmptr; ax25_cb *ax25; - int lv, size, err, addr_len = msg-msg_namelen; + size_t size; + int lv, err, addr_len = msg-msg_namelen; if (msg-msg_flags ~(MSG_DONTWAIT|MSG_EOR)) { return -EINVAL; @@ -1435,6 +1436,11 @@ static int ax25_sendmsg(struct kiocb *iocb, struct socket *sock, goto out; } + if (len ax25-ax25_dev-dev-mtu) { + err = -EMSGSIZE; + goto out; + } + if (usax != NULL) { if (usax-sax25_family != AF_AX25) { err = -EINVAL; @@ -1580,7 +1586,7 @@ out: } static int ax25_recvmsg(struct kiocb *iocb, struct socket *sock, - struct msghdr *msg, int size, int flags) + struct msghdr *msg, size_t size, int flags) { struct sock *sk = sock-sk; struct sk_buff *skb; - To unsubscribe from this list: send the line unsubscribe linux-hams in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: AX25 tools and packages
On Thu, Aug 02, 2007 at 11:24:51AM +1000, Hamish Moffatt wrote: I'm using the latest patches from Debian since that seemed to be the latest I could find. Because my current builds are targeted at a 2.4 series kernel in an embedded system they work with a few small patches but I'm planning on switching to 2.6 as soon as possible. There appears to be a misconception that 2.6 requires new tools. Notice that Ralf said newer Linux distributions (meaning newer libc, gcc etc) rather than newer kernels. Correct. Binary compatibility across kernels is one of the holy grails in Linux and AX.25 is not exception to that. Unfortunately that's a little different for source code of the tools which at times may need a little update to compile on a more recent system. 73 de DL5RB op Ralf -- Loc.JN47BS / CQ 14 / ITU 28 / DOK A21 Packet: [EMAIL PROTECTED] - To unsubscribe from this list: send the line unsubscribe linux-hams in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: AX25 tools and packages
On Thu, Jul 26, 2007 at 05:23:32PM +, Bill Vodall WA7NWP wrote: Is sourceforge still the primary repository for the ax25 library and tools? Actually DL9SAU and me have moved the development away to another machine a while ago when Sourceforge was basically unusable for weeks. The new site is {cvs,www,ftp}.linux-ax25.org. Thomas DL9SAU has done various improvments and plenty of bugfixing as necessary to keep the tools in shape for newer Linux distributions, but what we haven't done yet and what is really overdue is a formal release. 73 de DL5RB op Ralf -- Loc.JN47BS / CQ 14 / ITU 28 / DOK A21 Packet: [EMAIL PROTECTED] - To unsubscribe from this list: send the line unsubscribe linux-hams in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH] baycom_ser_fdx: also allow i/o ports = 0x1000 and enhanced failure logging
On Mon, Mar 05, 2007 at 02:45:09PM +0100, Thomas Sailer wrote: The baycom modem really doesn't have anything to do with RS232, it just uses the RS232 port as a PIO port + timer. That's why it needs its own 16550 driver. A few people asked me if it is possible to drive one of those RS232 abusing modems through a USB-to-RS232 converter but I guess the answer is no? 73 de DL5RB op Ralf -- Loc.JN47BS / CQ 14 / ITU 28 / DOK A21 Packet: [EMAIL PROTECTED] - To unsubscribe from this list: send the line unsubscribe linux-hams in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: multiple kiss ports
On Thu, Feb 15, 2007 at 12:03:06AM +1030, Stef Daniels VK5HSX wrote: P4 1.2Ghz Celeron MSI Motherboard 512MB RAM 40GB ATA Drive ttyS0 - 9600bd -MFJ 1270b (1200bd TNC) axport '2' ttyS1 - 4800bd - AEA PK232 (4800bd TNC) axport '3' Debian GNU\linux 3.1 (2.4.27 kernel) using: libax25-0.0.11, ax25-apps-0.0.6, aax25-tools-0.0.8, node-0.3.2, fbb7.04j The problem is after we run our ax25 script to call up modules, tnc into kiss and kissattach devices (which all work fine), upon connect using port '2' the tnc sta LED comes on and tnc hangs. We have tried the following: Different- Computers, Cables, TNC's, O\S's, kernel's, hardrive, P\Supply and Serial ports (PCI Serial Cards), to NO avail. Any ideas, help, comments greatfully and most appreciatedly received!! Did you try a 2.6 kernel also? The 2.4 mkiss driver usually works just fine but it's a fairly suspect piece of code anyway, so I've turned the KISS driver upside down for Linux 2.6. A no-no at the current state of the code are SMP or preemptible kernels. 73 de DL5RB op Ralf -- Loc.JN47BS / CQ 14 / ITU 28 / DOK A21 Packet: [EMAIL PROTECTED] - To unsubscribe from this list: send the line unsubscribe linux-hams in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
[AX.25 1/7] Mark all kmalloc users __must_check
The recent fix 0506d4068bad834aab1141b5dc5e748eb175c6b3 made obvious that error values were not being propagated through the AX.25 stack. To help with that this patch marks all kmalloc users in the AX.25, NETROM and ROSE stacks as __must_check. Signed-off-by: Ralf Baechle [EMAIL PROTECTED] include/net/ax25.h| 11 ++- include/net/rose.h|4 ++-- net/ax25/af_ax25.c|4 ++-- net/ax25/ax25_route.c |2 +- net/netrom/nr_route.c |8 +--- net/rose/rose_route.c |2 +- 6 files changed, 17 insertions(+), 14 deletions(-) Index: linux-net/include/net/ax25.h === --- linux-net.orig/include/net/ax25.h +++ linux-net/include/net/ax25.h @@ -277,7 +277,7 @@ struct sock *ax25_get_socket(ax25_addres extern ax25_cb *ax25_find_cb(ax25_address *, ax25_address *, ax25_digi *, struct net_device *); extern void ax25_send_to_raw(ax25_address *, struct sk_buff *, int); extern void ax25_destroy_socket(ax25_cb *); -extern ax25_cb *ax25_create_cb(void); +extern ax25_cb * __must_check ax25_create_cb(void); extern void ax25_fillin_cb(ax25_cb *, ax25_dev *); extern struct sock *ax25_make_new(struct sock *, struct ax25_dev *); @@ -333,11 +333,12 @@ extern void ax25_ds_t3timer_expiry(ax25_ extern void ax25_ds_idletimer_expiry(ax25_cb *); /* ax25_iface.c */ -extern int ax25_protocol_register(unsigned int, int (*)(struct sk_buff *, ax25_cb *)); +extern int __must_check ax25_protocol_register(unsigned int, int (*)(struct sk_buff *, ax25_cb *)); extern void ax25_protocol_release(unsigned int); -extern int ax25_linkfail_register(void (*)(ax25_cb *, int)); +extern int __must_check ax25_linkfail_register(void (*)(ax25_cb *, int)); extern void ax25_linkfail_release(void (*)(ax25_cb *, int)); -extern int ax25_listen_register(ax25_address *, struct net_device *); +extern int __must_check ax25_listen_register(ax25_address *, + struct net_device *); extern void ax25_listen_release(ax25_address *, struct net_device *); extern int (*ax25_protocol_function(unsigned int))(struct sk_buff *, ax25_cb *); extern int ax25_listen_mine(ax25_address *, struct net_device *); @@ -415,7 +416,7 @@ extern unsigned long ax25_display_timer( /* ax25_uid.c */ extern int ax25_uid_policy; extern ax25_uid_assoc *ax25_findbyuid(uid_t); -extern int ax25_uid_ioctl(int, struct sockaddr_ax25 *); +extern int __must_check ax25_uid_ioctl(int, struct sockaddr_ax25 *); extern struct file_operations ax25_uid_fops; extern void ax25_uid_free(void); Index: linux-net/include/net/rose.h === --- linux-net.orig/include/net/rose.h +++ linux-net/include/net/rose.h @@ -193,8 +193,8 @@ extern struct file_operations rose_neigh extern struct file_operations rose_nodes_fops; extern struct file_operations rose_routes_fops; -extern int rose_add_loopback_neigh(void); -extern int rose_add_loopback_node(rose_address *); +extern int __must_check rose_add_loopback_neigh(void); +extern int __must_check rose_add_loopback_node(rose_address *); extern void rose_del_loopback_node(rose_address *); extern void rose_rt_device_down(struct net_device *); extern void rose_link_device_down(struct net_device *); Index: linux-net/net/ax25/af_ax25.c === --- linux-net.orig/net/ax25/af_ax25.c +++ linux-net/net/ax25/af_ax25.c @@ -1088,8 +1088,8 @@ out: /* * FIXME: nonblock behaviour looks like it may have a bug. */ -static int ax25_connect(struct socket *sock, struct sockaddr *uaddr, - int addr_len, int flags) +static int __must_check ax25_connect(struct socket *sock, + struct sockaddr *uaddr, int addr_len, int flags) { struct sock *sk = sock-sk; ax25_cb *ax25 = ax25_sk(sk), *ax25t; Index: linux-net/net/ax25/ax25_route.c === --- linux-net.orig/net/ax25/ax25_route.c +++ linux-net/net/ax25/ax25_route.c @@ -71,7 +71,7 @@ void ax25_rt_device_down(struct net_devi write_unlock(ax25_route_lock); } -static int ax25_rt_add(struct ax25_routes_struct *route) +static int __must_check ax25_rt_add(struct ax25_routes_struct *route) { ax25_route *ax25_rt; ax25_dev *ax25_dev; Index: linux-net/net/rose/rose_route.c === --- linux-net.orig/net/rose/rose_route.c +++ linux-net/net/rose/rose_route.c @@ -52,7 +52,7 @@ struct rose_neigh *rose_loopback_neigh; * Add a new route to a node, and in the process add the node and the * neighbour if it is new. */ -static int rose_add_node(struct rose_route_struct *rose_route, +static int __must_check rose_add_node(struct rose_route_struct *rose_route, struct net_device *dev) { struct rose_node *rose_node, *rose_tmpn, *rose_tmpp; Index: linux-net/net/netrom/nr_route.c
[AX.25 7/7] Fix unchecked rose_add_loopback_neigh uses
rose_add_loopback_neigh uses kmalloc and the callers were ignoring the error value. Rewrite to let the caller deal with the allocation. This allows the use of static allocation of kmalloc use entirely. Signed-off-by: Ralf Baechle [EMAIL PROTECTED] include/net/rose.h |4 ++-- net/rose/rose_loopback.c |5 +++-- net/rose/rose_route.c| 45 + 3 files changed, 26 insertions(+), 28 deletions(-) Index: linux-net/include/net/rose.h === --- linux-net.orig/include/net/rose.h +++ linux-net/include/net/rose.h @@ -188,12 +188,12 @@ extern void rose_kick(struct sock *); extern void rose_enquiry_response(struct sock *); /* rose_route.c */ -extern struct rose_neigh *rose_loopback_neigh; +extern struct rose_neigh rose_loopback_neigh; extern struct file_operations rose_neigh_fops; extern struct file_operations rose_nodes_fops; extern struct file_operations rose_routes_fops; -extern int __must_check rose_add_loopback_neigh(void); +extern void rose_add_loopback_neigh(void); extern int __must_check rose_add_loopback_node(rose_address *); extern void rose_del_loopback_node(rose_address *); extern void rose_rt_device_down(struct net_device *); Index: linux-net/net/rose/rose_loopback.c === --- linux-net.orig/net/rose/rose_loopback.c +++ linux-net/net/rose/rose_loopback.c @@ -79,7 +79,8 @@ static void rose_loopback_timer(unsigned skb-h.raw = skb-data; - if ((sk = rose_find_socket(lci_o, rose_loopback_neigh)) != NULL) { + sk = rose_find_socket(lci_o, rose_loopback_neigh); + if (sk) { if (rose_process_rx_frame(sk, skb) == 0) kfree_skb(skb); continue; @@ -87,7 +88,7 @@ static void rose_loopback_timer(unsigned if (frametype == ROSE_CALL_REQUEST) { if ((dev = rose_dev_get(dest)) != NULL) { - if (rose_rx_call_request(skb, dev, rose_loopback_neigh, lci_o) == 0) + if (rose_rx_call_request(skb, dev, rose_loopback_neigh, lci_o) == 0) kfree_skb(skb); } else { kfree_skb(skb); Index: linux-net/net/rose/rose_route.c === --- linux-net.orig/net/rose/rose_route.c +++ linux-net/net/rose/rose_route.c @@ -46,7 +46,7 @@ static DEFINE_SPINLOCK(rose_neigh_list_l static struct rose_route *rose_route_list; static DEFINE_SPINLOCK(rose_route_list_lock); -struct rose_neigh *rose_loopback_neigh; +struct rose_neigh rose_loopback_neigh; /* * Add a new route to a node, and in the process add the node and the @@ -361,33 +361,30 @@ out: /* * Add the loopback neighbour. */ -int rose_add_loopback_neigh(void) +void rose_add_loopback_neigh(void) { - if ((rose_loopback_neigh = kmalloc(sizeof(struct rose_neigh), GFP_ATOMIC)) == NULL) - return -ENOMEM; + struct rose_neigh *sn = rose_loopback_neigh; - rose_loopback_neigh-callsign = null_ax25_address; - rose_loopback_neigh-digipeat = NULL; - rose_loopback_neigh-ax25 = NULL; - rose_loopback_neigh-dev = NULL; - rose_loopback_neigh-count = 0; - rose_loopback_neigh-use = 0; - rose_loopback_neigh-dce_mode = 1; - rose_loopback_neigh-loopback = 1; - rose_loopback_neigh-number= rose_neigh_no++; - rose_loopback_neigh-restarted = 1; + sn-callsign = null_ax25_address; + sn-digipeat = NULL; + sn-ax25 = NULL; + sn-dev = NULL; + sn-count = 0; + sn-use = 0; + sn-dce_mode = 1; + sn-loopback = 1; + sn-number= rose_neigh_no++; + sn-restarted = 1; - skb_queue_head_init(rose_loopback_neigh-queue); + skb_queue_head_init(sn-queue); - init_timer(rose_loopback_neigh-ftimer); - init_timer(rose_loopback_neigh-t0timer); + init_timer(sn-ftimer); + init_timer(sn-t0timer); spin_lock_bh(rose_neigh_list_lock); - rose_loopback_neigh-next = rose_neigh_list; - rose_neigh_list = rose_loopback_neigh; + sn-next = rose_neigh_list; + rose_neigh_list = sn; spin_unlock_bh(rose_neigh_list_lock); - - return 0; } /* @@ -421,13 +418,13 @@ int rose_add_loopback_node(rose_address rose_node-mask = 10; rose_node-count= 1; rose_node-loopback = 1; - rose_node-neighbour[0] = rose_loopback_neigh; + rose_node-neighbour[0] = rose_loopback_neigh; /* Insert at the head of list. Address is always mask=10 */ rose_node-next = rose_node_list; rose_node_list
[AX.25 5/7] Fix unchecked ax25_linkfail_register uses
ax25_linkfail_register uses kmalloc and the callers were ignoring the error value. Rewrite to let the caller deal with the allocation. This allows the use of static allocation of kmalloc use entirely. Signed-off-by: Ralf Baechle [EMAIL PROTECTED] include/net/ax25.h | 10 +++- net/ax25/ax25_iface.c | 55 - net/netrom/af_netrom.c |8 +-- net/rose/af_rose.c |8 +-- 4 files changed, 29 insertions(+), 52 deletions(-) Index: linux-net/include/net/ax25.h === --- linux-net.orig/include/net/ax25.h +++ linux-net/include/net/ax25.h @@ -342,8 +342,14 @@ struct ax25_protocol { extern void ax25_register_pid(struct ax25_protocol *ap); extern void ax25_protocol_release(unsigned int); -extern int __must_check ax25_linkfail_register(void (*)(ax25_cb *, int)); -extern void ax25_linkfail_release(void (*)(ax25_cb *, int)); + +struct ax25_linkfail { + struct hlist_node lf_node; + void (*func)(ax25_cb *, int); +}; + +extern void ax25_linkfail_register(struct ax25_linkfail *lf); +extern void ax25_linkfail_release(struct ax25_linkfail *lf); extern int __must_check ax25_listen_register(ax25_address *, struct net_device *); extern void ax25_listen_release(ax25_address *, struct net_device *); Index: linux-net/net/ax25/ax25_iface.c === --- linux-net.orig/net/ax25/ax25_iface.c +++ linux-net/net/ax25/ax25_iface.c @@ -32,10 +32,7 @@ static struct ax25_protocol *protocol_list; static DEFINE_RWLOCK(protocol_list_lock); -static struct linkfail_struct { - struct linkfail_struct *next; - void (*func)(ax25_cb *, int); -} *linkfail_list = NULL; +static HLIST_HEAD(ax25_linkfail_list); static DEFINE_SPINLOCK(linkfail_lock); static struct listen_struct { @@ -93,54 +90,19 @@ void ax25_protocol_release(unsigned int EXPORT_SYMBOL(ax25_protocol_release); -int ax25_linkfail_register(void (*func)(ax25_cb *, int)) +void ax25_linkfail_register(struct ax25_linkfail *lf) { - struct linkfail_struct *linkfail; - - if ((linkfail = kmalloc(sizeof(*linkfail), GFP_ATOMIC)) == NULL) - return 0; - - linkfail-func = func; - spin_lock_bh(linkfail_lock); - linkfail-next = linkfail_list; - linkfail_list = linkfail; + hlist_add_head(lf-lf_node, ax25_linkfail_list); spin_unlock_bh(linkfail_lock); - - return 1; } EXPORT_SYMBOL(ax25_linkfail_register); -void ax25_linkfail_release(void (*func)(ax25_cb *, int)) +void ax25_linkfail_release(struct ax25_linkfail *lf) { - struct linkfail_struct *s, *linkfail; - spin_lock_bh(linkfail_lock); - linkfail = linkfail_list; - if (linkfail == NULL) { - spin_unlock_bh(linkfail_lock); - return; - } - - if (linkfail-func == func) { - linkfail_list = linkfail-next; - spin_unlock_bh(linkfail_lock); - kfree(linkfail); - return; - } - - while (linkfail != NULL linkfail-next != NULL) { - if (linkfail-next-func == func) { - s = linkfail-next; - linkfail-next = linkfail-next-next; - spin_unlock_bh(linkfail_lock); - kfree(s); - return; - } - - linkfail = linkfail-next; - } + hlist_del_init(lf-lf_node); spin_unlock_bh(linkfail_lock); } @@ -237,11 +199,12 @@ int (*ax25_protocol_function(unsigned in void ax25_link_failed(ax25_cb *ax25, int reason) { - struct linkfail_struct *linkfail; + struct ax25_linkfail *lf; + struct hlist_node *node; spin_lock_bh(linkfail_lock); - for (linkfail = linkfail_list; linkfail != NULL; linkfail = linkfail-next) - (linkfail-func)(ax25, reason); + hlist_for_each_entry(lf, node, ax25_linkfail_list, lf_node) + lf-func(ax25, reason); spin_unlock_bh(linkfail_lock); } Index: linux-net/net/netrom/af_netrom.c === --- linux-net.orig/net/netrom/af_netrom.c +++ linux-net/net/netrom/af_netrom.c @@ -1382,6 +1382,10 @@ static struct ax25_protocol nr_pid = { .func = nr_route_frame }; +static struct ax25_linkfail nr_linkfail_notifier = { + .func = nr_link_failed, +}; + static int __init nr_proto_init(void) { int i; @@ -1430,7 +1434,7 @@ static int __init nr_proto_init(void) register_netdevice_notifier(nr_dev_notifier); ax25_register_pid(nr_pid); - ax25_linkfail_register(nr_link_failed); + ax25_linkfail_register(nr_linkfail_notifier); #ifdef CONFIG_SYSCTL nr_register_sysctl(); @@ -1479,7 +1483,7 @@ static void __exit nr_exit(void) nr_unregister_sysctl(); #endif
[AX.25 3/7] Fix unchecked ax25_listen_register uses
Fix ax25_listen_register to return something that's a sane error code, then all callers to use it. Signed-off-by: Ralf Baechle [EMAIL PROTECTED] net/ax25/ax25_iface.c |7 --- net/netrom/nr_dev.c | 24 ++-- net/rose/af_rose.c|3 ++- 3 files changed, 24 insertions(+), 10 deletions(-) Index: linux-net/net/ax25/ax25_iface.c === --- linux-net.orig/net/ax25/ax25_iface.c +++ linux-net/net/ax25/ax25_iface.c @@ -154,7 +154,7 @@ int ax25_listen_register(ax25_address *c return 0; if ((listen = kmalloc(sizeof(*listen), GFP_ATOMIC)) == NULL) - return 0; + return -ENOMEM; listen-callsign = *callsign; listen-dev = dev; @@ -164,7 +164,7 @@ int ax25_listen_register(ax25_address *c listen_list = listen; spin_unlock_bh(listen_lock); - return 1; + return 0; } EXPORT_SYMBOL(ax25_listen_register); @@ -225,7 +225,8 @@ int ax25_listen_mine(ax25_address *calls spin_lock_bh(listen_lock); for (listen = listen_list; listen != NULL; listen = listen-next) - if (ax25cmp(listen-callsign, callsign) == 0 (listen-dev == dev || listen-dev == NULL)) { + if (ax25cmp(listen-callsign, callsign) == 0 + (listen-dev == dev || listen-dev == NULL)) { spin_unlock_bh(listen_lock); return 1; } Index: linux-net/net/netrom/nr_dev.c === --- linux-net.orig/net/netrom/nr_dev.c +++ linux-net/net/netrom/nr_dev.c @@ -128,25 +128,37 @@ static int nr_header(struct sk_buff *skb return -37; } -static int nr_set_mac_address(struct net_device *dev, void *addr) +static int __must_check nr_set_mac_address(struct net_device *dev, void *addr) { struct sockaddr *sa = addr; + int err; + + if (!memcmp(dev-dev_addr, sa-sa_data, dev-addr_len)) + return 0; + + if (dev-flags IFF_UP) { + err = ax25_listen_register((ax25_address *)sa-sa_data, NULL); + if (err) + return err; - if (dev-flags IFF_UP) ax25_listen_release((ax25_address *)dev-dev_addr, NULL); + } memcpy(dev-dev_addr, sa-sa_data, dev-addr_len); - if (dev-flags IFF_UP) - ax25_listen_register((ax25_address *)dev-dev_addr, NULL); - return 0; } static int nr_open(struct net_device *dev) { + int err; + + err = ax25_listen_register((ax25_address *)dev-dev_addr, NULL); + if (err) + return err; + netif_start_queue(dev); - ax25_listen_register((ax25_address *)dev-dev_addr, NULL); + return 0; } Index: linux-net/net/rose/af_rose.c === --- linux-net.orig/net/rose/af_rose.c +++ linux-net/net/rose/af_rose.c @@ -1314,7 +1314,8 @@ static int rose_ioctl(struct socket *soc if (copy_from_user(rose_callsign, argp, sizeof(ax25_address))) return -EFAULT; if (ax25cmp(rose_callsign, null_ax25_address) != 0) - ax25_listen_register(rose_callsign, NULL); + return ax25_listen_register(rose_callsign, NULL); + return 0; case SIOCRSGL2CALL: - To unsubscribe from this list: send the line unsubscribe linux-hams in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: Something about timers
On Fri, Sep 09, 2005 at 08:34:51AM +0300, jarmo wrote: Just noticed, that if you compile kernel without looking, Prosessor type and features - Timer frequency, default is 250ms, you get quite suprising behaviour with your ax25 stuff, especially 6pack :) I'd say quite quick actions and in server case crashes :(. That mean you have both fbb and cluster running in same computer with 5 user ports. So when taking forinstance kernel 2.6.13 in use, select timer as 1000ms, then your normal ax25 timers should work. Time in AX.25, NET/ROM and ROSE is still being meassured in units of timer ticks which has not only changed going from 2.4 to 2.6; it's also differing between architectures. I've recently sent out a set of three patches to standardize that on ms. That's probably a too small unit so I think I'm going to change that again before submitting to upstream. Any crashes you may see are certainly unrelated to this. 73 de DL5RB op Ralf -- Loc. JN47BS / CQ 14 / ITU 28 / DOK A21 - To unsubscribe from this list: send the line unsubscribe linux-hams in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
[AX.25] Make asc2ax thread-proof
Asc2ax was still using a static buffer for all invocations which isn't exactly SMP-safe. Change asc2ax to take an additional result buffer as the argument. Change all callers to provide such a buffer. This one only really is a fix for ROSE and as per recent discussions there's still much more to fix in ROSE ... Signed-off-by: Ralf Baechle DL5RB [EMAIL PROTECTED] include/net/ax25.h |2 +- net/ax25/ax25_addr.c | 27 --- net/rose/rose_subr.c |4 ++-- 3 files changed, 15 insertions(+), 18 deletions(-) Index: linux-cvs/include/net/ax25.h === --- linux-cvs.orig/include/net/ax25.h +++ linux-cvs/include/net/ax25.h @@ -279,7 +279,7 @@ extern struct sock *ax25_make_new(struct /* ax25_addr.c */ extern ax25_address null_ax25_address; extern char *ax2asc(char *buf, ax25_address *); -extern ax25_address *asc2ax(char *); +extern void asc2ax(ax25_address *addr, char *callsign); extern int ax25cmp(ax25_address *, ax25_address *); extern int ax25digicmp(ax25_digi *, ax25_digi *); extern unsigned char *ax25_addr_parse(unsigned char *, int, ax25_address *, ax25_address *, ax25_digi *, int *, int *); Index: linux-cvs/net/ax25/ax25_addr.c === --- linux-cvs.orig/net/ax25/ax25_addr.c +++ linux-cvs/net/ax25/ax25_addr.c @@ -67,37 +67,34 @@ char *ax2asc(char *buf, ax25_address *a) /* * ascii - ax25 conversion */ -ax25_address *asc2ax(char *callsign) +void asc2ax(ax25_address *addr, char *callsign) { - static ax25_address addr; char *s; int n; for (s = callsign, n = 0; n 6; n++) { if (*s != '\0' *s != '-') - addr.ax25_call[n] = *s++; + addr-ax25_call[n] = *s++; else - addr.ax25_call[n] = ' '; - addr.ax25_call[n] = 1; - addr.ax25_call[n] = 0xFE; + addr-ax25_call[n] = ' '; + addr-ax25_call[n] = 1; + addr-ax25_call[n] = 0xFE; } if (*s++ == '\0') { - addr.ax25_call[6] = 0x00; - return addr; + addr-ax25_call[6] = 0x00; + return; } - addr.ax25_call[6] = *s++ - '0'; + addr-ax25_call[6] = *s++ - '0'; if (*s != '\0') { - addr.ax25_call[6] *= 10; - addr.ax25_call[6] += *s++ - '0'; + addr-ax25_call[6] *= 10; + addr-ax25_call[6] += *s++ - '0'; } - addr.ax25_call[6] = 1; - addr.ax25_call[6] = 0x1E; - - return addr; + addr-ax25_call[6] = 1; + addr-ax25_call[6] = 0x1E; } /* Index: linux-cvs/net/rose/rose_subr.c === --- linux-cvs.orig/net/rose/rose_subr.c +++ linux-cvs/net/rose/rose_subr.c @@ -337,13 +337,13 @@ static int rose_parse_ccitt(unsigned cha memcpy(facilities-source_addr, p + 7, ROSE_ADDR_LEN); memcpy(callsign, p + 12, l - 10); callsign[l - 10] = '\0'; - facilities-source_call = *asc2ax(callsign); + asc2ax(facilities-source_call, callsign); } if (*p == FAC_CCITT_SRC_NSAP) { memcpy(facilities-dest_addr, p + 7, ROSE_ADDR_LEN); memcpy(callsign, p + 12, l - 10); callsign[l - 10] = '\0'; - facilities-dest_call = *asc2ax(callsign); + asc2ax(facilities-dest_call, callsign); } p += l + 2; n += l + 2; - To unsubscribe from this list: send the line unsubscribe linux-hams in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
[AX.25] Make ax2asc thread-proof
Ax2asc was still using a static buffer for all invocations which isn't exactly SMP-safe. Change ax2asc to take an additional result buffer as the argument. Change all callers to provide such a buffer. Signed-off-by: Ralf Baechle DL5RB [EMAIL PROTECTED] include/net/ax25.h |2 +- net/ax25/af_ax25.c |7 --- net/ax25/ax25_addr.c |3 +-- net/ax25/ax25_route.c |7 +-- net/ax25/ax25_uid.c|4 +++- net/netrom/af_netrom.c |7 --- net/netrom/nr_route.c |8 +--- net/rose/af_rose.c |6 -- net/rose/rose_route.c | 14 +- net/rose/rose_subr.c |5 +++-- 10 files changed, 39 insertions(+), 24 deletions(-) Index: linux-cvs/include/net/ax25.h === --- linux-cvs.orig/include/net/ax25.h +++ linux-cvs/include/net/ax25.h @@ -278,7 +278,7 @@ extern struct sock *ax25_make_new(struct /* ax25_addr.c */ extern ax25_address null_ax25_address; -extern char *ax2asc(ax25_address *); +extern char *ax2asc(char *buf, ax25_address *); extern ax25_address *asc2ax(char *); extern int ax25cmp(ax25_address *, ax25_address *); extern int ax25digicmp(ax25_digi *, ax25_digi *); Index: linux-cvs/net/ax25/af_ax25.c === --- linux-cvs.orig/net/ax25/af_ax25.c +++ linux-cvs/net/ax25/af_ax25.c @@ -1863,6 +1863,7 @@ static void ax25_info_stop(struct seq_fi static int ax25_info_show(struct seq_file *seq, void *v) { ax25_cb *ax25 = v; + char buf[11]; int k; @@ -1874,13 +1875,13 @@ static int ax25_info_show(struct seq_fil seq_printf(seq, %8.8lx %s %s%s , (long) ax25, ax25-ax25_dev == NULL? ??? : ax25-ax25_dev-dev-name, - ax2asc(ax25-source_addr), + ax2asc(buf, ax25-source_addr), ax25-iamdigi? *:); - seq_printf(seq, %s, ax2asc(ax25-dest_addr)); + seq_printf(seq, %s, ax2asc(buf, ax25-dest_addr)); for (k=0; (ax25-digipeat != NULL) (k ax25-digipeat-ndigi); k++) { seq_printf(seq, ,%s%s, - ax2asc(ax25-digipeat-calls[k]), + ax2asc(buf, ax25-digipeat-calls[k]), ax25-digipeat-repeated[k]? *:); } Index: linux-cvs/net/ax25/ax25_addr.c === --- linux-cvs.orig/net/ax25/ax25_addr.c +++ linux-cvs/net/ax25/ax25_addr.c @@ -36,9 +36,8 @@ ax25_address null_ax25_address = {{0x40, /* * ax25 - ascii conversion */ -char *ax2asc(ax25_address *a) +char *ax2asc(char *buf, ax25_address *a) { - static char buf[11]; char c, *s; int n; Index: linux-cvs/net/ax25/ax25_route.c === --- linux-cvs.orig/net/ax25/ax25_route.c +++ linux-cvs/net/ax25/ax25_route.c @@ -284,6 +284,8 @@ static void ax25_rt_seq_stop(struct seq_ static int ax25_rt_seq_show(struct seq_file *seq, void *v) { + char buf[11]; + if (v == SEQ_START_TOKEN) seq_puts(seq, callsign dev mode digipeaters\n); else { @@ -294,7 +296,7 @@ static int ax25_rt_seq_show(struct seq_f if (ax25cmp(ax25_rt-callsign, null_ax25_address) == 0) callsign = default; else - callsign = ax2asc(ax25_rt-callsign); + callsign = ax2asc(buf, ax25_rt-callsign); seq_printf(seq, %-9s %-4s, callsign, @@ -314,7 +316,8 @@ static int ax25_rt_seq_show(struct seq_f if (ax25_rt-digipeat != NULL) for (i = 0; i ax25_rt-digipeat-ndigi; i++) - seq_printf(seq, %s, ax2asc(ax25_rt-digipeat-calls[i])); + seq_printf(seq, %s, +ax2asc(buf, ax25_rt-digipeat-calls[i])); seq_puts(seq, \n); } Index: linux-cvs/net/ax25/ax25_uid.c === --- linux-cvs.orig/net/ax25/ax25_uid.c +++ linux-cvs/net/ax25/ax25_uid.c @@ -168,12 +168,14 @@ static void ax25_uid_seq_stop(struct seq static int ax25_uid_seq_show(struct seq_file *seq, void *v) { + char buf[11]; + if (v == SEQ_START_TOKEN) seq_printf(seq, Policy: %d\n, ax25_uid_policy); else { struct ax25_uid_assoc *pt = v; - seq_printf(seq, %6d %s\n, pt-uid, ax2asc(pt-call)); + seq_printf(seq, %6d %s\n, pt-uid, ax2asc(buf, pt-call)); } return 0; } Index: linux-cvs/net/netrom/af_netrom.c === --- linux-cvs.orig/net/netrom/af_netrom.c +++ linux-cvs/net/netrom/af_netrom.c @@ -1265,6 +1265,7 @@ static int nr_info_show(struct seq_file
Re: ax25-howto
On Sun, Sep 04, 2005 at 08:15:22AM -0400, Harold Hartley wrote: I must agree as I have found it talks in some places about files that are not relevent to most distro's now and in fact are very out of date. Now with the newer files such as the ax25-config, ax25-tools and ax25-apps, most of the how-to don't apply to the newer files and mainly applies the the old ax25-utils and such... I'm wondering if someone will evenually update the How-to in places that does need some update to, but not all the How-to needs updating. THe AX.25 and Ham Howtos are all horribly outdated - probably beyond recovery. I'm working on converting them into a wiki so everybody can start contributing. 73 de DL5RB op Ralf -- Loc. JN47BS / CQ 14 / ITU 28 / DOK A21 - To unsubscribe from this list: send the line unsubscribe linux-hams in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH] SMP fix for 6pack driver
On Sun, Aug 28, 2005 at 10:46:09PM +0200, Iñaki Arenaza wrote: You could try EB6EBU's m6pack which is an application level solution to the problem. Just a little correction. It's EB2EBU, not EB6EBU (otherwise Google will not find my patch against ax25-tools-0.0.8 ;-) Sorry :-) You can get it at: http://www.escomposlinux.org/iarenaza/hamradio/m6pack/files/ax25-tools-0.0.8-m6pack.diff.bz2 I'm still contemplating if this should preferably be done in userspace or in kernelspace ... Ralf - To unsubscribe from this list: send the line unsubscribe linux-hams in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: Ethereal ax25 monitoring
On Wed, Aug 31, 2005 at 10:46:34PM +0100, Richard Stearn wrote: An update on AX.25 in Ethereal. I have enquired on the Ethereal list and the attitude (sample of 1) is that if the protocol exists and is used then it will be accepted. Subject to a few pratical provisos. The deeper issue I have found is that Ethereal uses libpcap for the actual packet capture, and libpcap does not support AX.25 as a packet type. There appears to a replacement for libpcap in development within Ethereal however that is probably a long term project. So my next move is to see what the issues are with getting the AX.25 packet type added to libpcap. It looks to me that AX.25 on Ethereal is going to be a long time coming. Libpcap is also being used for example by tcpdump, so it's certainly very useful to have it ported anyway. 73 de DL5RB op Ralf -- Loc. JN47BS / CQ 14 / ITU 28 / DOK A21 - To unsubscribe from this list: send the line unsubscribe linux-hams in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH] SMP fix for 6pack driver
On Thu, Sep 01, 2005 at 07:47:46AM -0500, Chuck Hast wrote: http://www.escomposlinux.org/iarenaza/hamradio/m6pack/files/ax25-tools-0.0.8-m6pack.diff.bz2 I'm still contemplating if this should preferably be done in userspace or in kernelspace ... Is there anymore on making 6pack operate in multi-tnc mode as is done with the dos drivers? We certainly can use that, I wish I could work on it, but I fear I do not know enough to do anything there. See above URL. Ralf - To unsubscribe from this list: send the line unsubscribe linux-hams in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: Netdevice reference leak in af_ax25.c ??
On Thu, Sep 01, 2005 at 08:56:19PM +0200, Patrick McHardy wrote: I believe the SO_BINDTODEVICE case in net/ax25/af_x25.c (line 613 or so) leaks a reference to a net device. It does a dev_get_by_name, which holds a reference, but since it never assigns the pointer anywhere, I do not see how it can ever free it later. Please clue me in as to where it's released if it actually is. I can't find the code you're talking about, there's no dev_get* in my version of af_x25.c. Please paste the code you're talking about in your bugreports, thanks. Ben meant net/ax25/af_ax25. The dev value is stored in the ax25_cb indirectly after converting it to an ax25dev pointer and will be freed what that ax25_cb (which really is the protocol-specific part of the socket) is going to be closed. You poked my nose at a bug though - it is possible to leak references by performing multiple SO_BINDTODEVICE operations; we should either only permit the first one to succeed or to drop the reference of the old device in case of a repeated SO_BINDTODEVICE. After the weekend ... Ralf - To unsubscribe from this list: send the line unsubscribe linux-hams in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Another mkiss patch (was: Re: AX-25 software that works on Fedora Core 4?)
On Tue, Aug 23, 2005 at 09:17:02PM +0200, Jacques Chion wrote: If i do the command ifconfig, i have the interface sm0 with the HWaddr LINUX-1 instead of my callsign F6CWO. this can be corrected with the command ifconfig sm0 hw ax25 F6CWO up and all is working fine. I don't see from where is coming this LINUX-1. LINUX-1 is the driver's builtin default MAC address. I will search what is wrong on my box. Sure it's something stupid :) I did setup soundmodem myself last night and was able to reproduce the fault. The problem is being caused by soundmodem passng slightly different arguments to the failing ioctl than kissattach and the drivers strict sanity checks did reject that. I changed that and it's working now. Latest version attached below. This I hope is going to be the final version of this patch. 73 de DL5RB op Ralf -- Loc. JN47BS / CQ 14 / ITU 28 / DOK A21 Signed-off-by: Ralf Baechle DL5RB [EMAIL PROTECTED] drivers/net/hamradio/Kconfig |2 drivers/net/hamradio/mkiss.c | 1087 --- 2 files changed, 525 insertions(+), 564 deletions(-) Index: linux-cvs/drivers/net/hamradio/mkiss.c === --- linux-cvs.orig/drivers/net/hamradio/mkiss.c +++ linux-cvs/drivers/net/hamradio/mkiss.c @@ -1,30 +1,19 @@ /* - * MKISS Driver + * This program is free software; you can distribute it and/or modify it + * under the terms of the GNU General Public License (Version 2) as + * published by the Free Software Foundation. * - * This module: - * This module is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version - * 2 of the License, or (at your option) any later version. + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. * - * This module implements the AX.25 protocol for kernel-based - * devices like TTYs. It interfaces between a raw TTY, and the - * kernel's AX.25 protocol layers, just like slip.c. - * AX.25 needs to be separated from slip.c while slip.c is no - * longer a static kernel device since it is a module. - * This method clears the way to implement other kiss protocols - * like mkiss smack g8bpq . so far only mkiss is implemented. + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. * - * Hans Alblas [EMAIL PROTECTED] - * - * History - * Jonathan (G4KLX)Fixed to match Linux networking changes - 2.1.15. - * Matthias (DG2FEF) Added support for FlexNet CRC (on special request) - * Fixed bug in ax25_close(): dev_lock_wait() was - * called twice, causing a deadlock. - * Jeroen (PE1RXQ) Removed old MKISS_MAGIC stuff and calls to - * MOD_*_USE_COUNT - * Remove cli() and fix rtnl lock usage. + * Copyright (C) Hans Alblas PE1AYX [EMAIL PROTECTED] + * Copyright (C) 2004, 05 Ralf Baechle DL5RB [EMAIL PROTECTED] */ #include linux/config.h @@ -49,174 +38,296 @@ #include net/ax25.h -#include mkiss.h - #ifdef CONFIG_INET #include linux/ip.h #include linux/tcp.h #endif -static char banner[] __initdata = KERN_INFO mkiss: AX.25 Multikiss, Hans Albas PE1AYX\n; - -typedef struct ax25_ctrl { - struct ax_disp ctrl;/* */ - struct net_device dev; /* the device */ -} ax25_ctrl_t; - -static ax25_ctrl_t **ax25_ctrls; +#define AX_MTU 236 -int ax25_maxdev = AX25_MAXDEV; /* Can be overridden with insmod! */ +/* SLIP/KISS protocol characters. */ +#define END 0300 /* indicates end of frame */ +#define ESC 0333 /* indicates byte stuffing */ +#define ESC_END 0334 /* ESC ESC_END means END 'data' */ +#define ESC_ESC 0335 /* ESC ESC_ESC means ESC 'data' */ + +struct mkiss { + struct tty_struct *tty; /* ptr to TTY structure */ + struct net_device *dev; /* easy for intr handling */ + + /* These are pointers to the malloc()ed frame buffers. */ + spinlock_t buflock;/* lock for rbuf and xbuf */ + unsigned char *rbuff; /* receiver buffer */ + int rcount; /* received chars counter */ + unsigned char *xbuff
Re: AX-25 software that works on Fedora Core 4?
On Sun, Aug 21, 2005 at 12:05:57PM +0200, Jacques Chion wrote: -the patch you have sent by mail refuse to apply after line 885, but i finished by hand, and no problem to compile. -soundmodem, that i use, is complaining about SIOCSIFHADDR, but it seems to work properly. So, thank you and again, great job ! So here's the next version to test, it should fix the SIOCSIFHADDR issue. Again the patch is against 2.6.13-rc6. 73 de DL5RB op Ralf -- Loc. JN47BS / CQ 14 / ITU 28 / DOK A21 Signed-off-by: Ralf Baechle DL5RB [EMAIL PROTECTED] drivers/net/hamradio/Kconfig |2 drivers/net/hamradio/mkiss.c | 1092 --- 2 files changed, 530 insertions(+), 564 deletions(-) Index: linux-cvs/drivers/net/hamradio/mkiss.c === --- linux-cvs.orig/drivers/net/hamradio/mkiss.c +++ linux-cvs/drivers/net/hamradio/mkiss.c @@ -1,30 +1,19 @@ /* - * MKISS Driver + * This program is free software; you can distribute it and/or modify it + * under the terms of the GNU General Public License (Version 2) as + * published by the Free Software Foundation. * - * This module: - * This module is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version - * 2 of the License, or (at your option) any later version. + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. * - * This module implements the AX.25 protocol for kernel-based - * devices like TTYs. It interfaces between a raw TTY, and the - * kernel's AX.25 protocol layers, just like slip.c. - * AX.25 needs to be separated from slip.c while slip.c is no - * longer a static kernel device since it is a module. - * This method clears the way to implement other kiss protocols - * like mkiss smack g8bpq . so far only mkiss is implemented. + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. * - * Hans Alblas [EMAIL PROTECTED] - * - * History - * Jonathan (G4KLX)Fixed to match Linux networking changes - 2.1.15. - * Matthias (DG2FEF) Added support for FlexNet CRC (on special request) - * Fixed bug in ax25_close(): dev_lock_wait() was - * called twice, causing a deadlock. - * Jeroen (PE1RXQ) Removed old MKISS_MAGIC stuff and calls to - * MOD_*_USE_COUNT - * Remove cli() and fix rtnl lock usage. + * Copyright (C) Hans Alblas PE1AYX [EMAIL PROTECTED] + * Copyright (C) 2004, 05 Ralf Baechle DL5RB [EMAIL PROTECTED] */ #include linux/config.h @@ -49,174 +38,302 @@ #include net/ax25.h -#include mkiss.h - #ifdef CONFIG_INET #include linux/ip.h #include linux/tcp.h #endif -static char banner[] __initdata = KERN_INFO mkiss: AX.25 Multikiss, Hans Albas PE1AYX\n; - -typedef struct ax25_ctrl { - struct ax_disp ctrl;/* */ - struct net_device dev; /* the device */ -} ax25_ctrl_t; - -static ax25_ctrl_t **ax25_ctrls; +#define AX_MTU 236 -int ax25_maxdev = AX25_MAXDEV; /* Can be overridden with insmod! */ +/* SLIP/KISS protocol characters. */ +#define END 0300 /* indicates end of frame */ +#define ESC 0333 /* indicates byte stuffing */ +#define ESC_END 0334 /* ESC ESC_END means END 'data' */ +#define ESC_ESC 0335 /* ESC ESC_ESC means ESC 'data' */ + +struct mkiss { + struct tty_struct *tty; /* ptr to TTY structure */ + struct net_device *dev; /* easy for intr handling */ + + /* These are pointers to the malloc()ed frame buffers. */ + spinlock_t buflock;/* lock for rbuf and xbuf */ + unsigned char *rbuff; /* receiver buffer */ + int rcount; /* received chars counter */ + unsigned char *xbuff; /* transmitter buffer */ + unsigned char *xhead; /* pointer to next byte to XMIT */ + int xleft; /* bytes left in XMIT queue */ + + struct net_device_stats stats; + + /* Detailed SLIP statistics. */ + int mtu;/* Our mtu (to spot changes!) */ + int buffsize; /* Max buffers sizes
Re: AX-25 software that works on Fedora Core 4?
On Sat, Aug 20, 2005 at 08:30:37PM -, [EMAIL PROTECTED] wrote: What version is it actually intended for? The above are the latest Suse 9.2 and 9.3 respactively. I hope the above tells you something. 2.6.13-rc6. Always the latest. 73 de DL5RB op Ralf -- Loc. JN47BS / CQ 14 / ITU 28 / DOK A21 - To unsubscribe from this list: send the line unsubscribe linux-hams in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH] Fix socket bitop damage
The socket flag cleanups that went into 2.6.12-rc1 are basically oring the flags of an old socket into the socket just being created. Unfortunately that one was just initialized by sock_init_data(), so already has SOCK_ZAPPED set. As the result zapped sockets are created and all incoming connection will fail due to this bug which again was carefully replicated to at least AX.25, NET/ROM or ROSE. In order to keep the abstraction alive I've introduced sock_copy_flags() to copy the socket flags from one sockets to another and used that instead of the bitwise copy thing. Anyway, the idea here has probably been to copy all flags, so sock_copy_flags() should be the right thing. With this the ham radio protocols are usable again, so I hope this will make it into 2.6.13. Signed-off-by: Ralf Baechle DL5RB [EMAIL PROTECTED] include/net/sock.h |5 + net/ax25/af_ax25.c |7 +-- net/netrom/af_netrom.c |7 +-- net/rose/af_rose.c |7 +-- 4 files changed, 8 insertions(+), 18 deletions(-) Index: linux-cvs/net/netrom/af_netrom.c === --- linux-cvs.orig/net/netrom/af_netrom.c +++ linux-cvs/net/netrom/af_netrom.c @@ -465,12 +465,7 @@ static struct sock *nr_make_new(struct s sk-sk_sndbuf = osk-sk_sndbuf; sk-sk_state= TCP_ESTABLISHED; sk-sk_sleep= osk-sk_sleep; - - if (sock_flag(osk, SOCK_ZAPPED)) - sock_set_flag(sk, SOCK_ZAPPED); - - if (sock_flag(osk, SOCK_DBG)) - sock_set_flag(sk, SOCK_DBG); + sock_copy_flags(sk, osk); skb_queue_head_init(nr-ack_queue); skb_queue_head_init(nr-reseq_queue); Index: linux-cvs/include/net/sock.h === --- linux-cvs.orig/include/net/sock.h +++ linux-cvs/include/net/sock.h @@ -384,6 +384,11 @@ enum sock_flags { SOCK_QUEUE_SHRUNK, /* write queue has been shrunk recently */ }; +static inline void sock_copy_flags(struct sock *nsk, struct sock *osk) +{ + nsk-sk_flags = osk-sk_flags; +} + static inline void sock_set_flag(struct sock *sk, enum sock_flags flag) { __set_bit(flag, sk-sk_flags); Index: linux-cvs/net/ax25/af_ax25.c === --- linux-cvs.orig/net/ax25/af_ax25.c +++ linux-cvs/net/ax25/af_ax25.c @@ -884,12 +884,7 @@ struct sock *ax25_make_new(struct sock * sk-sk_sndbuf = osk-sk_sndbuf; sk-sk_state= TCP_ESTABLISHED; sk-sk_sleep= osk-sk_sleep; - - if (sock_flag(osk, SOCK_DBG)) - sock_set_flag(sk, SOCK_DBG); - - if (sock_flag(osk, SOCK_ZAPPED)) - sock_set_flag(sk, SOCK_ZAPPED); + sock_copy_flags(sk, osk); oax25 = ax25_sk(osk); Index: linux-cvs/net/rose/af_rose.c === --- linux-cvs.orig/net/rose/af_rose.c +++ linux-cvs/net/rose/af_rose.c @@ -556,12 +556,7 @@ static struct sock *rose_make_new(struct sk-sk_sndbuf = osk-sk_sndbuf; sk-sk_state= TCP_ESTABLISHED; sk-sk_sleep= osk-sk_sleep; - - if (sock_flag(osk, SOCK_ZAPPED)) - sock_set_flag(sk, SOCK_ZAPPED); - - if (sock_flag(osk, SOCK_DBG)) - sock_set_flag(sk, SOCK_DBG); + sock_copy_flags(sk, osk); init_timer(rose-timer); init_timer(rose-idletimer); - To unsubscribe from this list: send the line unsubscribe linux-hams in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH] AX.25 UID fixes
o Brown paperbag bug - ax25_findbyuid() was always returning a NULL pointer as the result. Breaks ROSE completly and AX.25 if UID policy set to deny. o While the list structure of AX.25's UID to callsign mapping table was properly protected by a spinlock, it's elements were not refcounted resulting in a race between removal and usage of an element. Signed-off-by: Ralf Baechle DL5RB [EMAIL PROTECTED] include/net/ax25.h | 18 +- net/ax25/af_ax25.c | 20 +++ net/ax25/ax25_route.c | 12 --- net/ax25/ax25_uid.c| 83 + net/netrom/af_netrom.c | 24 +- net/rose/af_rose.c | 20 +++ 6 files changed, 100 insertions(+), 77 deletions(-) Index: linux-cvs/include/net/ax25.h === --- linux-cvs.orig/include/net/ax25.h +++ linux-cvs/include/net/ax25.h @@ -148,11 +148,25 @@ enum { #define AX25_DEF_DS_TIMEOUT18 /* DAMA timeout 3 minutes */ typedef struct ax25_uid_assoc { - struct ax25_uid_assoc *next; + struct hlist_node uid_node; + atomic_trefcount; uid_t uid; ax25_addresscall; } ax25_uid_assoc; +#define ax25_uid_for_each(__ax25, node, list) \ + hlist_for_each_entry(__ax25, node, list, uid_node) + +#define ax25_uid_hold(ax25) \ + atomic_inc(((ax25)-refcount)) + +static inline void ax25_uid_put(ax25_uid_assoc *assoc) +{ + if (atomic_dec_and_test(assoc-refcount)) { + kfree(assoc); + } +} + typedef struct { ax25_addresscalls[AX25_MAX_DIGIS]; unsigned char repeated[AX25_MAX_DIGIS]; @@ -386,7 +400,7 @@ extern unsigned long ax25_display_timer( /* ax25_uid.c */ extern int ax25_uid_policy; -extern ax25_address *ax25_findbyuid(uid_t); +extern ax25_uid_assoc *ax25_findbyuid(uid_t); extern int ax25_uid_ioctl(int, struct sockaddr_ax25 *); extern struct file_operations ax25_uid_fops; extern void ax25_uid_free(void); Index: linux-cvs/net/ax25/ax25_route.c === --- linux-cvs.orig/net/ax25/ax25_route.c +++ linux-cvs/net/ax25/ax25_route.c @@ -422,8 +422,8 @@ static inline void ax25_adjust_path(ax25 */ int ax25_rt_autobind(ax25_cb *ax25, ax25_address *addr) { + ax25_uid_assoc *user; ax25_route *ax25_rt; - ax25_address *call; int err; if ((ax25_rt = ax25_get_route(addr, NULL)) == NULL) @@ -434,16 +434,18 @@ int ax25_rt_autobind(ax25_cb *ax25, ax25 goto put; } - if ((call = ax25_findbyuid(current-euid)) == NULL) { + user = ax25_findbyuid(current-euid); + if (user) { + ax25-source_addr = user-call; + ax25_uid_put(user); + } else { if (ax25_uid_policy !capable(CAP_NET_BIND_SERVICE)) { err = -EPERM; goto put; } - call = (ax25_address *)ax25-ax25_dev-dev-dev_addr; + ax25-source_addr = *(ax25_address *)ax25-ax25_dev-dev-dev_addr; } - ax25-source_addr = *call; - if (ax25_rt-digipeat != NULL) { if ((ax25-digipeat = kmalloc(sizeof(ax25_digi), GFP_ATOMIC)) == NULL) { err = -ENOMEM; Index: linux-cvs/net/ax25/ax25_uid.c === --- linux-cvs.orig/net/ax25/ax25_uid.c +++ linux-cvs/net/ax25/ax25_uid.c @@ -28,6 +28,7 @@ #include linux/fcntl.h #include linux/mm.h #include linux/interrupt.h +#include linux/list.h #include linux/notifier.h #include linux/proc_fs.h #include linux/seq_file.h @@ -41,38 +42,41 @@ * Callsign/UID mapper. This is in kernel space for security on multi-amateur machines. */ -static ax25_uid_assoc *ax25_uid_list; +HLIST_HEAD(ax25_uid_list); static DEFINE_RWLOCK(ax25_uid_lock); int ax25_uid_policy = 0; -ax25_address *ax25_findbyuid(uid_t uid) +ax25_uid_assoc *ax25_findbyuid(uid_t uid) { - ax25_uid_assoc *ax25_uid; - ax25_address *res = NULL; + ax25_uid_assoc *ax25_uid, *res = NULL; + struct hlist_node *node; read_lock(ax25_uid_lock); - for (ax25_uid = ax25_uid_list; ax25_uid != NULL; ax25_uid = ax25_uid-next) { + ax25_uid_for_each(ax25_uid, node, ax25_uid_list) { if (ax25_uid-uid == uid) { - res = ax25_uid-call; + ax25_uid_hold(ax25_uid); + res = ax25_uid; break; } } read_unlock(ax25_uid_lock); - return NULL; + return res; } int ax25_uid_ioctl(int cmd, struct sockaddr_ax25 *sax) { - ax25_uid_assoc *s, *ax25_uid; + ax25_uid_assoc *ax25_uid; + struct hlist_node *node; + ax25_uid_assoc
Re: AX-25 software that works on Fedora Core 4?
On Fri, Aug 19, 2005 at 02:55:42PM -0400, Scott Weis wrote: I have been working for weeks to try and get AX-25 working with the mkiss module. Best I can figure is that there is no working AX25 for SMP kernels and core 4. The ax25-utils package has not kept up with the updates made in the kernel. This is all I can manage to get when I try to start an interface.. All it takes is the minor tweak of recompiling - at least for the rpms that I'm maintaining for my own use. + /sbin/modprobe mkiss + sleep 5 + /usr/local/sbin/mkiss -s 9600 /dev/ttyS0 /dev/ptya1 /dev/ptya2 + /usr/local/sbin/kissattach /dev/ttya1 ax0 172.16.198.1 kissattach: SIOCSIFHWADDR: Invalid argument unregister_netdevice: device ax%d/ddc80400 never was registered This sounds like you're using my previous broken mkiss patch? I'm making an attempt to rewrite mkiss but unfortunately without mkiss setup for testing, so a very silly bug happened; find a version with that bug fixed below. All I can test it is to the point that kissattach succeeds, however. Ralf PS: Before anybody is scared, it did work that way for 6pack :-) Signed-off-by: Ralf Baechle DL5RB [EMAIL PROTECTED] drivers/net/hamradio/mkiss.c | 1088 --- 1 files changed, 525 insertions(+), 563 deletions(-) Index: linux-cvs/drivers/net/hamradio/mkiss.c === --- linux-cvs.orig/drivers/net/hamradio/mkiss.c +++ linux-cvs/drivers/net/hamradio/mkiss.c @@ -1,30 +1,19 @@ /* - * MKISS Driver + * This program is free software; you can distribute it and/or modify it + * under the terms of the GNU General Public License (Version 2) as + * published by the Free Software Foundation. * - * This module: - * This module is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version - * 2 of the License, or (at your option) any later version. + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. * - * This module implements the AX.25 protocol for kernel-based - * devices like TTYs. It interfaces between a raw TTY, and the - * kernel's AX.25 protocol layers, just like slip.c. - * AX.25 needs to be separated from slip.c while slip.c is no - * longer a static kernel device since it is a module. - * This method clears the way to implement other kiss protocols - * like mkiss smack g8bpq . so far only mkiss is implemented. + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. * - * Hans Alblas [EMAIL PROTECTED] - * - * History - * Jonathan (G4KLX)Fixed to match Linux networking changes - 2.1.15. - * Matthias (DG2FEF) Added support for FlexNet CRC (on special request) - * Fixed bug in ax25_close(): dev_lock_wait() was - * called twice, causing a deadlock. - * Jeroen (PE1RXQ) Removed old MKISS_MAGIC stuff and calls to - * MOD_*_USE_COUNT - * Remove cli() and fix rtnl lock usage. + * Copyright (C) Hans Alblas PE1AYX [EMAIL PROTECTED] + * Copyright (C) 2004, 05 Ralf Baechle DL5RB [EMAIL PROTECTED] */ #include linux/config.h @@ -49,174 +38,302 @@ #include net/ax25.h -#include mkiss.h - #ifdef CONFIG_INET #include linux/ip.h #include linux/tcp.h #endif -static char banner[] __initdata = KERN_INFO mkiss: AX.25 Multikiss, Hans Albas PE1AYX\n; - -typedef struct ax25_ctrl { - struct ax_disp ctrl;/* */ - struct net_device dev; /* the device */ -} ax25_ctrl_t; - -static ax25_ctrl_t **ax25_ctrls; +#define AX_MTU 236 -int ax25_maxdev = AX25_MAXDEV; /* Can be overridden with insmod! */ +/* SLIP/KISS protocol characters. */ +#define END 0300 /* indicates end of frame */ +#define ESC 0333 /* indicates byte stuffing */ +#define ESC_END 0334 /* ESC ESC_END means END 'data' */ +#define ESC_ESC 0335 /* ESC ESC_ESC means ESC 'data' */ + +struct mkiss { + struct tty_struct *tty; /* ptr to TTY structure */ + struct net_device *dev; /* easy for intr handling */ + + /* These are pointers to the malloc()ed frame buffers. */ + spinlock_t buflock
[PATCH 0/3] Eleminate HZ from AX.25 kernel interfaces
AX.25, NET/ROM and ROSE unfortunately still use jiffies as the unit of time for all their timeouts that can be configured through sysctl and it's procfs equivalents. This did result in a change of these kernel interfaces going from Linux 2.4 to 2.6 for anybody who was unlucky enough to use an affected platform such as i386 and most MIPS but not Alpha. Making matters worse, it required the sysadmin of the particular system to know the timing value making it very, very broken inteface design. The timer interrupt frequency recently becoming configurable made things even worse, so this really needed to be fixed. The following series of patches contains three patches, one for each of the three packet radio protocols to switch the unit used by the sysadmin to miliseconds thus resulting in a deterministic interface. I'd be happy about testers. Patches are against 2.6.13-rc6. 73 de DL5RB op Ralf -- Loc. JN47BS / CQ 14 / ITU 28 / DOK A21 - To unsubscribe from this list: send the line unsubscribe linux-hams in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: Ethereal ax25 monitoring
On Sun, Aug 14, 2005 at 10:54:41PM +0100, Richard Stearn wrote: Before I actually get down to design and coding I will make some enquiries on the Ethereal dev mailing list to see if anybody on that list is currently working on an AX.25 dissector and also to see if it would be accepted if offered. So is there anybody on this list who has done/is doing/has abandoned an AX.25 dissector for Ethereal? I looked at it and it was looking like it was going to sidetrack me more than I wanted by that time. Is there anybody on the list who is up for testing? Definately; this is going to be a highly valuable tool. My guess is that Netrom Rose would also be on the followup list, any others?. Any protocols built on top of these, that would include, IP over AX.25, ARP over AX.25, VJ compressed IP over AX.25, IP over NET/ROM, IP over ROSE, routing protocols such as RSPF. Ralf - To unsubscribe from this list: send the line unsubscribe linux-hams in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: What happened to mkiss module
On Mon, Jul 25, 2005 at 04:05:46PM -0400, Scott Weis wrote: I grabbed the message directly off of the server with VI. I only had one rej.. Okay. That's more the expected behaviour due to the change in 2.6.12-rc4. I applied the last part of the patch by hand.. No problems.. I found references to the SIOCSIFHWADDR: Invalid argument problem on the web and it seems to be a problem with the ax25 module not being seen. So I was thinking that perhaps there is something missing from the /dev? Should I have any udev config entries?? No. That should result in a different error message. 73 de DL5RB op Ralf -- Loc. JN47BS / CQ 14 / ITU 28 / DOK A21 - To unsubscribe from this list: send the line unsubscribe linux-hams in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: What happened to mkiss module
On Sun, Jul 24, 2005 at 02:26:36AM -0400, Scott Weis wrote: I had to reload my server due to a hard drive failure.. So I upgraded my SMP server to Fedora core 4. I went to add ax25 and mkiss and found that mkiss was missing. Where did it go?? Any idea how to get around this problem? The mkiss module is not SMP proof, so the kernel won't offer it when configuring an SMP kernel. Below is an untested rewrite of the driver for 2.6.13-rc3 that should fix the SMP issues. Please test it, lemme know. Without successful testing this driver can't go into the kernel. Btw, if your TNC supports 6pack you should try to switch to that instead. It's clearly the superior protocol for TNC. Ralf Kconfig |2 mkiss.c | 1052 ++-- 2 files changed, 508 insertions(+), 546 deletions(-) Index: linux-cvs/drivers/net/hamradio/mkiss.c === --- linux-cvs.orig/drivers/net/hamradio/mkiss.c 2005-07-15 10:04:51.0 +0100 +++ linux-cvs/drivers/net/hamradio/mkiss.c 2005-07-15 10:04:57.0 +0100 @@ -1,30 +1,19 @@ /* - * MKISS Driver + * This program is free software; you can distribute it and/or modify it + * under the terms of the GNU General Public License (Version 2) as + * published by the Free Software Foundation. * - * This module: - * This module is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version - * 2 of the License, or (at your option) any later version. + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. * - * This module implements the AX.25 protocol for kernel-based - * devices like TTYs. It interfaces between a raw TTY, and the - * kernel's AX.25 protocol layers, just like slip.c. - * AX.25 needs to be separated from slip.c while slip.c is no - * longer a static kernel device since it is a module. - * This method clears the way to implement other kiss protocols - * like mkiss smack g8bpq . so far only mkiss is implemented. + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. * - * Hans Alblas [EMAIL PROTECTED] - * - * History - * Jonathan (G4KLX)Fixed to match Linux networking changes - 2.1.15. - * Matthias (DG2FEF) Added support for FlexNet CRC (on special request) - * Fixed bug in ax25_close(): dev_lock_wait() was - * called twice, causing a deadlock. - * Jeroen (PE1RXQ) Removed old MKISS_MAGIC stuff and calls to - * MOD_*_USE_COUNT - * Remove cli() and fix rtnl lock usage. + * Copyright (C) Hans Alblas PE1AYX [EMAIL PROTECTED] + * Copyright (C) 2004, 05 Ralf Baechle DL5RB [EMAIL PROTECTED] */ #include linux/config.h @@ -50,174 +39,301 @@ #include net/ax25.h -#include mkiss.h - #ifdef CONFIG_INET #include linux/ip.h #include linux/tcp.h #endif -static char banner[] __initdata = KERN_INFO mkiss: AX.25 Multikiss, Hans Albas PE1AYX\n; - -typedef struct ax25_ctrl { - struct ax_disp ctrl;/* */ - struct net_device dev; /* the device */ -} ax25_ctrl_t; - -static ax25_ctrl_t **ax25_ctrls; +#define AX_MTU 236 -int ax25_maxdev = AX25_MAXDEV; /* Can be overridden with insmod! */ +/* SLIP/KISS protocol characters. */ +#define END 0300 /* indicates end of frame */ +#define ESC 0333 /* indicates byte stuffing */ +#define ESC_END 0334 /* ESC ESC_END means END 'data' */ +#define ESC_ESC 0335 /* ESC ESC_ESC means ESC 'data' */ + +struct mkiss { + struct tty_struct *tty; /* ptr to TTY structure */ + struct net_device *dev; /* easy for intr handling */ + + /* These are pointers to the malloc()ed frame buffers. */ + spinlock_t buflock;/* lock for rbuf and xbuf */ + unsigned char *rbuff; /* receiver buffer */ + int rcount; /* received chars counter */ + unsigned char *xbuff; /* transmitter buffer */ + unsigned char *xhead; /* pointer to next byte to XMIT */ + int xleft; /* bytes left in XMIT queue
Re: [PATCH] SMP fix for 6pack driver
On Tue, Jul 05, 2005 at 05:39:44PM -0500, Bill Vodall wrote: It's a strategy that allows attaching the TNC to any UNIX machine, even without AX.25 support. It's a hack but I was playing with it for a while when I ran out of interfaces. That could be VERY userful... Any more details available? 6pack is implemented as a line discipline, so any tty, including a pseudo tty can be turned into a 6pack interface. So all it takes is a network connection, let's say through ssh, an application on the remote side that transfers data on the remote side between that connecton and the /dev/tty... character device to which the TNC is connected. Same thing also on the local side, just between the pseudo-tty and the filedescriptor. Pretty much a nobrainer to implement but latency could be a slight problem. (And if you don't truncate the cc list of email you even have a chance to getting answers in time ...) Ralf - To unsubscribe from this list: send the line unsubscribe linux-hams in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH] AX.25 patches for strace
So far strace is lacking support for AX.25 making debugging of AX.25 software harder for no good reason. Below the first cut of a patch to add AX.25 support. The patch is against Sourceforge CVS. Please test. 73 de DL5RB op Ralf -- Loc. JN47BS / CQ 14 / ITU 28 / DOK A21 Index: configure.ac === RCS file: /cvsroot/strace/strace/configure.ac,v retrieving revision 1.41 diff -u -r1.41 configure.ac --- configure.ac22 Mar 2005 23:12:39 - 1.41 +++ configure.ac31 Mar 2005 12:56:25 - @@ -193,8 +193,7 @@ AC_CHECK_FUNCS(sigaction strerror strsignal pread sys_siglist _sys_siglist getdents mctl prctl sendmsg inet_ntop if_indextoname) AC_CHECK_HEADERS([sys/reg.h sys/filio.h sys/acl.h sys/asynch.h sys/door.h stropts.h sys/conf.h sys/stream.h sys/tihdr.h sys/tiuser.h sys/sysconfig.h ioctls.h sys/ioctl.h sys/ptrace.h termio.h linux/ptrace.h asm/reg.h sys/uio.h sys/aio.h poll.h sys/poll.h sys/vfs.h asm/sysmips.h linux/utsname.h sys/nscsys.h mqueue.h sys/epoll.h], [], []) -AC_CHECK_HEADERS([linux/icmp.h linux/in6.h linux/netlink.h linux/if_packet.h], - [], [], [#include linux/socket.h]) +AC_CHECK_HEADERS([linux/icmp.h linux/in6.h linux/netlink.h linux/if_packet.h netax25/ax25.h], [], [], [#include linux/socket.h]) AC_CHECK_HEADERS([asm/sigcontext.h], [], [], [#include signal.h]) AC_CHECK_HEADERS([netinet/tcp.h netinet/udp.h],,, [#include netinet/in.h]) Index: defs.h === RCS file: /cvsroot/strace/strace/defs.h,v retrieving revision 1.55 diff -u -r1.55 defs.h --- defs.h 6 Feb 2005 01:16:32 - 1.55 +++ defs.h 31 Mar 2005 12:56:27 - @@ -459,6 +459,7 @@ extern void call_summary P((FILE *)); extern void printtv32 P((struct tcb*, long)); extern void tprint_iov P((struct tcb *, int, long)); +extern void tprint_ax25_address P((char *ax)); #ifdef LINUX extern int internal_clone P((struct tcb *)); Index: net.c === RCS file: /cvsroot/strace/strace/net.c,v retrieving revision 1.46 diff -u -r1.46 net.c --- net.c 2 Feb 2005 03:11:32 - 1.46 +++ net.c 31 Mar 2005 12:56:29 - @@ -98,6 +98,10 @@ #include linux/icmp.h #endif +#if defined(HAVE_NETAX25_AX25_H) +#include netax25/ax25.h +#endif + #ifndef PF_UNSPEC #define PF_UNSPEC AF_UNSPEC #endif @@ -436,6 +440,7 @@ #endif { 0,NULL}, }; + static const struct xlat msg_flags[] = { { MSG_OOB, MSG_OOB }, #ifdef MSG_DONTROUTE @@ -780,6 +785,24 @@ }; #endif /* SOL_IPX */ +#if defined(LINUX) defined(AF_AX25) +static const struct xlat sockax25options[] = { + { AX25_WINDOW, AX25_WINDOW }, + { AX25_T1, AX25_T1 }, + { AX25_T2, AX25_T2 }, + { AX25_N2, AX25_N2 }, + { AX25_T3, AX25_T3 }, + { AX25_IDLE,AX25_IDLE }, + { AX25_BACKOFF, AX25_BACKOFF }, + { AX25_EXTSEQ, AX25_EXTSEQ }, + { AX25_PIDINCL, AX25_PIDINCL }, + { AX25_IAMDIGI, AX25_IAMDIGI }, + { AX25_PACLEN, AX25_PACLEN }, + { SO_BINDTODEVICE, SO_BINDTODEVICE }, + { 0,NULL} +}; +#endif + #ifdef SOL_RAW static const struct xlat sockrawoptions[] = { #if defined(ICMP_FILTER) @@ -923,6 +946,22 @@ }; #endif /* defined(AF_PACKET) */ +#if defined(LINUX) defined(AF_AX25) +void tprint_ax25_address(char *ax) +{ + int len, i; + + for (len = 5; len; len--) + if (ax[len] != (' ' 1)) + break; + + for (i = 0; i = len; i++) + tprintf(%c, (ax[i] 1) 0x7f); + + tprintf(-%d, ax[6]); +} +#endif + void printsock(tcp, addr, addrlen) @@ -934,6 +973,9 @@ char pad[128]; struct sockaddr sa; struct sockaddr_in sin; +#if defined(LINUX) defined(AF_AX25) + struct full_sockaddr_ax25 sax25; +#endif struct sockaddr_un sau; #ifdef HAVE_INET_NTOP struct sockaddr_in6 sa6; @@ -984,6 +1026,28 @@ tprintf(sin_port=htons(%u), sin_addr=inet_addr(\%s\), ntohs(addrbuf.sin.sin_port), inet_ntoa(addrbuf.sin.sin_addr)); break; +#if defined(LINUX) defined(AF_AX25) + case AF_AX25: { + int i; + + tprintf(sax25_call=); + tprint_ax25_address(addrbuf.sax25.fsa_ax25.sax25_call.ax25_call); + tprintf(, sax25_ndigis=%d, addrbuf.sax25.fsa_ax25.sax25_ndigis); + + if (addrbuf.sax25.fsa_ax25.sax25_ndigis) { + tprintf( {); + +
Re: [PATCH] Get rid of sk_protinfo use in rose
On Mon, Mar 21, 2005 at 09:50:37AM +, Ralf Baechle DL5RB wrote: Below patch puts struct sock into rose_cb to get rid of the need for the use of sk_protinfo in rose_sk(). While we're touching the data structure convert it from a typedef into a struct. The previous two patches leave the same thing to do in ax25 also - where it's a more complicated thing to do since currently an ax25_cb may exist without a struct sock - which unfortunately messes up locking. Ralf - To unsubscribe from this list: send the line unsubscribe linux-hams in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html