Table of Contents

Description

The ax25-essentials and ax25-helpers are a subjective mix of ax25-apps and ax25-tools. The source is the latest from CVS (http://www.linux-ax25.org).

Dependencies

Package depends on
ax25-essentials ax25-libax25 (→ kmod-ax25)
ax25-helpers ax25-essentials (→ ax25-libax25 → kmod-ax25), libncurses (needed for 'listen' and 'call')
ax25-netrom-rose ax25-libax25 (→ kmod-ax25)
ax25-libax25 kmod-ax25

Installation

Both ax25-essentials and ax25-helpers depend on “kmod-ax25-dg8ngn”. Make sure you have it installed.

Diskfree prior to installation:

root@OpenWrt:/ df
Filesystem           1k-blocks      Used Available Use% Mounted on
none                     15256        28     15228   0% /tmp
/dev/mtdblock/4           6016       652      5364  11% /jffs
mini_fo:/jffs             1280      1280         0 100% /
root@OpenWrt:/

Installation:

ipkg update
ipkg install ax25-essentials
ipkg install ax25-helpers
ipkg install ax25-netrom-rose (only needed if you want to use netrom or rose)
reboot

Diskfree after installation:

root@OpenWrt:/# df
Filesystem           1k-blocks      Used Available Use% Mounted on
none                     15256        20     15236   0% /tmp
/dev/mtdblock/4           6016      1252      4764  21% /jffs
mini_fo:/jffs             1280      1280         0 100% /
root@OpenWrt:/#

AX25 Configuration

The following has been put together by Jens, DL3SJB.

Each of the AX.25 applications read a particular configuration file to obtain the parameters of the AX.25 port(s) of your OPENWRT Linux. For AX.25 ports the file is '/etc/ax25/axports'.

root@OpenWrt:/etc/ax25# ls

ax25.profile   ax25mond.conf  axspawn.conf   rip98d.conf    ttylinkd.conf
ax25d.conf     ax25rtd.conf   nrbroadcast    rsports
ax25ipd.conf   axports        nrports        rxecho.conf
root@OpenWrt:/etc/ax25#

The file 'axports' configures the ax25 device:

root@OpenWrt:/etc/ax25# vi axports
# The format of this file is:
#
# name callsign speed paclen window description
#
ax0     d0mmy   115200  255     2    XNET Kernellink

root@OpenWrt:/etc/ax25# 

Note: You need to assign unique callsign (ssid) to each ax25 port in your 'axports' file. In this example the call used is 'd0mmy'.

As netrom is not subject of configuration here, make sure no netrom port is listed in 'nrports':

root@OpenWrt:/etc/ax25# vi nrports

# /etc/ax25/nrports
#
# The format of this file is:
#
# name callsign alias paclen description
#

root@OpenWrt:/etc/ax25# 

Same goes for rose. As rose is not subject of configuration here, make sure no rose port is listed in 'rsports':

root@OpenWrt:/etc/ax25# vi rsports

# /etc/ax25/rsports
#
# The format of this file is:
#
# name address description
#

root@OpenWrt:/etc/ax25# 

The 'axspawn' program is launched by 'ax25d'. It provides for AX.25 logins into the local Linux. To prepare for this add the following lines into your '/etc/ax25/ax25d.conf' file (you may have to delete the existing default lines that are serving as examples):

root@OpenWrt:/etc/ax25# vi ax25d.conf

# /etc/ax25/ax25d.conf
#
# ax25d Configuration File.
#
# AX.25 Ports begin with a '['.
#
[D0MMY VIA AX0]
NOCALL   * * * * * *  L
default  * * * * * *  - root  /usr/sbin/axspawn axspawn %u

root@OpenWrt:/etc/ax25#

Add to File (/etc/group):

guest:x:300:

Add to File (/etc/passwd):

guest:+:300:300:guest:/tmp/guest:/bin/ash

The 'axspawn.conf' file configures the operation of 'axspawn'. Example:

root@OpenWrt:/etc/ax25# vi axspawn.conf

# /etc/ax25/axspawn.conf
#
# allow automatic creation of user accounts
create    yes

# allow empty password field (so user may login via telnet, too) [default no]
create_empty_password       no

# create with system utility useradd(8)? [default no]
create_with_useradd  no

#pwcheck call
#pwcheck group
#pwcheck password

# guest user if above is 'no' or everything else fails. Disable with "no"
guest     no

# group id or name for autoaccount
group     guest

# first user id to use
first_uid 400

# maximum user id
max_uid   2000

# where to add the home directory for the new user
home      /tmp

# secure homedirectories (g-rwx)
#secure_home yes

# user shell
shell     /bin/sh

# bind user id to callsign for outgoing connects.
associate no

root@OpenWrt:/etc/ax25# 

Note (1): The default shell has been altered from the default file (bash ⇒ ash), as Kamikaze normally has no bash support.

Note (2): In this example, the user space is located in the fram disk. If you place the users in /tmp, remember that all content is lost after reset. This maybe, however, an acceptable consequence as it cleans-up the system regularly. If you decide to use flash disk instead, this could be a critical location as flash memories don't have unlimited write cycles. Therefore we suggest to find a different location, such as usb-hdd (if any) or on a samba network share.

If you decide not to use '/tmp' remember to ensure the home root directory does exist, i.e.:

root@OpenWrt:/etc/ax25# mkdir /home
root@OpenWrt:/etc/ax25# mkdir /home/hams
root@OpenWrt:/etc/ax25#

Prior to the XNET configuration, one final step ought to be performed. The standard login script of OPENWRT does not allow 'axspawn' to login a user 'as him-' respectively 'herself'. Therefore, we need to apply a workaround using the scripting language 'ruby' (thanks to DL9SAU).

Diskfree prior to installation:

root@OpenWrt:~/etc/ax25# df
Filesystem           1k-blocks      Used Available Use% Mounted on
none                     15256        40     15216   0% /tmp
/dev/mtdblock/4           6016      2344      3672  39% /jffs
mini_fo:/jffs             1280      1280         0 100% /

Installation of 'ruby':

root@OpenWrt:~/etc/ax25# ipkg install ruby
Installing ruby (1.8.6-p36-1) to root...
Downloading http://downloads.openwrt.org/kamikaze/packages/mipsel/./ruby_1.8.6-p36-1_mipsel.ipk
Installing libruby (1.8.6-p36-1) to root...
Downloading http://downloads.openwrt.org/kamikaze/packages/mipsel/./libruby_1.8.6-p36-1_mipsel.ipk
Configuring libruby
Configuring ruby
Done.
root@OpenWrt:~/etc/ax25#

Diskfree after installation:

root@OpenWrt:~/etc/ax25# df
Filesystem           1k-blocks      Used Available Use% Mounted on
none                     15256        40     15216   0% /tmp
/dev/mtdblock/4           6016      2716      3300  45% /jffs
mini_fo:/jffs             1280      1280         0 100% /
root@OpenWrt:~/etc/ax25#

Note: 372 kb of flash memory are occupied by 'ruby'.

Now modify the standard 'login script' as follows:

root@OpenWrt:~/etc/ax25#vi /bin/login
#!/bin/sh

if [ ! -z "$AXCALL" ]; then
  exec /bin/login.rb $*
fi

grep '^root:[^!]' /etc/passwd >&- 2>&-
[ "$?" = "0" -a -z "$FAILSAFE" ]  &&
{
      echo "Login failed."
          exit 0
}
exec /bin/ash --login

root@OpenWrt:~/etc/ax25#

The main change here is to use the ruby script '/bin/login.rb' which still needs to be created:

root@OpenWrt:~/etc/ax25#vi /bin/login.rb
#!/usr/bin/ruby

Process::Sys.setresgid(300,300,300)
Process::Sys.setreuid(300,300)
exec "/bin/ash --login"

Make '/bin/login.rb' executable:

root@OpenWrt:~/etc/ax25# chmod 755 /bin/login.rb

Now install XNET:

root@OpenWrt:/etc/ax25# ipkg install xnet

Installing xnet (1.39-20071005-0.2) to root...
Downloading http://db0fhn-i.ampr.org/openwrt/kamikaze/packages/mipsel/xnet_1.39-20071005-0.2_mipsel.ipk
Installing screen (4.0.3-1) to root...
Downloading http://downloads.openwrt.org/kamikaze/packages/mipsel/./screen_4.0.3-1_mipsel.ipk
Configuring screen
Configuring xnet
Done.
root@OpenWrt:/etc/ax25# reboot

After reboot check for running XNET:

root@OpenWrt:/# ps
  PID  Uid     VmSize Stat Command

(...)

  481 root        764 S   SCREEN -DmS xnet -c /usr/local/xnet/conf/screen.xnet
  482 root       2716 S   /tmp/xnet/wrtxnet
  483 root        412 R   ps
root@OpenWrt:/#

Now stop running XNET and modify its 'AUTOEXEC.NET' so XNET can talk to the kernel:

root@OpenWrt:/# /etc/init.d/xnet stop
root@OpenWrt:/# vi /usr/local/xnet/conf/AUTOEXEC.NET

att sdev1 kiss 7 1 115200 /dev/pty/m0
my call d1mmy

root@OpenWrt:/#

Note: in this example, the kiss device is attached to XNET port 7 and linked to the master-pry-device '/dev/pty/m0'. XNET's AX25 call is 'd1mmy'. Only the very basic configuation of XNET is shown here, there are many more options that are of no importance here.

Now both restart and check for running XNET:

root@OpenWrt:/# /etc/init.d/xnet start
root@OpenWrt:/# ps | grep "wrtxnet"|head -c45
  482 root       2716 S   /tmp/xnet/wrtxnet
root@OpenWrt:/#

Next prepare the kernel for 'KISS':

root@OpenWrt:/# kissattach
usage: kissattach [-b] [-l] [-m mtu] [-v] tty port [inetaddr]

root@OpenWrt:/# kissattach /dev/pty/s0 ax0 x.x.x.x 
port ax0 bound to device ax0
root@OpenWrt:/#

Note: 'x.x.x.x' needs to match your local IP configuration. If you are unsure, use '192.168.255.200'

Finally, the AX25 configuration needs to be finalized:

 
root@OpenWrt:/#/sbin/ifconfig ax0 mtu 1500
root@OpenWrt:/#/bin/echo 1 >/proc/sys/net/ax25/ax0/ip_default_mode
root@OpenWrt:/#/bin/echo 7 >/proc/sys/net/ax25/ax0/standard_window_size
root@OpenWrt:/#/bin/echo 500 >/proc/sys/net/ax25/ax0/t1_timeout
root@OpenWrt:/#/bin/echo 90 >/proc/sys/net/ax25/ax0/t2_timeout
root@OpenWrt:/#/bin/echo 30000 >/proc/sys/net/ax25/ax0/t3_timeout
root@OpenWrt:/#/bin/echo 30 >/proc/sys/net/ax25/ax0/maximum_retry_count
root@OpenWrt:/#

Now check for running KISS communication from LINUX side:

root@OpenWrt:/# call -r ax0 d1mmy
GW4PTS AX.25 Connect v1.11
*** Connected to d1mmy
Rawmode
(X)NET/LINUX/MIPSel V1.39
=>q

73!
*** Cleared

root@OpenWrt:/#

Is AX25d running?

root@OpenWrt:/# ax25d -l
root@OpenWrt:/# ps |grep "ax25d"|head -c36
  432 root        344 S   ax25d -l
root@OpenWrt:/#

Now check for running KISS communication from XNET side (propper login procedure (axspawn, ruby, login) is being check as well):

root@OpenWrt:~/d0m...# call -r ax0 d1mmy
GW4PTS AX.25 Connect v1.11
*** Connected to d1mmy
Rawmode
(X)NET/LINUX/MIPSel V1.39
=>c d0mmy

link setup (7)...
*** connected to D0MMY
Notice: No .bcpasswd file found in your homedirectory (for more secure
        password authentication than plaintext). Generating example file,
        with unique passwords (which may be changed).
        Please edit ~/.bcpasswd, and enable your prefered authentication type;
        MD5 is recommended.


BusyBox v1.4.2 (2008-02-28 05:09:35 CET) Built-in shell (sh)
Enter 'help' for a list of built-in commands.

  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 KAMIKAZE (7.09) -----------------------------------
  * 10 oz Vodka       Shake well with ice and strain
  * 10 oz Triple sec  mixture into 10 shot glasses.
  * 10 oz lime juice  Salute!
 ---------------------------------------------------
d0mmy@OpenWrt:/tmp/d0m.../d0mmy$

Note: the above message “No .bcpasswd file found (…)” appears the first time a user is logging into the system. This is normal. It won't show up the 2nd time. Axspawn creates the user during the initial login in '/etc/passwd' plus makes his/her home-directory in which two files are generated: '.bcpasswd' and '.profile':

d0mmy@OpenWrt:/tmp/d0m.../d0mmy$ ls -al

drwxr-x--x    2 d0mmy    guest          80 Jan  3 08:43 .
drwxr-xr-x    3 root     root           60 Jan  3 08:43 ..
-rw-------    1 d0mmy    guest         421 Jan  3 08:43 .bcpasswd
-rw-------    1 d0mmy    guest          38 Jan  3 08:43 .profile
d0mmy@OpenWrt:/tmp/d0m.../d0mmy$

AX25 Kernel link is up and running.

SLIP Configuration

Configuring SLIP starting with XNET. Add “start routed” (this is the ax25 router) && “start tcpd” (this is the tcp router) to AUTOEXEC.NET. When XNET restarts, it automatically executes IP.NET.

root@OpenWrt:/# /etc/init.d/xnet stop
root@OpenWrt:/# vi /usr/local/xnet/conf/AUTOEXEC.NET

my call d1mmy
att sdev1 kiss 7 1 115200 /dev/pty/m0

start routed
start tcpd

root@OpenWrt:/#

Then we add XNET's IP address (here: 44.0.0.3, please replace with your local IP addresses), attach slip device to pty m2 (this creates s2 to be used on the Linux side later), we tell XNET the Linux Kernel's IP address (here: 44.0.0.2) and then route traffic for 44.0.0.2 over the slip device.

root@OpenWrt:/# vi /usr/local/xnet/conf/IP.NET

myip 44.0.0.3
att sdeva slip 115200 /dev/pty/m2
arp add 44.0.0.2 slip sdeva
ipr add 44.0.0.2 slip

root@OpenWrt:/#

This IP.NET, of course, only shows the principal entries to get TCPIP and SLIP running. There are multiple additional TCP/IP options/functions that can be configured by the sysop. It is recommended to link your packet radio node to IGATE in order to benefit from improved world-wide IP-over-AX25 functionality. For more information click here http://db0fhn-i.ampr.org/doku.php?id=projects:igate:ipoverigate (in German language).

Next add a symlink for IP.NET to /tmp/xnet. Ideally, this is done through the init.d xnet script (/etc/init.d/xnet). Insert the symlink (ln -s …) after the “mkdir /tmp/xnet” command.

root@OpenWrt:/# vi /etc/init.d/xnet

start() {
(...)
mkdir /tmp/xnet
(...)
ln -s /usr/local/xnet/conf/IP.NET /tmp/xnet/IP.NET
(...)
}

Testing for presence of SDEVA SLIP device:

root@OpenWrt:/# /etc/init.d/xnet start
root@OpenWrt:/#
root@OpenWrt:/# call -r ax0 d1mmy
GW4PTS AX.25 Connect v1.11
*** Connected to d1mmy
Rawmode
(X)NET/LINUX/MIPSel V1.39
=>sys

=>att

SDEV1   : KISS Driver: 115200 Baud

SDEVA   : SLIP Driver: 115200 Baud
=>q

73!
*** Cleared
root@OpenWrt:/#

Now the Kernel needs to be setup so it can talk to XNET via /dev/pty/s2. Here's how it is done:

root@OpenWrt:/#
root@OpenWrt:/# slattach -p slip -s 115200 /dev/pty/s2 -d &
slattach: tty_open: trying to open /dev/pty/s2
slattach: tty_open: /dev/pty/s2 (fd=3) slattach: tty_set_speed: 115200
slattach: tty_set_databits: 8
slattach: tty_set_stopbits: 1
slattach: tty_set_parity: N
slip started on /dev/pty/s2 interface sl0

Assignment of IP address 44.0.0.2 to slip device 'sl0' with mtu of 1500 bytes:

root@OpenWrt:/# ifconfig sl0 44.0.0.2 mtu 1500

Route traffic for XNET ('44.0.0.3') via slip device:

root@OpenWrt:/# route add 44.0.0.3 sl0

And finally route all 44-traffic via XNET ('44.0.0.3') with netmask 255.0.0.0:

root@OpenWrt:/# route add -net 44.0.0.0 netmask 255.0.0.0 gw 44.0.0.3

Testing Kernellink. We ping XNET from OPENWRT:

root@OpenWrt:~# ping 44.0.0.3
PING 44.0.0.3 (44.0.0.3): 56 data bytes
64 bytes from 44.0.0.3: icmp_seq=0 ttl=63 time=6.3 ms

--- 44.0.0.3 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 6.3/6.3/6.3 ms
root@OpenWrt:~#

Testing. We ping Openwrt from XNET:

root@OpenWrt:~# call -r ax0 d1mmy
GW4PTS AX.25 Connect v1.11
*** Connected to d1mmy
Rawmode
(X)NET/LINUX/MIPSel V1.39
=>ping 44.0.0.2

ping to 44.0.0.2 ...

=>
*** route: 44.0.0.2 echo reply 12 ms

=>q
*** Cleared
root@OpenWrt:~#

QUOD ERAT DEMONSTRANDUM.

Init-Skript

Last step: create bootable configuration:

root@OpenWrt:~# vi /etc/init.d/ax25slip
#!/bin/sh /etc/rc.common

START=81

start(){
         sleep 1s
         insmod slip.o
         sleep 1s
         slattach -p slip -s 115200 /dev/pty/s2 -d &
         ifconfig sl0 44.0.0.2 mtu 1500
         route add 44.0.0.3 sl0
         route add -net 44.0.0.0 netmask 255.0.0.0 gw 44.0.0.3
         kissattach /dev/pty/s0 ax0 192.168.255.2
         
         ifconfig ax0 mtu 1500
         echo 1 >/proc/sys/net/ax25/ax0/ip_default_mode
         echo 7 >/proc/sys/net/ax25/ax0/standard_window_size
         echo 500 >/proc/sys/net/ax25/ax0/t1_timeout
         echo 90 >/proc/sys/net/ax25/ax0/t2_timeout
         echo 30000 >/proc/sys/net/ax25/ax0/t3_timeout
         echo 30 >/proc/sys/net/ax25/ax0/maximum_retry_count

         ax25d
       }

stop (){
         killall ax25d
         killall kissattach
         killall slattach
        }

root@OpenWrt:~#
root@OpenWrt:~# ln -s /etc/init.d/ax25slip /etc/rc.d/S81ax25slip
root@OpenWrt:~# 
root@OpenWrt:~# reboot

After reboot from Universe:

root@OpenWrt:~# ps
  PID  Uid     VmSize Stat Command
    1 root        400 S   init
    2 root            SW  [keventd]
    3 root            RWN [ksoftirqd_CPU0]
    4 root            SW  [kswapd]
    5 root            SW  [bdflush]
    6 root            SW  [kupdated]
    8 root            SW  [mtdblockd]
   54 root            SWN [jffs2_gcd_mtd4]
   67 root        412 S   logger -s -p 6 -t
   69 root        404 S   init
   86 root        400 S   syslogd -C16
   89 root        376 S   klogd
  207 root        448 S   udhcpc -t 0 -i eth0.1 -b -p /var/run/eth0.1.pid -R
  373 root        376 S   crond -c /etc/crontabs
  377 root        416 S   /usr/sbin/dropbear -p 22
  385 root        392 S   httpd -p 80 -h /www -r OpenWrt
  396 root        764 S   SCREEN -DmS xnet -c /usr/local/xnet/conf/screen.xnet
  400 root       2848 S   /tmp/xnet/wrtxnet
  412 root        244 S   slattach -p slip -s 115200 /dev/pty/s2 -d
  422 root        312 S   kissattach /dev/pty/s0 ax0 192.168.255.2
  424 root        316 S   ax25d
  443 root        608 S   /usr/sbin/dropbear -p 22
  444 root        580 S   -ash
  451 root        412 R   ps

Update

These Files will not be changed on an update:

ax25-essentials:
/etc/ax25/ax25ipd.conf
/etc/ax25/ax25rtd.conf
/etc/ax25/ax25.profile
/etc/ax25/rxecho.conf
/etc/ax25/ax25d.conf
/etc/ax25/axspawn.conf
/etc/ax25/axports
ax25-helpers:
/etc/ax25/ax25mond.conf
/etc/ax25/rip98d.conf
/etc/ax25/ttylinkd.conf