EPICS Controls Argonne National Laboratory

Experimental Physics and
Industrial Control System

1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  <20142015  2016  2017  2018  2019  2020  2021  2022  2023  2024  Index 1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  <20142015  2016  2017  2018  2019  2020  2021  2022  2023  2024 
<== Date ==> <== Thread ==>

Subject: Multiple IOCs on one Linux host
From: Ralph Lange <[email protected]>
To: EPICS Tech-Talk <[email protected]>
Date: Mon, 31 Mar 2014 17:15:41 +0200
All,

As probably many of you know, running multiple IOCs on one host has an annoying side effect: Clients that are using that host's IP address in their EPICS_CA_ADDR_LIST with EPICS_CA_AUTO_ADDR_LIST=NO will only reach one of the IOCs - usually the one that was started last. All clients have to use broadcasts to reach all IOCs. The same is true for CA Gateway machines that are set up in a way that makes multiple Gateway processes serve channels into the same network.

Here's a little helper (for Linux hosts) that I recently was playing around with - based on an idea by Rodrigo Bongers (CNPEM, Brazil).

If you drop the attached script into /etc/network/if-up.d *and* /etc/network/if-down.d, it will automatically create/delete an iptables rule that replaces the destination address of all incoming CA UDP traffic on each interface with the broadcast address of that interface. Simple and effective: the kernel will see all incoming name resolution requests as broadcasts, and delivers them to all IOCs instead of one.

Note: This will not work for clients on the same host. (Adding that feature makes things a lot more complicated, and I like things to be simple.) If you need connections between IOCs on one host, I would suggest adding the broadcast address of the loopback interface (usually 127.255.255.255) to each IOC's EPICS_CA_ADDR_LIST setting.

Enjoy!
~Ralph

#!/bin/sh -e
# Called when a new interface comes up

# Author: Ralph Lange <[email protected]>

# Make any incoming Channel Access name resolution queries go to the broadcast address
# (to hit all IOCs on this host)

# Change this if you run CA on a non-standard port
PORT=5064

[ "$METHOD" != "none" ] || exit 0
[ "$IFACE" != "lo" ] || exit 0

line=`ifconfig $IFACE | grep "inet addr"`
addr=`echo $line | sed -e 's/.*inet addr:\([0-9\.]*\).*/\1/'`
bcast=`echo $line | sed -e 's/.*Bcast:\([0-9\.]*\).*/\1/'`

if [ "$MODE" = "start" ]
then
    iptables -t nat -A PREROUTING -d $addr -p udp --dport $PORT -j DNAT --to-destination $bcast
elif [ "$MODE" = "stop" ]
then
    iptables -t nat -D PREROUTING -d $addr -p udp --dport $PORT -j DNAT --to-destination $bcast
fi

exit 0

Replies:
Re: Multiple IOCs on one Linux host Andrew Johnson

Navigate by Date:
Prev: RE: MJPEG Video Display for CS-Studio Paul.gibbons
Next: Re: Multiple IOCs on one Linux host Andrew Johnson
Index: 1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  <20142015  2016  2017  2018  2019  2020  2021  2022  2023  2024 
Navigate by Thread:
Prev: RE: Scaler expected behaviour Mooney, Tim M.
Next: Re: Multiple IOCs on one Linux host Andrew Johnson
Index: 1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  <20142015  2016  2017  2018  2019  2020  2021  2022  2023  2024 
ANJ, 17 Dec 2015 Valid HTML 4.01! · Home · News · About · Base · Modules · Extensions · Distributions · Download ·
· Search · EPICS V4 · IRMIS · Talk · Bugs · Documents · Links · Licensing ·