1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 <2014> 2015 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 <2014> 2015 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