Jnos and QtSoundModem

Today I was playing with Jnos, on my main system I have BPQ32 running with Direwolf and QtSoundModem. BPQ32 uses the Kiss port on Direwolf and the AGW port on QtSoundModem. Now I know that Jnos can easily handle the AGW interface/driver, so I linked Jnos with the AGW poort of Direwolf.

attach agwpe agw 44.137.31.70 8000
ifconfig agw description "AGW - 1200 baud port"
ax25 hport agw on
trace agw 0111

Direwolf is running on 144.850Mhz 1k2 and 430.950Mhz 9k6

Now I thought it would be nice to hook Jnos to QtSoundModem as well. But BPQ32 already uses the AGW port of QtSoundModem. Now I had read that Maiko VE4KLM had written a Kiss over tcp/ip for Winrpr. Who doesn’t dare don’t win. Here we go.

QtSoundmodem is running on 14.102Mhz 300Baud with 1100Hz on the left channel and 2000Hz on the right channel.

Autoexec.nos

attach winrpr qt0 44.137.31.76 8105
attach kiss qt0 1 qt1
#
ifconfig qt0 description "Kiss tcp/ip port 14.102Mhz 1100Hz"
ifconfig qt1 description "Kiss tcp/ip port 14.102Mhz 2200Hz"
trace qt0 0x211 qt0.log 1000
trace qt1 0x211 qt1.log 1000
#
ax25 hport qt0 on
ax25 hport qt1 on

The winrpr is the kiss over tcp/ip driver of Jnos. It`s written to use with Winrpr.

jnos> ifconfig  
qt1      IP addr 44.137.31.67 MTU 256 Link encap AX25
         Link addr PD9Q-1   BBS PD9Q   Paclen 256   Irtt 5000
         BCText: PD9Q Jnos Packet BBS/Gateway
         flags 0xcb0 trace 0x211 netmask 0x00000000 broadcast 0.0.0.0
         sent: ip 0 tot 0 idle 0:00:01:51
         recv: ip 0 tot 0 idle 0:00:01:51
         descr: Kiss tcp/ip port 14.102Mhz 2200Hz
qt0      IP addr 44.137.31.67 MTU 256 Link encap AX25
         Link addr PD9Q-1   BBS PD9Q   Paclen 256   Irtt 5000
         BCText: PD9Q Jnos Packet BBS/Gateway
         flags 0x400 trace 0x211 netmask 0x00000000 broadcast 0.0.0.0
         sent: ip 0 tot 0 idle 0:00:01:51
         recv: ip 0 tot 0 idle 0:00:01:51
         descr: Kiss tcp/ip port 14.102Mhz 1100Hz

Some trace of the tun0 interface, there is traffic back and forward from Jnos to the remote QtSoundModem.

Mon Feb 21 15:34:09 2022 - tun0 sent:
IP: len 40 44.137.31.67->44.137.31.76 ihl 20 ttl 254 prot TCP
TCP: 1025->8105 Seq x1040001 Ack x3bf15fb1 ACK Wnd 5840

Mon Feb 21 15:34:13 2022 - tun0 recv:
IP: len 159 44.137.31.76->44.137.31.67 ihl 20 ttl 64 DF prot TCP
TCP: 8105->1025 Seq x3bf15fb1 Ack x1040001 ACK PSH Wnd 64240 Data 119
0000  ....n......b...a..033  .IR2UFV-15  00:00:06:12  14.1033  .IW7DVM
0040       00:00:08:37  14.1033  .SM7PET+    00:00:12:36  14.

Mon Feb 21 15:34:13 2022 - tun0 recv:
IP: len 159 44.137.31.76->44.137.31.67 ihl 20 ttl 64 DF prot TCP
TCP: 8105->1025 Seq x3bf15fb1 Ack x1040001 ACK PSH Wnd 64240 Data 119
0000  ....n......b...a..033  .IR2UFV-15  00:00:06:12  14.1033  .IW7DVM
0040       00:00:08:37  14.1033  .SM7PET+    00:00:12:36  14.

Mon Feb 21 15:34:13 2022 - tun0 sent:
IP: len 40 44.137.31.67->44.137.31.76 ihl 20 ttl 254 prot TCP
TCP: 1025->8105 Seq x1040001 Ack x3bf16028 ACK Wnd 5840

Here is a trace of the log file (trace qt0 0x211 qt0.log 1000)

Mon Feb 21 15:25:03 2022 - qt0 recv:
KISS: Port 0 Data
AX25: UT1HZM->SM7PET I(P) NR=2 NS=3 pid=Text
0000  00 a6 9a 6e a0 8a a8 e0 aa a8 62 90 b4 9a 61 56  .&.n .(`*(b.4.aV
0010  f0 4d 69 6e 65 2c 20 4c 3e 20 43 61 6c 6c 2c 20  pMine, L> Call, 
0020  4c 3c 20 43 61 6c 6c 2c 20 4c 40 20 3d 20 4c 69  L< Call, L@ = Li
0030  73 74 20 74 6f 2c 20 66 72 6f 6d 20 6f 72 20 61  st to, from or a
0040  74 0d 20 20 20 4c 4c 20 6e 75 6d 20 3d 20 4c 69  t.   LL num = Li
0050  73 74 20 6d 73 67 20 6e 75 6d 2c 20 4c 20 6e 75  st msg num, L nu
0060  6d 2d 6e 75 6d 20 3d 20 4c 69 73 74 20 52 61 6e  m-num = List Ran
0070  67 65 0d 20 20                                   ge.

Mon Feb 21 15:25:17 2022 - qt0 recv: 
KISS: Port 0 Data 
AX25: IW7DVM->APRS v WIDE3-3 UI pid=Text
0000  00 82 a0 a4 a6 40 40 e0 92 ae 6e 88 ac 9a 60 ae  .. $&@@`..n.,.`.
0010  92 88 8a 66 40 67 03 f0 21 34 30 32 33 2e 32 38  ...f@g.p!4023.28
0020  4e 5c 30 31 37 31 37 2e 31 31 45 2d 48 46 20 42  N\01717.11E-HF B
0030  65 61 63 6f 6e 20 31 34 2e 31 30 35 20 4c 53 42  eacon 14.105 LSB
0040  20 33 30 30 62 64 20 2d 20 54 61 72 61 6e 74 6f   300bd - Taranto

Connect from my Jnos system to UT1HZM on port qt0 (qtsoundmodem 300Baud 1100Hz port)

Mon Feb 21 15:08:33 2022 - qt0 recv:
KISS: Port 0 Data
AX25: UT1HZM->PD9Q-15 I(P) NR=0 NS=0 pid=Text
0000  00 a0 88 72 a2 40 40 fe aa a8 62 90 b4 9a 61 10  . .r"@@~*(b.4.a.
0010  f0 55 54 31 48 5a 4d 7d 20 57 61 69 74 2e 2e 2e  pUT1HZM} Wait...
0020  0d                                               .

Mon Feb 21 15:08:33 2022 - qt0 sent:
KISS: Port 0 Data
AX25: PD9Q-15->UT1HZM RR(F) NR=1
0000  00 aa a8 62 90 b4 9a 60 a0 88 72 a2 40 40 ff 31  .*(b.4.` .r"@@.1

Mon Feb 21 15:08:38 2022 - qt0 recv:
KISS: Port 0 Data
AX25: UT1HZM->PD9Q-15 I NR=0 NS=1 pid=Text
0000  00 a0 88 72 a2 40 40 fe aa a8 62 90 b4 9a 61 02  . .r"@@~*(b.4.a.
0010  f0 4b 52 53 3a 55 54 31 48 5a 4d 2d 35 7d 20 43  pKRS:UT1HZM-5} C
0020  6f 6e 6e 65 63 74 65 64 20 74 6f 20 42 42 53 0d  onnected to BBS.

Mon Feb 21 15:08:39 2022 - qt0 sent:
KISS: Port 0 Data
AX25: PD9Q-15->UT1HZM RR NR=2
0000  00 aa a8 62 90 b4 9a 60 a0 88 72 a2 40 40 ff 41  .*(b.4.` .r"@@.A

Now the trace of port qt1 (tail -f qt1.log)

Mon Feb 21 15:22:31 2022 - qt1 sent:
KISS: Port 1 Data
AX25: PD9Q-15->TEST SABM(P)
0000  10 a8 8a a6 a8 40 40 e0 a0 88 72 a2 40 40 7f 3f  .(.&(@@` .r"@@.?

Mon Feb 21 15:22:31 2022 - qt1 sent:
KISS: Port 1 Data
AX25: PD9Q-15->TEST SABM(P)
0000  10 a8 8a a6 a8 40 40 e0 a0 88 72 a2 40 40 7f 3f  .(.&(@@` .r"@@.?

Boooommm Crashed……dammmm

It went so well. But now Jnos crashed. The winrpr driver is probably not written for two ports. Receiving is fine, but a packet that leaves the system on port qt1, Jnos can’t handle that.

So I removed this line (attach kiss qt0 1 qt1) from autoexec.nos and Jnos is running just fine. It is a pity that it only runs on 1 port, and that is the same as the AGW port. Maybe Maiko VE4KLM will look at it again.

Direwolf Vs QtSoundModem (part 2)

Rx Only

Okay, that was a bit of a disappointment. I ran the test at 14.1022Mhz on 300 Baud. I think the conditions were very bad in those 24 hours.

For the test I use Kissutil.

https://www.mankier.com/1/kissutil

kissutil  can be used interactively for troubleshooting a KISS TNC. It is usable with direwolf and other generic KISS TNCs connected to a serial port. It can also be used as an application interface where each side places files in a directory for the other to process.

First I wrote two start files for the test.

Direwolf.sh

#!/bin/bash
cd /home/niels/testbed/
./kiss-direwolf -p 8009 -o /home/niels/testbed/rec-direwolf

Qtsm.sh

#!/bin/bash
cd /home/niels/testbed/
./kiss-qtsm -p 8105 -o /home/niels/testbed/rec-qtsm

The test ran for 24 hours, which is 86400 seconds.

timeout -s 9 86400 ./qtsm.sh

After 24 hours I can start counting the received frames.

As you can see this is very disappointing. Now I understand that the focus of QtSoundModem is more in the HF area. With a difference of 4 frames, the difference between Direwolf and QtSoundModem is minimal. In fact, too few frames were received in the 24 hours to make a good comparison. Is my opinion.

The next test we will try on 144.800Mhz the local Aprs frequency.

Direwolf Vs QtSoundModem (part 1)

This is about RX and not TX.

This has caused some headaches. I want to use one trx and one antenna for this test. (Icom 7300 and a Hyendfed)Now the problem is that Direwolf and QtSoundModem both use the sound card. Now you can’t both use the same sound card at the same time. So we will have to use two virtual sound cards and route the audio to these sound cards.  For this I use “pactl” with this I can manipulate the PulseAudio server.

pactl load-module module-virtual-sink sink_name=direwolf
And
pactl load-module module-virtual-sink sink_name=qtsoundmodem

Actually we are making a virtual audio card for Direwolf and QtSoundModem. Now we need to route the Audio from the input to the virtual audio card. This is possible with PavuControl.

Setup Direwolf

ADEVICE pulse
ACHANNELS 1
CHANNEL 0
MYCALL N0CALL
MODEM 300 1000 1200
AGWPORT 8008
KISSPORT 8009

Uhmmmmm port 8001.  I don’t understand that yet, in the config it really is port 8009.

Setup QtSoundModem

 

Now I haven’t fully read up on PulseAudio and pactl and the virtual cable/cards. Perhaps my wording and references are not quite correct.

Now I have the opportunity to test…..

The Future of AX.25

Oooo man this is totally awesome. ARDC has grant an amount of 180 thousand dollars for fixing the AX.25 stack/kernel.

https://www.ampr.org/grants/grant-fixing-the-linux-kernel-ax-25/

Grant: Fixing the Linux kernel AX.25
Date: December 2021
Amount: €179,690
Changes to the Linux kernel over the years have improved and modernized the kernel, but have also made existing AX.25 implementations incompatible and turned preexisting issues into bugs. This can make systems unpredictable or even unusable. Linux kernel development is complex, requiring deep specialized knowledge, and bugs are hard to trace. This may be one of the reasons, why the Linux kernel AX.25 stack is currently in such a bad state.

This ARDC grant funds will allow the Deutscher Amateur Radio Club to hire software developers who can create a stable Linux AX.25 implementation and prevent Linux distributions from dropping pre-compiled AX.25 support. The fixed and functional Kernel-AX.25 stack will improve global amateur radio infrastructure. Professional kernel development can bring Linux AX.25 back to life.

Learn more at https://www.linux-ax25.org/wiki/Main_Page.

This is killing 🙂

Netrom Tutorial (n2nov)

Charles N2NOV has written a fantastic document with a clear explanation about netrom quality`s and parameters.

Setting NetRom Parameters
I was looking at the old NEDA (NorthEast Digital Association) newsletters from twenty years ago (1999) and want to show you some pertinent NetRom parameters that might help with the bloated (some up to 800) nodes lists that we see from time to time. These started as X1J parameters, but you might find them useful to give you an idea how to tweak your BPQ, Xrouter, *NOS, Flex, etc systems. Each program might use a different naming convention, but reading the details of your documentation will align to NEDA labels. As always, adjustments can be made for a non-standard configurations like full duplex data repeaters, etc. Feel free to discuss the technical points here, but gear the explanation for the newer sysops. The parameters are broken down differently by the type of connection you have with another station (mostly RF-based). Adaption to an AXIP link via wired internet should follow the Dedicated Point-to-Point Link (DPPL).

USER PORT (typical 2 meter port):
No node table is broadcast to keep the channel clear. Do this by setting Initial (Default) Obsolescence at 5 and the Minimum Obsolescence to 6. Since the default is lower than the cutoff, it will never broadcast. 

DPPL (only two backbone users on a dedicated frequency) [or AXIP]:
Your partner station should be a locked route with quality of 203.
Accept incoming nodes from your partner with minimum quality of 63. 
Initial (Default) Obsolescence at Minimum Obsolescence to 3
Nodes Broadcast Interval 900 seconds (15 minutes)
The obsolescence count will start at 5 and decrement by 1 every 15 minute cycle and stop when it hits 3 if there is no refresh from your partner station. This keeps things clean and updated within 30 minutes.

Multiway Backbone with 3 Partners (typically 220 Mhz regional channel):
Your partner station should be a locked route with quality of 203.
Accept incoming nodes from your partner with minimum quality of 63.
Initial (Default) Obsolescence at 5
Minimum Obsolescence to 2
Nodes Broadcast Interval 900 seconds (15 minutes)
The obsolescence count will start at 5 and decrement by 1 every 15 minute cycle and stop when it hits 2 if there is no refresh from your partner station. This keeps things clean and updated within 45 minutes. This allows for occasional transmitter collisions between partners.
NOTE: current practice is to set minimum quality values at 150 or 180 is only to mitigate the effect of mislabeled nodes qualities broadcast to partner systems that get propagated. There are several systems that make all of the nodes in their table higher than they should be. When the network is cleaned out and realigned, then the minimum quality can be adjusted downward.
How are node qualities adjusted when the nodes table is passed around the network from partner to partner?

*** ONLY WHAT IS ON YOUR PHYSICAL BOX OR WIRED LAN SHOULD BE HIGHER THAN 203 ***
Initial partner default quality is  203 (out of 256)  or 203/256
First hop between AXIP partners is  203/256 * 203/256 or 161/256
Second hop between AXIP partners is 161/256 * 203/256 or 128/256
Third hop between AXIP partners is  128/256 * 203/256 or 101/256
Fourth hop between AXIP partners is 101/256 * 203/256 or 80/256
Fifth hop between AXIP partners is  80/256  * 203/256 or 63/256

Let's look at how various stations relate to each other on the NetRom nodes list. First, each station sets their partners at a default value of 203 if on AXIP or DPPL. This is only the value between the two stations talking to each other. Here are some of my forwarding partners and some of their other partners.

Second, let's look at how those next-line stations actually calculate to my station. If my partner is 203/256 (or about 80% reliability) and so is their partner, then the second-level station is not going to be 80% reliability to me. BBGATE:AA6HF-4 is 80% to me on a direct connection, but has to be less when going through LAXNET:N6ROE-3.

By doing the calculation of each level's reliability of 203/256 against the next level,
we get 203/256 x 203/256 (same as 0.79296875 x 0.79296875) or 161/256 (0.628799438476).

If we extend this exercise by multiplying against the next level of 203/256 we get:

Going down level by level we get values of 128 (X), 101 (Y), 80 (Z), etc.
By setting MIN QUALITY you can cut off how many levels (hops) you want to see.
MIN QUAL 161 lets me see all stations closer to me above the level that X is on.
MIN QUAL 128 allows me to see down to the level of X.
MIN QUAL 101 allows me to see down to the level of Y.
MIN QUAL 80  allows me to see down to the level of Z.

Direwolf 1.7 Dev branch support IL2P

Yes I know i`m a few steps behind, but great news. Direwolf is also support IL2P.

### New Features: ###

- Improved Layer 2 Protocol [(IL2P)](https://en.wikipedia.org/wiki/FX.25_Forward_Error_Correction).  Use "-I 1" on command line to enable transmit for first channel.  Compatible with Nino TNC for 1200 and 9600 bps.

- Limited support for CM109/CM119 GPIO PTT on Windows.

- Dire Wolf now advertises itself using DNS Service Discovery. This allows suitable APRS / Packet Radio applications to find a network KISS TNC without knowing the IP address or TCP port. Thanks to Hessu for providing this.  Currently available only for Linux and Mac OSX.  [Read all about it here.](https://github.com/hessu/aprs-specs/blob/master/TCP-KISS-DNS-SD.md)

- The transmit calibration tone (-x) command line option now accepts a radio channel number and/or a single letter mode:  a = alternate tones, m = mark tone, s = space tone, p = PTT only no sound.

- The BEACON configuration now recognizes the SOURCE= option.  This replaces the AX.25 source address rather than using the MYCALL value for the channel.  This is useful for sending more than 5 analog telemetry channels.  Use two, or more, source addresses with up to 5 analog channels each.

- For more flexibility, the FX.25 transmit property can now be set individually by channel, rather than having a global setting for all channels.  The -X on the command line applies only to channel 0.  For other channels you need to add a new line to the configuration file.

    > After:   "CHANNEL 1"   (or other channel)
    >
    > Add:     "FX25TX 1" (or 16 or 32 or 64)

https://en.wikipedia.org/wiki/Improved_Layer_2_Protocol

IL2P (Improved Layer 2 Protocol) is a data link layer protocol originally derived from layer 2 of the X.25 protocol suite and designed for use by amateur radio operators. It is used exclusively on amateur packet radio networks.

IL2P occupies the data link layer, the second layer of the OSI model. It is responsible for establishing link-layer connections, transferring data encapsulated in frames between nodes, and detecting errors introduced by the communications channel.

The Improved Layer 2 Protocol (IL2P) was created by Nino Carrillo, KK4HEJ, based on AX.25 and implements Reed Solomon Forward Error Correction for greater accuracy and throughput than either AX.25 or FX.25. Specifically, in order to achieve greater stability on links exceeding speeds of 1200 baud.

IL2P can be used with a variety of modulation methods including AFSK and GFSK. The direwolf software TNC contains the first open source implementation of the protocol.

So now let`s get the “Dev” branch and start playing with IL2P.

git clone https://github.com/wb2osz/direwolf.git
cd direwolf
git branch -r
git checkout dev
mkdir build && cd build
cmake ..
make update-data
make -j4
sudo make install
make install-conf

XRpi axip link with Jnos

Jean VE2PKT has made a great howto, how to get the TUN interface going on XRpi and setup a AXIP link with Jnos.

First setup XRpi TUN interface – XROUTER.CFG

INTERFACE=5 
 ID=Tunnel to Linux 
 TYPE=TUN 
 COM=tun99 
 PROTOCOL=IP 
 IOADDR=192.168.25.98  # Chose and free address from your LAN , this will become the linux address of your TUN
 MTU=1500 
ENDINTERFACE 

#Create a TUN Port:
 
PORT=1 
 ID="Tunnel Linux <> XR" 
 INTERFACENUM=5 
 ipaddress=192.168.25.4   # This is my Xrouter ipaddress
ENDPORT 

Next setup a AXIP link in XRpi – XROUTER.CFG

# AXIP link
PORT=3
 ID=AXIP Link with JNos (VA2OM-5)
 INTERFACENUM=2
 IPLINK=192.168.25.228
 QUALITY=255
 MINQUAL=100
 FRACK=2000
 RESPTIME=200
 RFBAUDS=56000
 MHEARD=5
ENDPORT

Setup XROUTER.SYS

ip route default 1 192.168.25.1 d                  # Default routing
ip route add 192.168.25.0/24 192.168.25.98 1 d     # Xrouter TUN linux side Address
ip route add 192.168.25.228/32 192.168.25.249 1 d  # .228 is is my Jnos IP address
                                                   # .249 is my Linux Ip Address 
ip route add 44.0.0.0/9 44.135.49.65 3 e           # Forward all my AMPR.Org traffic to my  Jnos
ip  route add 44.128.0.0/10 44.135.49.65 3 e

Setup BOOTCMDS.SYS

#!/bin/bash
shell /usr/sbin/arp -i eth0 -Ds 192.168.25.4 eth0 pub

Now it`s time to setup Jnos – AUTOEXEC.NOS

1st: Create a TUN in Jnos
#
#
attach tun tun0 1500 0
#
ifconfig tun0 ipaddress 192.168.25.228
ifconfig tun0 netmask 255.255.255.0
ifconfig tun0 mtu 1500
#
# 192.168.25.249  is my Jnos Linux TUN address
# 192.168.25.228 is my Jnos IP address
# 192.168.25.247 is my Linux IP address
#
shell ifconfig tun0 192.168.25.249 pointopoint 192.168.25.228 mtu 1500 up
pause 3
shell ip route add 192.168.25.228 dev tun0 table 44 src 192.168.25.247
shell /usr/sbin/arp -i eth0 -Ds 192.168.25.228 eth0 pub
#
route add default tun0 192.168.25.247 # raspberry PI


2sd: Make a AXIP Link Jnos <> Xrouter

#
attach axip om-4 256 192.168.25.249  # Use the Linux TUN ip address
ifconfig om-4 description "Link with VA2OM-4 XRPI"

 

Brian Rogers N1URO – Silent Key

Mail of Brian Webster N2KGC – President EastNet Amateur Radio Network

It is with great sadness that I pass along the news that Brian Rogers N1URO
is now a silent key. He passed on Tuesday evening January 4th, 2022.

Brian was the author of the URONode packet radio software and past president
of the Eastnet Amateur Radio Network (https://www.eastnetpacket.org/). He
was an avid packet user and contributor to various software packages, not
just his own. He was also the AmprNet coordinator for the states of MA, NH,
VT, PA, MD, DE, CT, RI and ME.

Professionally his was an IT consultant and ran his company Network
Continuum Connecticut (https://www.nc-ct.net/)

He was a mentor to many who wanted to operate packet nodes or set up an
apmr.org station. He had a broad knowledge of many other node operating
systems, keeping nodes of all types running at his QTH. He was a wealth of
detailed knowledge and will be missed immensely.

Side Note

This is very sad news. I have been in regular contact with him over the
years. He was always willing to help you with packet/amprnet related
things. He always had his own opinion on certain things, and he
couldn’t be changed. I didn’t always appreciate this. He will be
missed, packet land is a bit more empty.

Till next time.

N1URO to PI1LAP ttl 25 cct=01F0 <DISC REQ>
04:55:35T PI1LAP>N1URO Port=7 <RR R F R5>
04:55:35T PI1LAP>N1URO Port=7 <I C P S7 R5> NET/ROM
PI1LAP to N1URO ttl 25 cct=035D <DISC ACK>

73 Niels PD9Q

Udev Rules in Linux

I became very frustrated with the fact that my USB ports kept changing. I have a TNC2S 1k2 for Aprs and an SCS Tracker for Robust Packet connected to my Pi. The Icom 7300 is controlled via HamLib on another Raspberry Pi. But once it was necessary to reboot the PI running Linbpq , the ttyUSB0 or the ttyUSB1 would keep changing places. Conclusion, I had to adjust the bpq32.cfg again before everything worked the way I wanted.

Now it is quite easy to do something about this. Call me Lazy because it took so long.

Udev rules look like this

SUBSYSTEM=="tty", ATTRS{idVendor}=="067b", ATTRS{idProduct}=="2303",
SYMLINK+="ttyTNC2S

Now, of course, we first have to find out what the “idVendor” and “idProduct” is.

With the command….

udevadm info -a -n /dev/ttyUSB0

We get a long list of data from usb to serial port ttyUSB0.

With this information we can create an udev rule.

sudo nano etc/udev/rules.d/99-usb-serial.rules
SUBSYSTEM=="tty", ATTRS{idVendor}=="067b", ATTRS{idProduct}=="2303",
SYMLINK+="ttyTNC2S
udevadm control --reload
reboot

This has been done for both sides. Both ttyUSB0 and ttyUSB1. And look there are the ttyTNC2S and ttySCS ports. Now you can restart Linux as often as you want and trust that the same USB port is always assigned to the right box.

Now my port config looks like this in bpq32.cfg.

PORT
 PORTNUM=3
 ID=14.1022 RPR ;(RPR)
 TYPE=EXTERNAL 
 COMPORT=/dev/ttySCS
 SPEED=38400
 DRIVER=SCSTracker
 CONFIG
RIGCONTROL
HAMLIB 44.137.31.76:4532
14.1022,USB,F1,H1
****
WL2KREPORT PUBLIC, api.winlink.org, 80, PI8LAP-10, JO11VN, 00-23, 14102200, ROBUST, 25, 35, 3
WL2KREPORT PUBLIC, api.winlink.org, 80, PI8LAP-10, JO11VN, 00-23, 14102200, PKT300, 25, 35, 3
WL2KREPORT PUBLIC, api.winlink.org, 80, PI8LAP-10, JO11VN, 00-23, 144850000, PKT1200, 10, 20, 5, 0
WL2KREPORT PUBLIC, api.winlink.org, 80, PI8LAP-10, JO11VN, 00-23, 430950000, PKT9600, 10, 20, 5, 0
;#
  M UISC
  O 4                   ; MAXFRAME
  F 190                 ; FRACK
  T 8                   ; TX Delay
  FORCE ROBUST
  USEAPPLCALLS          ; Accept connects to all APPLCALLS
  BEACONAFTERSESSION    ; Beacon after session
  %L 1500               ; Centre Freq for Normal Packet (Default is 1500)
  @I 64                 ; Paclen = 60
  %T 1                  ; TX Autotracking 1 = on
  %N 10
  %B 300
ENDPORT

Great…..