15 echo "pipework <hostinterface> <guest> <ipaddr>/<subnet> <broadcast> <gateway> [vlan tag]"
19 # Step 1: Find the guest (for now, we only support LXC containers)
20 while read dev mnt fstype options dump fsck
22 [ "$fstype" != "cgroup" ] && continue
23 echo $options | grep -qw devices || continue
28 echo "Could not locate cgroup mount point."
32 N=$(find "$CGROUPMNT" -name "$GUESTNAME*" | wc -l)
35 echo "Could not find any container matching $GUESTNAME."
42 echo "Found more than one container matching $GUESTNAME."
47 NSPID=$(head -n 1 $(find "$CGROUPMNT" -name "$GUESTNAME*" | head -n 1)/tasks)
49 echo "Could not find a process inside container $GUESTNAME."
53 # Step 2: Prepare the working directory
54 mkdir -p /var/run/netns
55 rm -f /var/run/netns/$NSPID
56 ln -s /proc/$NSPID/ns/net /var/run/netns/$NSPID
58 # Step 3: Creating virtual interfaces
59 LOCAL_IFNAME=vethl$NSPID
60 GUEST_IFNAME=vethg$NSPID
61 ip link add name $LOCAL_IFNAME type veth peer name $GUEST_IFNAME
62 ip link set $LOCAL_IFNAME up
64 # Step 4: Adding the virtual interface to the bridge
65 ip link set $GUEST_IFNAME netns $NSPID
68 ovs-vsctl add-port $BRIDGE $LOCAL_IFNAME tag=$VLANTAG -- set Interface $LOCAL_IFNAME ofport_request=$OF_PORT
70 ovs-vsctl add-port $BRIDGE $LOCAL_IFNAME -- set Interface $LOCAL_IFNAME ofport_request=$OF_PORT
73 # Step 5: Configure netwroking within the container
74 ip netns exec $NSPID ip link set $GUEST_IFNAME name eth0
75 ip netns exec $NSPID ip addr add $IPADDR broadcast $BROADCAST dev eth0
76 ip netns exec $NSPID ifconfig eth0 hw ether $MAC
77 ip netns exec $NSPID ip addr add 127.0.0.1 dev lo
78 ip netns exec $NSPID ip link set eth0 up
79 ip netns exec $NSPID ip link set lo up
80 ip netns exec $NSPID ip route add default via $GWADDR