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 89aebaffff7545d7a2947e2f8f5fdee70f841c14 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 89aebaffff7545d7a2947e2f8f5fdee70f841c14 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

Reply via email to