Hello, everyone.
I'm facing an interesting and bizarre problem with a slice, OVS, and default Linux kernel routing. I have attached an image of my topology as well as my manifest.
The problem is as follows. Packets are being dropped at the edge routers in my topology (srcr, dstr). Here are the results of some pings.
h1 ping srcr = SUCCESS
h1 ping hb = SUCCESS
h1 ping hlhb = SUCCESS
h1 ping lb = SUCCESS
h1 ping dstr = FAILED
h1 ping h2 = FAILED
h2 ping dstr = SUCCESS
h2 ping hb = SUCCESS
h2 ping hlhb = SUCCESS
h2 ping lb = SUCCESS
h2 ping srcr = FAILED
h2 ping h1 = FAILED
As you can see, the problem is symmetric. When pinging from the h1 side, packets are eaten by dstr (but make it through srcr). When pinging from the h2 side, packets are eaten by srcr (but make it through dstr).
Based on my debugging, I believe this problem is happening somewhere in the Linux kernel. To support this, I will provide more details about my configuration. All routers in my topology (srcr, hb, hlhb, lb, dstr) have the same configuration. It can be summarized as follows:
1. Each is running OVS 2.3.1.
2. There is one OVS bridge per physical link (eth1, eth2, etc.), with the physical link attached to that bridge, and the IP address of the link moved from the interface to the bridge (see <
http://groups.geni.net/geni/wiki/HowTo/ConfigureOVSWithLayer3Routing>).
3. All default routes installed by GENI are preserved with ethX replaced by br-ethX (the naming convention of my bridges, see routes below).
4. Each OVS bridge has the following two rules installed, which redirect all traffic to and from the Linux kernel:
cookie=0x0, duration=X, table=0, n_packets=X, n_bytes=X, idle_age=X, priority=1,in_port=1 actions=LOCAL
cookie=0x0, duration=X, table=0, n_packets=X, n_bytes=X, idle_age=X, priority=1,in_port=LOCAL actions=output:1
Here is the output of the routing tables for srcr and dstr, just for reference.
Routing table of srcr:
default via 172.16.0.1 dev eth0
10.0.0.0/8 via 10.10.7.2 dev br-eth2 proto static
10.10.1.0/24 dev br-eth1 proto kernel scope link src 10.10.1.2
10.10.2.0/24 dev br-eth3 proto kernel scope link src 10.10.2.1
10.10.3.2/31 via 10.10.2.2 dev br-eth3 proto static
10.10.5.0/24 dev br-eth4 proto kernel scope link src 10.10.5.2
10.10.6.0/31 via 10.10.5.1 dev br-eth4 proto static
10.10.7.0/24 dev br-eth2 proto kernel scope link src 10.10.7.1
172.16.0.0/12 dev eth0 proto kernel scope link src 172.17.5.26
Routing table of dstr:
10.0.0.0/8 via 10.10.6.1 dev br-eth2 proto static
10.10.2.0/31 via 10.10.6.1 dev br-eth2 proto static
10.10.2.0/23 via 10.10.3.2 dev br-eth3 proto static
10.10.3.0/24 dev br-eth3 proto kernel scope link src 10.10.3.1
10.10.4.0/24 dev br-eth4 proto kernel scope link src 10.10.4.2
10.10.6.0/24 dev br-eth2 proto kernel scope link src 10.10.6.2
10.10.6.0/23 via 10.10.8.1 dev br-eth1 proto static
10.10.7.0/31 via 10.10.6.1 dev br-eth2 proto static
10.10.8.0/24 dev br-eth1 proto kernel scope link src 10.10.8.2
172.16.0.0/12 dev eth0 proto kernel scope link src 172.17.5.24
Let us suppose we are pinging from h1 to h2. I am able to verify that the ping packet makes it to dstr by running tcp dump on the incoming interface:
sudo tcpdump -i br-eth1 icmp
16:03:26.158032 IP H1-lan0 > H2-lan3: ICMP echo request, id 18466, seq 13, length 64
16:03:27.165882 IP H1-lan0 > H2-lan3: ICMP echo request, id 18466, seq 14, length 64
16:03:28.173689 IP H1-lan0 > H2-lan3: ICMP echo request, id 18466, seq 15, length 64
...
I am also able to check the packet counter for the OVS rule on br-eth1 which shows a match, indicating that the ping packet is being sent to LOCAL (the Linux kernel). However, the packet never comes out of any of the other interfaces. I run the same tcpdump command on br-eth2, br-eth3, br-eth4, and even eth0 (the control interface, which the default route forwards to). Nothing. This seems to indicate that the Linux kernel is eating the packet.
Does anyone have any intuitions about what might be going on here? I am completely stumped.
Please let me know if you need anymore details or want me to try anything else.
Thanks,
Jacob Chappell