Table of Contents

Example AX.25 config files using systemd

systemd files in /etc/systemd/system

ax25dev.service

[Unit]
Description=AX.25 device
BindsTo=direwolf.service
Requires=direwolf.service
After=direwolf.service

[Service]
# Use for debug
Type=oneshot
ExecStart=/bin/bash -c '/etc/ax25/ax25-upd'
RemainAfterExit=yes

# Install KISS Parameter: P=32, W=200, TX-Delay=500
#  -l txtail   Sets the TX Tail time in milliseconds, in steps of ten milliseconds only
#  -r persist  Sets the persist value. range 0 to 255.
#  -s slottime Sets  the slottime in milliseconds, in steps of ten milliseconds only
#  -t txdelay  Sets the TX Delay in milliseconds, in steps of ten milliseconds only

ExecStartPost=/bin/bash -c '/usr/local/sbin/kissparms -p udr0 -f no -l 30 -r 128 -s 20 -t 400'

ExecStop=/bin/bash -c '/etc/ax25/ax25-downd'

[Install]
WantedBy=multi-user.target

ax25-mheard.service

[Unit]
Description=AX.25 mheard daemon
After=ax25dev.service
After=sys-subsystem-net-devices-ax0.device
BindsTo=sys-subsystem-net-devices-ax0.device

[Service]
ExecStart=/usr/local/sbin/mheardd -f -n 150
#RestartSec=1min
#Restart=on-failure

[Install]
WantedBy=multi-user.target

ax25dev.path

[Path]
PathExists=/tmp/kisstnc

[Install]
WantedBy=multi-user.target

ax25d.service

Unit]
Description=General purpose AX.25 daemon
After=ax25dev.service
After=sys-subsystem-net-devices-ax0.device

[Service]
ExecStart=/usr/local/sbin/ax25d -l

[Install]
WantedBy=multi-user.target

direwolf.service

[Unit]
Description=Direwolf Daemon
After=sound.target

[Service]
ExecStartPre=/bin/rm -f /tmp/kisstnc
ExecStart=/usr/bin/direwolf -t 0 -c /etc/direwolf.conf -p
ExecStop=/bin/rm -f /tmp/kisstnc

[Install]
WantedBy=multi-user.target
DefaultInstance=1

Files in /etc

direwolf.conf

#############################################################
#                                                           #
#               Configuration file for Dire Wolf            #
#                                                           #
#                   Linux version                           #
#                                                           #
#############################################################
#
# Consult the User Guide for more details on configuration options.

#############################################################
#                                                           #
#               FIRST AUDIO DEVICE PROPERTIES               #
#               (Channel 0 + 1 if in stereo)                #
#                                                           #
#############################################################


ADEVICE plughw:CARD=udrc,DEV=0 plughw:CARD=udrc,DEV=0

ACHANNELS 2

#############################################################
#                                                           #
#               CHANNEL 0 PROPERTIES                        #
#                                                           #
#############################################################

CHANNEL 0
PTT GPIO 12
MODEM 1200
MYCALL N7NIX-1

#############################################################
#                                                           #
#               CHANNEL 1 PROPERTIES                        #
#                                                           #
#############################################################

CHANNEL 1
PTT GPIO 23
MODEM 1200
MYCALL N7NIX-2

#############################################################
#                                                           #
#               VIRTUAL TNC SERVER PROPERTIES               #
#                                                           #
#############################################################

AGWPORT 8000
KISSPORT 8001

Files in /etc/ax25

ax25dev-parms

#!/bin/bash

if [[ $# -gt 0 ]] ; then
   Device=$1
else
   awk '/device/ { print $7 }' /tmp/ax25-config.tmp > /tmp/ax25-config-tmp
   read Device < /tmp/ax25-config-tmp

   if [[ -z "$Device" ]] ; then
      Device="ax0"
      echo "Set Device to default: $Device"
   fi
fi

echo "Using Device = $Device"

if [ -d /proc/sys/net/ax25/$Device ] ; then
 PARMDIR="/proc/sys/net/ax25/$Device"
# Parms for a USER Port
echo 3000    > $PARMDIR/t1_timeout		# (Frack) /1000 = ? Sec
echo 1000    > $PARMDIR/t2_timeout 		# (RESPtime) /1000 = ? sec
echo 300000  > $PARMDIR/t3_timeout 		# (Check) /6000 = ? Min
echo 900000  > $PARMDIR/idle_timeout		# Idle Timer /6000 = ? min
echo 2       > $PARMDIR/standard_window_size	# Outstanding Frames
echo 12      > $PARMDIR/maximum_retry_count	# Max Retrys
echo 256     > $PARMDIR/maximum_packet_length	# Paclen
echo 0       > $PARMDIR/ax25_default_mode
echo 0       > $PARMDIR/ip_default_mode
echo 0       > $PARMDIR/backoff_type
echo 2       > $PARMDIR/connect_mode
#echo 180000 > $PARMDIR/dama_slave_timeout
echo 32      > $PARMDIR/extended_window_size
echo 0       > $PARMDIR/protocol

        ifconfig $Device netmask 255.255.255.255
        echo " Port ${PORTNAME} attached to ${Device} "
else
        echo "** Error setting Device: $Device parms**"
fi
echo "ax25dev-parms finished"
exit 0

ax25-upd

#!/bin/bash
#
# ax25-upd for use with systemd & direwolf
# Ax25, rose, & mkiss - are pre-loaded via /etc/modules or built into kernel
#
# Uncomment this statement for debug echos
DEBUG=1

SBINDIR=/usr/local/sbin
BINDIR=/usr/local/bin
UDRCII=false

# portname set in /etc/ax25/axports
PORTNAME_1="udr0"
PORTNAME_2="udr1"
SERIALPORT_DIREWOLF="/tmp/kisstnc"

firmware_prodfile="/sys/firmware/devicetree/base/hat/product"
firmware_prod_idfile="/sys/firmware/devicetree/base/hat/product_id"
firmware_vendorfile="/sys/firmware/devicetree/base/hat/vendor"

PROD_ID_NAMES=("INVALID" "INVALID" "UDRC" "UDRC II" "DRAWS" "1WSpot")
NWDIG_VENDOR_NAME="NW Digital Radio"

function dbgecho { if [ ! -z "$DEBUG" ] ; then echo "$*"; fi }

# ===== function EEPROM id_check

# Return code:
# 0 = no EEPROM or no device tree found
# 1 = HAT found but not a UDRC
# 2 = UDRC
# 3 = UDRC II
# 4 = DRAWS
# 5 = 1WSpot

function id_check() {
# Initialize to EEPROM not found
udrc_prod_id=0

# Does firmware file exist
if [ -f $firmware_prodfile ] ; then
   # Read product file
   UDRC_PROD="$(tr -d '\0' < $firmware_prodfile)"
   # Read vendor file
   FIRM_VENDOR="$(tr -d '\0' < $firmware_vendorfile)"
   # Read product id file
   UDRC_ID="$(tr -d '\0' < $firmware_prod_idfile)"
   #get last character in product id file
   UDRC_ID=${UDRC_ID: -1}

   dbgecho "UDRC_PROD: $UDRC_PROD, ID: $UDRC_ID"

   if [[ "$FIRM_VENDOR" == "$NWDIG_VENDOR_NAME" ]] ; then
      case $UDRC_PROD in
         "Universal Digital Radio Controller")
            udrc_prod_id=2
         ;;
         "Universal Digital Radio Controller II")
            udrc_prod_id=3
         ;;
         "Digital Radio Amateur Work Station")
            udrc_prod_id=4
         ;;
         "1WSpot")
            udrc_prod_id=5
         ;;
         *)
            echo "Found something but not a UDRC: $UDRC_PROD"
            udrc_prod_id=1
         ;;
      esac
   else

      dbgecho "Probably not a NW Digital Radio product: $FIRM_VENDOR"
      udrc_prod_id=1
   fi

   if [ udrc_prod_id != 0 ] && [ udrc_prod_id != 1 ] ; then
      if (( UDRC_ID == udrc_prod_id )) ; then
         dbgecho "Product ID match: $udrc_prod_id"
      else
         echo "Product ID MISMATCH $UDRC_ID : $udrc_prod_id"
         udrc_prod_id=1
      fi
   fi
   dbgecho "Found HAT for ${PROD_ID_NAMES[$UDRC_ID]} with product ID: $UDRC_ID"
else
   # RPi HAT ID EEPROM may not have been programmed in engineering samples
   # or there is no RPi HAT installed.
   udrc_prod_id=0
fi

return $udrc_prod_id
}

# ===== main =====

echo "ax25-upd: Start Port ${PORTNAME_1} with device ${SERIALPORT_DIREWOLF}"

if [ -L $SERIALPORT_DIREWOLF ] ; then
    echo "Direwolf serial port ready"
else
    echo "Direwolf serial port NOT FOUND"
d    exit 1
fi

# Check which UDRC product is found
id_check
id_check_ret="$?"

# Initialize kissattach return code
kissattach_ret=-1

case $id_check_ret in
0|1)
   echo "No UDRC found, exiting"
   exit 1
;;
2)
   echo "Original UDRC is installed."
# use port 1 with mkiss
   pseudoterm=$($SBINDIR/mkiss $SERIALPORT_DIREWOLF /dev/ptmx none | tail -1)
   echo "using mkiss with UDRC and pseudo term=$pseudoterm on port 1"
   $SBINDIR/kissattach  ${pseudoterm} ${PORTNAME_1} 44.24.197.66 >/tmp/ax25-config.tmp
   kissattach_ret=$?
   dbgecho "kissattach return: $?"
   /etc/ax25/ax25dev-parms ax0
;;
3|4)
   echo "UDRC II or DRAWS installed"
# use port 2 with mkiss
   pseudoterm=$($SBINDIR/mkiss $SERIALPORT_DIREWOLF /dev/ptmx /dev/ptmx | tail -1)
   echo "$pseudoterm" > /tmp/ax25-config.tmp
   pseudoterm_1=$(echo $pseudoterm | cut -d ' ' -f1)
   pseudoterm_2=$(echo $pseudoterm | cut -d ' ' -f2)
   echo "using mkiss with UDRC II and pseudo term_1: $pseudoterm_1 pseudo term_2: $pseudoterm_2"
   $SBINDIR/kissattach  ${pseudoterm_1} ${PORTNAME_1} 44.24.197.66 >/tmp/ax25-config_1.tmp
   $SBINDIR/kissattach  ${pseudoterm_2} ${PORTNAME_2} 44.24.197.67 >/tmp/ax25-config_2.tmp
   kissattach_ret=$?
   dbgecho "kissattach return: $?"
   /etc/ax25/ax25dev-parms ax0
   /etc/ax25/ax25dev-parms ax1
   echo " Port ${PORTNAME_1} attached to ax0"
   echo " Port ${PORTNAME_2} attached to ax1"
;;
5)
   echo "One Watt Spot installed"
# use port 1 with mkiss
   pseudoterm=$($SBINDIR/mkiss $SERIALPORT_DIREWOLF /dev/ptmx none | tail -1)
   echo "using mkiss with UDRC and pseudo term=$pseudoterm on port 1"
   $SBINDIR/kissattach  ${pseudoterm} ${PORTNAME_1} 44.24.197.66 >/tmp/ax25-config.tmp
   kissattach_ret=$?
   dbgecho "kissattach return: $?"
   /etc/ax25/ax25dev-parms ax0
;;
*)
   echo "Invalid udrc id ... exiting"
   exit 1
;;
esac

# configure netrom
# Needs a callsign
# source /home/pi/n7nix/systemd/ax25/nr-up.sh

# AX25-upd (End)
echo
echo "ax25-upd script finished"
exit 0

ax25-downd

#!/bin/bash
#
SBINPATH="/usr/local/sbin"

echo "ax25-downd start"
# Stop FPAC
#    /usr/local/sbin/myfpac.sh stop

# Stop Ax25 support
#  for PROC_NAME in beacon ax25d ax25ipd ax25rtd mheardd listen saxIgate
  for PROC_NAME in beacon ax25d ax25ipd ax25rtd mheardd saxIgate
    do
      PID=`/bin/pidof -x $PROC_NAME`
      if [ -n "$PID" ]; then
         kill -TERM $PID > /dev/null
         echo "$PROC_NAME - $PID "
         sleep 1
      fi
    done

# If netromd is running
  pidof netromd > /dev/null
  if [ $? -eq 0 ]; then

# Save NetRom routes
   $SBINPATH/nodesave -p $SBINPATH /var/ax25/nrsave && echo "N/R routes saved"

# Stop NetRom
    killall netromd > /dev/null
    echo "Netrom Stopped"
  else
    echo "Netrom daemon not running"
  fi

# Close sockets
echo "Detach Ax/Nr/Sp Devices"

ifconfig|grep AMPR > /tmp/ax25-config.tmp

i=0
iface=$(awk ' NR == '1' { print $1 }' /tmp/ax25-config.tmp)

while [ "$iface" != "" ] ; do
   let i=i+1
   iface=$(awk ' NR == '$i' { print $1 }' /tmp/ax25-config.tmp)
   if [ "$iface" != "" ] && [ "${iface:0:2}" == "nr" ] ; then
#      echo "select: $iface, iface: ${iface:0:2}"
      ifconfig "$iface" down
      echo " $iface down"
  fi
done

# Stop Kissattach
killall -KILL kissattach > /dev/null
# Empty Heard List
#cat /dev/null > /var/ax25/mheard/mheard.dat

# End of ax25-down
echo "ax25-downd finished"
exit 0

axports

# /usr/local/etc/ax25/axports
#
# Use simple descriptive names for the ports, to make debugging 
# other associated software easier.

#
# The format of this file is:
#portname	callsign	speed	paclen	window	description
udr0            N7NIX-10        9600    255     2       Winlink

ax25d.conf

# /usr/local/etc/ax25/ax25d.conf
#
# ax25d Configuration File.
#
#
[N7NIX-10 VIA udr0]
NOCALL   * * * * * *  L
NOCALL   * * * * * *  L
default  * * * * * *  -	rmsgw /usr/local/bin/rmsgw rmsgw -l debug -P %d %U
#
[N7NIX VIA udr0]
NOCALL   * * * * * *  L
default  * * * * * *  0  gunn  /usr/local/bin/wl2kax25d wl2kax25d -c %U -a %d
#