On Tue, Jan 28, 2020 at 03:03:47PM +0100, Gerhard Roth wrote: > this patch adds IPv6 support to umb(4).
It breaks my IPv4 setup. umb0 at uhub0 port 4 configuration 1 interface 6 "Lenovo H5321 gw" rev 2.00/0.00 addr 2 provider Vodafone.de firmware CXP 901 8700/1 - R3C18 When I apply the diff, my umb device does not get an IPv4 address. umb0: state going up from 'open' to 'radio on' umb0: none state unlocked (-1 attempts left) umb0: set/qry MBIM_CID_SUBSCRIBER_READY_STATUS failed: BUSY umb0: packet service changed from detached to attaching, class none, speed: 0 up / 0 down umb0: SIM initialized umb0: state going up from 'radio on' to 'SIM is ready' umb0: packet service changed from attaching to attached, class HSPA, speed: 5760000 up / 14400000 down umb0: state going up from 'SIM is ready' to 'attached' umb0: connecting ... umb0: set/qry MBIM_CID_CONNECT failed: NO_DEVICE_SUPPORT umb0: state change timeout umb0: connecting ... umb0: set/qry MBIM_CID_CONNECT failed: NO_DEVICE_SUPPORT umb0: state change timeout umb0: connecting ... umb0: set/qry MBIM_CID_CONNECT failed: NO_DEVICE_SUPPORT umb0: state change timeout ... A few comments inline. > +#ifdef INET6 > +int umb_add_inet6_config(struct umb_softc *, struct in6_addr *, > + u_int, struct in6_addr *); > +#endif Usually I avoid #ifdef for prototypes. It does not matter whether the compiler reads them and without #ifdef the code is nicer. > +tryv6:; The ; is wrong. > + if (n == 0 || off + sizeof (ipv6elem) > len) > + goto done; > + if (n != 1 && ifp->if_flags & IFF_DEBUG) > + log(LOG_INFO, "%s: more than one IPv6 addr: %d\n", > + DEVNAM(ifp->if_softc), n); > + > + /* Only pick the first one */ > + memcpy(&ipv6elem, data + off, sizeof (ipv6elem)); > + memcpy(&addr6, ipv6elem.addr, sizeof (addr6)); > + > + off = letoh32(ic->ipv6_gwoffs); > + memcpy(&gw6, data + off, sizeof (gw6)); I think we should check the data length like above. if (off + sizeof (gw6) > len) goto done; And IPv4 should get the same check. > @@ -380,6 +381,6 @@ struct umb_softc { > > #define sc_state sc_info.state > #define sc_roaming sc_info.enable_roaming > - struct umb_info sc_info; > + struct umb_info sc_info; > }; > #endif /* _KERNEL */ This whitespace chunk is wrong. bluhm