On Sun, Jan 05, 2014 at 11:35:51AM +0100, Petr Hoffmann wrote:
> >Synopsis: missing packets when not in promiscuous mode
> >Category: kernel
> >Environment:
> System : OpenBSD 5.4
> Details : OpenBSD 5.4-stable (GENERIC.MP) #0: Thu Jan 2
> 07:25:09 CET 2014
> [email protected]
> :/usr/src/sys/arch/amd64/compile/GENERIC.MP
>
> Architecture: OpenBSD.amd64
> Machine : amd64
> >Description:
> I have a fresh OpenBSD 5.4 machine that is connected to a network
> by a USB->Ethernet MCS7830-based adapter handled by the 'mos' driver.
> While I'm able to establish connections originating on that machine
> with no problem, it is not possible to connect in the other direction,
> I even do not see the packets using tcpdump with the -p option (but
> I saw a packet from the client coming to 224.0.0.252 (a multicast
> address used by the link-local multicast name resolution protocol).
> I updated my machine to the -patch version but the problem persists.
> Both the client and the server machine are on the same IPv4 network,
> connected directly to the same router.
>
> I figured out that this problem disappears if I start 'tcpdump -i mos0'
> (mos0 being the interface corresponding to my adapter) but not if I
> start tcpdump with the -p option (i.e. in the non-promiscuous mode).
> Unfortunatelly, shortly after exiting the tcpdump, it is not possible
> to connect anymore (unless I start tcpdump again).
>
> Another workaround is to first establish a connection from my machine
> to, let's say, a machine X, then it is possible to connect from X to
> my machine (at least if X is a linux machine).
>
> I conjecture the problem is in that my adapter does not pass ARP
> who-is requests made by clients and thus they have no IP->MAC mapping.
> Actually, I see such requests when in the promiscuous mode but no such
> requests otherwise. BUT, surprisingly, even in the non-promiscuous
> mode, I see ARP who-is requests from my router!
>
> At first I thought my router is blocking ARP who-is requests from
> clients, but if I try to connect to some non-existing IP address,
> the ARP who-is request arrives to my machine so that's probably not
> the case.
>
> This problems seems slightly similar to the one below, maybe it will
> help. I'm new to the OpenBSD world, sorry, I don't know how to
> refer to that bug correctly:
>
> http://marc.info/?l=openbsd-bugs&m=117897452708054&w=2
>
> >How-To-Repeat:
> Install a fresh OpenBSD 5.4 machine, configure the only network
> interface mos0 to use dhcp, and try to connect to that machine
> e.g. by ssh.
> >Fix:
> I know two work arounds:
> a) tcpdump -i mos0
> b) connect from the machine to the client trying to establish
> the connection at first
I can reproduce this problem with an MCS7830 mos adapter.
The patch below seems to fix it. Can you confirm?
Index: if_mos.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/if_mos.c,v
retrieving revision 1.22
diff -u -p -r1.22 if_mos.c
--- if_mos.c 15 Nov 2013 10:17:39 -0000 1.22
+++ if_mos.c 10 Jan 2014 11:54:38 -0000
@@ -558,6 +558,13 @@ mos_iff(struct mos_softc *sc)
ETHER_NEXT_MULTI(step, enm);
}
+ /*
+ * The datasheet claims broadcast frames were always accepted
+ * regardless of filter settings. But the hardware seems to
+ * filter broadcast frames, so pass them explicitly.
+ */
+ h = ether_crc32_be(etherbroadcastaddr, ETHER_ADDR_LEN) >> 26;
+ hashtbl[h / 8] |= 1 << (h % 8);
}
mos_write_mcast(sc, (void *)&hashtbl);