linux ax5rtd und mkiss fixes [lang]

ampr.de.tcpip.unixZur Gruppenliste
Betreff: linux ax5rtd und mkiss fixes [lang]
Von: dl9sau@db0tud.ampr.org (thomas osterried)
Gruppen: ampr.de.tcpip.unix
Organisation: amateur radio
Datum: 14. Jun 2002, 14:06:11
hallo,

in den letzten tagen bin ich ueber 2 probleme gestolpert, die ich
hiermit vorstellen moechte:

I. ax25rtd
seit einiger zeit wurde in diversen newsgroups und mailinglisten
beklagt, dass der ax25rtd aus den aktuellen ax25-apps (die fuer den
kernel 2.4.x benoetigt werden, keine ip-routen und arp's mehr lernt.
m.e. liegt das an einer erweiterung, die kaum dokumentiert ist
(lediglich im README.ax25rtd, und nach dem durchackern der sourcen):
"ip-encaps-dev foo0" in der global section gibt an, dass gelernte
ip-routen und ARPs unabhaengig ihrer herkunft genau auf das mit dieser
option konfigurierte interface foo0 "umgelernt" werden.
ip_encaps_dev wird als leerer string initialisiert. da ein devices mit
dem namen "" nicht gefunden wird, fuert das dazu, dass auch keine routen
gelernt werden.
habe ich mehrere interfaces (nicht unueblich beim betrieb eines digi's),
kann ich nur routen von genau einem interface lernen (bzw. alles auf das
eine interface mapen).
dies macht m.e. nur in ganz wenigen spezial-konfigurationen sinn.
deshalb schlage ich folgenden patch von ax25rtd/listener.c vor:
*** ampr/patches/linux-ax25/listener.c  2002/06/13 17:42:37     1.1
--- ampr/patches/linux-ax25/listener.c  2002/06/13 17:43:39     1.2
***************
*** 565,571 ****
        ipmode = (ctl == LAPB_I);
 
        if (ip != 0) {
!               if ((config = dev_get_config(ip_encaps_dev)) == NULL)
                        return;
 
                action =
--- 565,571 ----
        ipmode = (ctl == LAPB_I);
 
        if (ip != 0) {
!               if (*ip_encaps_dev && (config =
dev_get_config(ip_encaps_dev)) == NULL)
                        return;

                action =

II. linux kernel mkiss treiber
bevor das vom kernel mkiss treiber empfangene paket mit einem
ax25-indicator an den allgemeinen netif_rx-handler weitergereicht wird,
findet im falle der crc-flexnet erweiterung eine pruefung der checksum
statt. stimmt sie nicht, wird das paket verworfen. ansonsten werden die
hinteren zwei byte des paketes (die checksum) entfernt und das so
"entkleidete" paket wie jedes andere kiss-paket auch an den netif_rx
handler weitergereicht.
kernel-intern wird die checksum nicht mehr benoetigt. das paket wird
jedoch weiterhin mit dem 1-byte kiss header weitergereicht.
leider wurde m.e. versaeumt, das erste byte des paketes, welches den
kisstype indicator traegt (beispielsweise 0x20 fuer crc-flexnet, 0x00
fuer vanilla kiss) anzupassen.
zwar ignoriert der kernel dieses byte bei der spaeteren verarbeitung.
doch wenn das paket jetzt an ein anderes programm das eine pf_packet
mitgliedschaft fuer dieses interface angemeldet hat eine kopie dieses
paketes empfaengt (die verteilung geschieht durch den allgemeinen
netif_rx handler), dann sieht es die crc-flexnet signatur am kopf des
kiss-frames. da jedoch die crc am ende enfternt wurde, aber die crc
angekuendigt war, stimmt diese nicht mehr - und das paket wird als
kaputt verworfen.
aufgefallen war dieser fehler beim betrieb von wampes in folgender
konfiguration:
tnc --seriell-- kissattach -> ax0 .. kernel-ax25
wampes dann mit "attach kernel ax0" an das ax0 interface angelinkt,
damit es, vom kernel-ax25-stack unabhaengig, ebenfalls mit dem tnc
kommunizieren kann. wampes empfing das paket ueber den kernel, checkte
die angekuendigte flexnet crc und verwarf das augenscheinlich kaputte
paket.

der dazugehoerige diff:
*** ampr/patches/linux-kernel-ax25/kernel-2.4.x/mkiss.c 2002/06/14
12:18:59     1.2
--- ampr/patches/linux-kernel-ax25/kernel-2.4.x/mkiss.c 2002/06/14
12:33:49     1.3
***************
*** 330,335 ****
--- 330,340 ----
                                return;
                        }
                        ax->rcount -= 2;
+                       // dl9sau bugfix: the trailling two bytes
flexnet crc
+                       // will not be passed to the kernel. thus we
have
+                       // to correct the kissparm signature, because it
+                       // indicates a crc but there's none
+                       *ax->rbuff &= ~0x20;
                }
        }


wer statistiken des kiss-interface mit mrtg fuehren moechte, benoetigt
folgenden patch:
Index: mkiss.c
===================================================================
RCS file: /var/cvs/ampr/patches/linux-kernel-ax25/kernel-2.4.x/mkiss.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -c -r1.1 -r1.2
*** mkiss.c     14 Jun 2002 12:14:13 -0000      1.1
--- mkiss.c     14 Jun 2002 12:18:59 -0000      1.2
***************
*** 334,339 ****
--- 334,340 ----
        }
 
        count = ax->rcount;
+       ax->rx_bytes += (count + 1);
 
        if ((skb = dev_alloc_skb(count)) == NULL) {
                printk(KERN_ERR "mkiss: %s: memory squeeze, dropping
packet.\n", ax->dev->name);
***************
*** 488,493 ****
--- 489,495 ----
                ax_lock(ax);
                if (tmp_ax != NULL)
                        ax_lock(tmp_ax);
+               ax->tx_bytes+=skb->len;
                ax_encaps(ax, skb->data, skb->len);
                kfree_skb(skb);
        }
***************
*** 709,714 ****
--- 711,718 ----
 
        stats.rx_packets     = ax->rx_packets;
        stats.tx_packets     = ax->tx_packets;
+       stats.rx_bytes       = ax->rx_bytes;
+       stats.tx_bytes       = ax->tx_bytes;
        stats.rx_dropped     = ax->rx_dropped;
        stats.tx_dropped     = ax->tx_dropped;
        stats.tx_errors      = ax->tx_errors;
Index: mkiss.h
===================================================================
RCS file: /var/cvs/ampr/patches/linux-kernel-ax25/kernel-2.4.x/mkiss.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -c -r1.1 -r1.2
*** mkiss.h     14 Jun 2002 12:14:13 -0000      1.1
--- mkiss.h     14 Jun 2002 12:18:59 -0000      1.2
***************
*** 31,36 ****
--- 31,39 ----
        /* SLIP interface statistics. */
        unsigned long      rx_packets;          /* inbound frames
counter       */
        unsigned long      tx_packets;          /* outbound frames
counter      */
+       unsigned long      rx_bytes;            /* inbound bytes
counter       
+ */
+       unsigned long      tx_bytes;            /* outboud bytes
counter        */
        unsigned long      rx_errors;           /* Parity, etc.
errors          */
        unsigned long      tx_errors;           /* Planned
stuff                */
        unsigned long      rx_dropped;          /* No memory for
skb            */


danke auch an lutz <dl9cu> fuer die eine oder andere fehlersuche und den
mrtg patch.

73,

- thomas

Datum Thema#  Autor
14.06. * linux ax5rtd und mkiss fixes [lang]2thomas osterried
24.06. `- Re: linux ax5rtd und mkiss fixes [lang]1thomas osterried

"News-Portal" auf dem HAM-Web-Servfer DB0ERF.