SCTP multihoming sends incorrect ARP request

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Greetings,

I'd like to discuss obscure behavior of SCTP in multihoming environment.
SCTP connect() leads to incorrect ARP who-has request and reply.

Suppose we have two hosts (hostA, hostB), each with two NICs (nicA, nicB),
each NIC with two addresses (addrA, addrB). So in our scenario we have 8
addresses in total. All NICs are connected to the same physical network
switch.
Both addresses on both nicA are in one subnet, both addresses on both nicB are
in one different subnet.

So my settings looks like:

 ===hostA================      ===hostB================
 |192.168.100.4/24   nicA-\  /-nicB 192.168.100.5/24  |
 |192.168.100.14/24     |  ||  |    192.168.100.15/24 |
 |----------------------|  ||  |----------------------|
 |192.168.200.4/24   nicB-/  \-nicB 192.168.200.5/24  |
 |192.168.200.14/24     |      |    192.168.200.15/24 |
 ========================      ========================

(in real setup both subnets would be routed through different physical networks etc.)

Now suppose we are running SCTP server on hostB, which does:

  socket(AF_INET, SOCK_STREAM,IPPROTO_SCTP);
  bind(192.168.100.5)
  sctp_bindx(192.168.200.5)
  listen()
  accept()

And SCTP client running on hostA doing:

  socket(AF_INET, SOCK_STREAM,IPPROTO_SCTP);
  bind(192.168.100.4);
  sctp_bindx(192.168.200.4);
  connect(192.168.200.5);

So in short - the client does connect to the secondary interface of the server.

The problem here is ARP resolution before actual SCTP handshake. Here the
client sends incorrect ARP request, see **) below for tcpdump output.
In the showed packets, the ARP Who-has request contains incorrect combination
of Sender's MAC and IP address. It has Sender's MAC address of nicB, but
Sender's IP address of nicA.
The server then replies with the same wrong packet - Sender's MAC address of
his nicA, but IP address from nicB.
This leads to wrong ARP tables on both hosts - they both only only one MAC
address of their respective partner.
Wrong ARP tables leads for incorrect source IP in future SCTP packets.

Possible workaround is to ping all partners before starting SCTP connection to
fill ARP tables correctly.

I was testing this on yesterday's build of the kernel:

$ git log | head
commit dc47ce90c3a822cd7c9e9339fe4d5f61dcb26b50
Author: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx>
Date:   Fri Dec 9 15:09:32 2011 -0800

    Linux 3.2-rc5

hostA$ uname -a
Linux hostA-2 3.2.0-rc5 #1 SMP Mon Dec 12 17:31:15 CET 2011 x86_64 x86_64 x86_64 GNU/Linux

The question is - do you agree that this is a bug, and the ARP who-has request
should be sent with matching pair of MAC and IP address?
In that case - I would be happy to propose a patch with fix (which might take
me some time...).

Thanks for reply and regards,
-Stanislav Kozina

*) IP configuration of both hosts
hostA# ip addr show
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:92:35:7a brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.14/16 brd 192.168.200.255 scope global eth0
    inet 192.168.100.4/24 brd 192.168.100.255 scope global eth0:1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:92:35:7b brd ff:ff:ff:ff:ff:ff
    inet 192.168.200.14/24 brd 192.168.200.255 scope global eth1
    inet 192.168.200.4/24 brd 192.168.200.255 scope global secondary eth1:1

hostB# ip addr show
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:16:36:d3:6a:5e brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.15/16 brd 192.168.200.255 scope global eth0
    inet 192.168.100.5/24 brd 192.168.100.255 scope global eth0:1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:16:36:d3:6a:5f brd ff:ff:ff:ff:ff:ff
    inet 192.168.200.15/24 brd 192.168.200.255 scope global eth1
    inet 192.168.200.5/24 brd 192.168.200.255 scope global secondary eth1:1

**) Tcpdump of respective ARP packets
No.     Time        Source                Destination           Protocol Info
      7 7.185516    RealtekU_92:35:7b     Broadcast             ARP      Who has 192.168.200.5?  Tell 192.168.100.4

Frame 7 (42 bytes on wire, 42 bytes captured)
Ethernet II, Src: RealtekU_92:35:7b (52:54:00:92:35:7b), Dst: Broadcast (ff:ff:ff:ff:ff:ff)
Address Resolution Protocol (request)
<!SNIP>
    Sender MAC address: RealtekU_92:35:7b (52:54:00:92:35:7b)
    Sender IP address: 192.168.100.4 (192.168.100.4)  /** Here the Senders MAC and IP do not match */
    Target MAC address: 00:00:00_00:00:00 (00:00:00:00:00:00)
    Target IP address: 192.168.200.5 (192.168.200.5)

No.     Time        Source                Destination           Protocol Info
      8 7.185832    QuantaCo_d3:6a:5e     RealtekU_92:35:7b     ARP      192.168.200.5 is at 00:16:36:d3:6a:5e

Frame 8 (42 bytes on wire, 42 bytes captured)
Ethernet II, Src: QuantaCo_d3:6a:5e (00:16:36:d3:6a:5e), Dst: RealtekU_92:35:7b (52:54:00:92:35:7b)
Address Resolution Protocol (reply)
<!SNIP>
    Sender MAC address: QuantaCo_d3:6a:5e (00:16:36:d3:6a:5e)
    Sender IP address: 192.168.200.5 (192.168.200.5)  /** Here also Senders MAC and IP do not match */
    Target MAC address: RealtekU_92:35:7b (52:54:00:92:35:7b)
    Target IP address: 192.168.100.4 (192.168.100.4)
--
To unsubscribe from this list: send the line "unsubscribe linux-sctp" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Networking Development]     [Linux OMAP]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux