@@ -34,15 +34,15 @@ _IFACES=$(ls /sys/class/net | tr "\n" " " | sed 's/\s*$//g')
3434IFACES=${IFACES:- $_IFACES }
3535NETNS=${NETNS:- }
3636
37- UNSEG_DEV_NAME =${UNSEG_DEV_NAME :- _unseg }
37+ SEG_DEV_NAME =${SEG_DEV_NAME :- _seg }
3838
3939PROG=/opt/sfunnel/src/tc_sfunnel.o
4040
4141# Compile eBPF program only if rulesset are defined at load time
4242# either via file or ENV
4343compile (){
4444 cd /opt/sfunnel/src
45- UNSEG_DEV_IFINDEX= ${UNSEG_DEV_IFINDEX } DEBUG=${DEBUG} FILE=/etc/sfunnel/ruleset make
45+ SEG_DEV_MAC= " ${SEG_DEV_MAC} " SEG_DEV_IFINDEX= ${SEG_DEV_IFINDEX } DEBUG=${DEBUG} FILE=/etc/sfunnel/ruleset make
4646}
4747
4848# $1: PROG
@@ -96,7 +96,7 @@ echo " \$DEBUG='${DEBUG}'"
9696echo " \$ NETNS='${NETNS} '"
9797echo " \$ N_ATTEMPTS='${N_ATTEMPTS} '"
9898echo " \$ RETRY_DELAY='${RETRY_DELAY} '"
99- echo " \$ UNSEG_DEV_NAME ='${UNSEG_DEV_NAME } '"
99+ echo " \$ SEG_DEV_NAME ='${SEG_DEV_NAME } '"
100100echo " [INFO] Container info:"
101101echo " Kernel: $( uname -a) "
102102echo " Debian: $( cat /etc/debian_version) "
@@ -109,12 +109,23 @@ if [[ "${DEBUG}" == "1" ]]; then
109109 set -x
110110fi
111111
112- # Create GSO/TSO/UFO unsegmenting device (work-around
113- if [[ " ${UNSEG_DEV_NAME} " != " " ]]; then
114- ip link add ${UNSEG_DEV_NAME} type dummy
115- ip link set up dev ${UNSEG_DEV_NAME}
116- ethtool -K ${UNSEG_DEV_NAME} gso off tso off ufo off
117- UNSEG_DEV_IFINDEX=$( ip link show ${UNSEG_DEV_NAME} | head -n 1 | awk ' {print $1}' | tr -d ' :' )
112+ # Create GSO/TSO/UFO unsegmenting device (work-around)
113+ if [[ " ${SEG_DEV_NAME} " != " " ]]; then
114+ if [[ " $( ip link | grep ${SEG_DEV_NAME} ) " == " " ]]; then
115+ ip link add ${SEG_DEV_NAME} type veth peer name ${SEG_DEV_NAME} _pair
116+ fi
117+ ip link set up dev ${SEG_DEV_NAME}
118+ ip link set up dev ${SEG_DEV_NAME} _pair
119+ ip link set mtu 1480 dev ${SEG_DEV_NAME}
120+ ip link set mtu 1480 dev ${SEG_DEV_NAME} _pair
121+ ethtool -K ${SEG_DEV_NAME} gso off tso off ufo off
122+ ethtool -K ${SEG_DEV_NAME} _pair gso off tso off ufo off
123+ SEG_DEV_IFINDEX=$( ip link show ${SEG_DEV_NAME} | head -n 1 | awk ' {print $1}' | tr -d ' :' )
124+ SEG_DEV_MAC=" $( ip -j link show ${SEG_DEV_NAME} _pair | jq -r ' .[0].address' | tr -d ' :' | sed ' s/\(..\)/0x\1, /g' | sed ' s/,\s*$$//' ) "
125+
126+ echo 1 > /proc/sys/net/ipv4/conf/${SEG_DEV_NAME} /accept_local
127+ echo 1 > /proc/sys/net/ipv4/conf/${SEG_DEV_NAME} _pair/accept_local
128+ echo 1 > /proc/sys/net/ipv4/ip_forward
118129fi
119130
120131# Make sure /etc/sfunnel exists, even if no volume is mounted
@@ -166,4 +177,3 @@ for IFACE in ${IFACES}; do
166177done
167178
168179echo " [INFO] Successfully ${OP_STR} ed BPF program(s) on interfaces {${IFACES} } DIRECTION=${DIRECTION} "
169-
0 commit comments