From mboxrd@z Thu Jan 1 00:00:00 1970 From: Vincent Bernat Subject: Re: [PATCH net 1/1] bonding: fix PACKET_ORIGDEV regression on bonding masters Date: Mon, 14 Jan 2019 08:00:24 +0000 Message-ID: <87imyr3bzb.fsf@bernat.ch> References: <20190107162946.13072-1-soltys@ziu.info> <20190107162946.13072-2-soltys@ziu.info> <20190113.150355.1753998293477839740.davem@davemloft.net> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Cc: David Miller , soltys@ziu.info, Linux NetDev , Jay Vosburgh , Mahesh Bandewar , Chonggang Li To: Maciej =?utf-8?Q?=C5=BBenczykowski?= Return-path: Received: from new4-smtp.messagingengine.com ([66.111.4.230]:49933 "EHLO new4-smtp.messagingengine.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725837AbfANIGw (ORCPT ); Mon, 14 Jan 2019 03:06:52 -0500 In-Reply-To: ("Maciej =?utf-8?Q?=C5=BBenczykowski=22's?= message of "Sun, 13 Jan 2019 18:01:39 -0800") Sender: netdev-owner@vger.kernel.org List-ID: =E2=9D=A6 13 janvier 2019 18:01 -08, Maciej =C5=BBenczykowski : > But I seem to recall that the core problem we were trying to solve was > that a daemon listening > on an AF_PACKET ethertype 88CC [LLDP] socket not bound to any device > would not receive LLDP packets > arriving on inactive bond slaves (either active-backup or lag). Just tested and with 4.9.150, I am in fact unable to receive anything on a backup link when listening to the active-backup master device or to "any" device. > Perhaps going from: > /* don't change skb->dev for link-local packets */ > if (is_link_local_ether_addr(eth_hdr(skb)->h_dest)) return RX_HANDLER_P= ASS; > if (bond_should_deliver_exact_match(skb, slave, bond)) return > RX_HANDLER_EXACT; > > to something more like: > if (bond_should_deliver_exact_match(skb, slave, bond)) { > /* don't change skb->dev for link-local packets on inactive slaves */ > if (is_link_local_ether_addr(eth_hdr(skb)->h_dest)) return RX_HANDLER= _PASS; > return RX_HANDLER_EXACT; > } > > would fix both problems? It makes PACKET_ORIGDEV works again. Moreover, when not binding to any interface, we receive packets on both active and backup links. But when binding to the master device, I only receive packets from the active devices (which is the same behaviour than pre-4.12). When not binding to any device and not using PACKET_ORIGDEV, one packet is said to be from the master device and one packet is said to be from the backup device. Previously, I had one packet from active device, one packet from backup device and two packets from master device. For me, this is a better situation than previously as we return to the situation before 4.12 but you can get what you want by not binding to any device _and_ using PACKET_ORIGDEV (otherwise, you are don't get the right interface in all cases). If it's unclear, I can provide more extensive results. I am using this test program (comment the s.bind/s.setsockopt line if needed): #v+ #!/usr/bin/env python3 import sys import socket import datetime socket.SOL_PACKET =3D 263 socket.PACKET_ORIGDEV =3D 9 s =3D socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(0x88cc)) s.bind(("bond0", 0)) s.setsockopt(socket.SOL_PACKET, socket.PACKET_ORIGDEV, 1) while True: data, addrinfo =3D s.recvfrom(1500) if addrinfo[2] =3D=3D socket.PACKET_OUTGOING: continue print(f"{datetime.datetime.now().isoformat()}: " f"Received {len(data)} bytes from {addrinfo}") #v- --=20 Localise input and output in subroutines. - The Elements of Programming Style (Kernighan & Plauger)