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
>                          p...@lambda.my.domain
> :/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);

Reply via email to