From nobody Thu Dec 7 15:36:17 2023 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4SmJK45wV7z539HW; Thu, 7 Dec 2023 15:36:24 +0000 (UTC) (envelope-from mike@karels.net) Received: from mail2.karels.net (mail2.karels.net [3.19.118.201]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "freebsd", Issuer "freebsd" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4SmJK443htz4PPT; Thu, 7 Dec 2023 15:36:24 +0000 (UTC) (envelope-from mike@karels.net) Authentication-Results: mx1.freebsd.org; none Received: from mail2.karels.net (localhost [IPv6:0:0:0:0:0:0:0:1]) by mail2.karels.net (8.17.1/8.17.1) with ESMTP id 3B7FaIGq087015; Thu, 7 Dec 2023 09:36:18 -0600 (CST) (envelope-from mike@karels.net) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=karels.net; s=mail2; t=1701963378; bh=lKLTG5+wsw2CN0Res1sNFEAJfx59N0GGJjQ+3kqtDWM=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=ZhQhBguLpTbzr2E5FAe0MFIfHCiBFogJUM1tJjlwH6lA0XOV0m8oWxbKQnwnOZIZ0 Pd6VHa/wnWhNcvbbt98BokTDdf9ANC2z7spQtcackI5D2s9EsY+PoTaWJJZ0Ltlqq5 kQRMdKHyz1b5eJfoqcntZPlUVxmNr6jnnhZTsude1m1s8H/Lq2r523QVQB/+42ekng pxGVDMZy+BUcCLu+v8gK7Qbfr/UmU0IMJZ8enjlcg4LOn2niKXEnKlw/bKnChqKBDr QomjiG1j1YVldZO4Bnu/oc7xWxrhCmSM5645OVzP/8kIdH2gsNQ3ypWJLx7dNGYois rdjSNoglTmKoA== Received: from [10.0.2.130] ([73.62.165.147]) by mail2.karels.net with ESMTPSA id bA6YCXLmcWXlUwEAs/W3XQ (envelope-from ); Thu, 07 Dec 2023 09:36:18 -0600 From: Mike Karels To: Ronald Klop Cc: Ronald Klop , dev-commits-src-all@FreeBSD.org, src-committers@FreeBSD.org, dev-commits-src-main@FreeBSD.org Subject: Re: git: 3878bbf1bb9e - main - Teach if_smsc to get MAC from bootargs. Date: Thu, 07 Dec 2023 09:36:17 -0600 X-Mailer: MailMate (1.14r5964) Message-ID: In-Reply-To: <271104654.206755.1701962301276@localhost> References: <202312071133.3B7BX5iQ047655@gitrepo.freebsd.org> <271104654.206755.1701962301276@localhost> List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain Content-Transfer-Encoding: quoted-printable X-Rspamd-Pre-Result: action=no action; module=replies; Message is reply to one we originated X-Spamd-Result: default: False [-4.00 / 15.00]; REPLY(-4.00)[]; ASN(0.00)[asn:16509, ipnet:3.16.0.0/14, country:US] X-Spamd-Bar: ---- X-Rspamd-Queue-Id: 4SmJK443htz4PPT On 7 Dec 2023, at 9:18, Ronald Klop wrote: > Hi, > > My commit broke the build on armv6 and armv7 according to Jenkins. > > Printf(3) says %zd will be a better format specifier for ssize_t than %= lu. > > diff --git a/sys/dev/usb/net/if_smsc.c b/sys/dev/usb/net/if_smsc.c > index 54b18e0a67c..a59501b6bbf 100644 > --- a/sys/dev/usb/net/if_smsc.c > +++ b/sys/dev/usb/net/if_smsc.c > @@ -1594,7 +1594,7 @@ smsc_bootargs_get_mac_addr(device_t dev, struct u= sb_ether *ue) > len =3D OF_getprop_alloc(node, "bootargs", (void **)&bootargs); > if (len =3D=3D -1 || bootargs =3D=3D NULL) { > smsc_warn_printf((struct smsc_softc *)ue->ue_sc, > - "failed alloc for bootargs (%lu)", len)= ; > + "failed alloc for bootargs (%zd)", len)= ; > return (false); > } > smsc_dbg_printf((struct smsc_softc *)ue->ue_sc, "bootargs: %s.\n= ", > > > Ok to commit this? Yes, please do. Mike > Regards, > Ronald. > > > Van: Ronald Klop > Datum: donderdag, 7 december 2023 12:33 > Aan: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-c= ommits-src-main@FreeBSD.org > Onderwerp: git: 3878bbf1bb9e - main - Teach if_smsc to get MAC from boo= targs. >> >> The branch main has been updated by ronald: >> >> URL: https://cgit.FreeBSD.org/src/commit/?id=3D3878bbf1bb9e68f8579b57c= de7d4e5c77de93320 >> >> commit 3878bbf1bb9e68f8579b57cde7d4e5c77de93320 >> Author: Ronald Klop >> AuthorDate: 2023-11-04 14:14:00 +0000 >> Commit: Ronald Klop >> CommitDate: 2023-12-07 11:32:01 +0000 >> >> Teach if_smsc to get MAC from bootargs. >> Some Raspberry Pi pass smsc95xx.macaddr=3DXX:XX:XX:XX:XX:XX as = bootargs. >> Use this if no ethernet address is found in an EEPROM. >> As last resort fall back to ether_gen_addr() instead of random MAC= =2E >> PR: 274092 >> Reported by: Patrick M. Hausen (via ML) >> Reviewed by: imp, karels, zlei >> Tested by: Patrick M. Hausen >> Approved by: karels >> MFC after: 1 month >> Relnotes: yes >> Differential Revision: https://reviews.freebsd.org/D42463 >> --- >> sys/dev/usb/net/if_smsc.c | 86 ++++++++++++++++++++++++++++++++++++++= +++++++-- >> sys/net/ethernet.h | 1 + >> sys/net/if_ethersubr.c | 10 ++++-- >> 3 files changed, 92 insertions(+), 5 deletions(-) >> >> diff --git a/sys/dev/usb/net/if_smsc.c b/sys/dev/usb/net/if_smsc.c >> index ec8197229f17..54b18e0a67c9 100644 >> --- a/sys/dev/usb/net/if_smsc.c >> +++ b/sys/dev/usb/net/if_smsc.c >> @@ -179,6 +179,8 @@ static const struct usb_device_id smsc_devs[] =3D = { >> #define ETHER_IS_VALID(addr) \ >> (!ETHER_IS_MULTICAST(addr) && !ETHER_IS_ZERO(addr)) >> +#define BOOTARGS_SMSC95XX "smsc95xx.macaddr" >> + >> static device_probe_t smsc_probe; >> static device_attach_t smsc_attach; >> static device_detach_t smsc_detach; >> @@ -1538,6 +1540,76 @@ smsc_ioctl(if_t ifp, u_long cmd, caddr_t data) >> return (rc); >> } >> +#ifdef FDT >> +static bool >> +smsc_get_smsc95xx_macaddr(char* bootargs, size_t len, struct usb_ethe= r *ue) >> +{ >> + int values[6]; >> + int i; >> + char* p; >> + >> + p =3D strnstr(bootargs, BOOTARGS_SMSC95XX, len); >> + if (p =3D=3D NULL) >> + return (false); >> + >> + if (sscanf(p, BOOTARGS_SMSC95XX "=3D%x:%x:%x:%x:%x:%x%*c", >> + &values[0], &values[1], &values[2], >> + &values[3], &values[4], &values[5]) !=3D 6) { >> + smsc_warn_printf((struct smsc_softc *)ue->ue_sc, >> + "invalid mac from bootargs '%s'.\n", p); >> + return (false); >> + } >> + >> + for (i =3D 0; i < ETHER_ADDR_LEN; ++i) >> + ue->ue_eaddr[i] =3D values[i]; >> + >> + smsc_dbg_printf((struct smsc_softc *)ue->ue_sc, >> + "bootargs mac=3D%6D.\n", ue->ue_eaddr, ":"); >> + return (true); >> +} >> + >> +/** >> + * Raspberry Pi is known to pass smsc95xx.macaddr=3DXX:XX:XX:XX:XX:XX= via >> + * bootargs. >> + */ >> +static bool >> +smsc_bootargs_get_mac_addr(device_t dev, struct usb_ether *ue) >> +{ >> + char *bootargs; >> + ssize_t len; >> + phandle_t node; >> + >> + /* only use bootargs for the first device >> + * to prevent duplicate mac addresses */ >> + if (device_get_unit(dev) !=3D 0) >> + return (false); >> + node =3D OF_finddevice("/chosen"); >> + if (node =3D=3D -1) >> + return (false); >> + if (OF_hasprop(node, "bootargs") =3D=3D 0) { >> + smsc_dbg_printf((struct smsc_softc *)ue->ue_sc, >> + "bootargs not found"); >> + return (false); >> + } >> + len =3D OF_getprop_alloc(node, "bootargs", (void **)&bootargs); >> + if (len =3D=3D -1 || bootargs =3D=3D NULL) { >> + smsc_warn_printf((struct smsc_softc *)ue->ue_sc, >> + "failed alloc for bootargs (%lu)", len); >> + return (false); >> + } >> + smsc_dbg_printf((struct smsc_softc *)ue->ue_sc, "bootargs: %s.\n",= >> + bootargs); >> + if (!smsc_get_smsc95xx_macaddr(bootargs, len, ue)) { >> + OF_prop_free(bootargs); >> + return (false); >> + } >> + OF_prop_free(bootargs); >> + device_printf(dev, "MAC address found in bootargs %6D.\n", >> + ue->ue_eaddr, ":"); >> + return (true); >> +} >> +#endif >> + >> /** >> * smsc_attach_post - Called after the driver attached to the USB int= erface >> * @ue: the USB ethernet device >> @@ -1552,8 +1624,10 @@ static void >> smsc_attach_post(struct usb_ether *ue) >> { >> struct smsc_softc *sc =3D uether_getsc(ue); >> + struct ether_addr eaddr; >> uint32_t mac_h, mac_l; >> int err; >> + int i; >> smsc_dbg_printf(sc, "smsc_attach_post\n"); >> @@ -1585,11 +1659,17 @@ smsc_attach_post(struct usb_ether *ue) >> #ifdef FDT >> if ((err !=3D 0) || (!ETHER_IS_VALID(sc->sc_ue.ue_eaddr))) >> err =3D usb_fdt_get_mac_addr(sc->sc_ue.ue_dev, &sc->sc_ue)= ; >> + if ((err !=3D 0) || (!ETHER_IS_VALID(sc->sc_ue.ue_eaddr))) >> + err =3D smsc_bootargs_get_mac_addr(sc->sc_ue.ue_dev, >> + &sc->sc_ue) ? (0) : (1); >> #endif >> if ((err !=3D 0) || (!ETHER_IS_VALID(sc->sc_ue.ue_eaddr))) { >> - read_random(sc->sc_ue.ue_eaddr, ETHER_ADDR_LEN); >> - sc->sc_ue.ue_eaddr[0] &=3D ~0x01; /* unicast */ >> - sc->sc_ue.ue_eaddr[0] |=3D 0x02; /* locally administe= red */ >> + smsc_dbg_printf(sc, "No MAC address found." >> + " Using ether_gen_addr().\n"); >> + ether_gen_addr_byname(device_get_nameunit(ue->ue_dev), >> + &eaddr); >> + for (i =3D 0; i < ETHER_ADDR_LEN; i++) >> + sc->sc_ue.ue_eaddr[i] =3D eaddr.octet[i]; >> } >> } >> diff --git a/sys/net/ethernet.h b/sys/net/ethernet.h >> index fca6748a0da7..e7313e78c5bb 100644 >> --- a/sys/net/ethernet.h >> +++ b/sys/net/ethernet.h >> @@ -448,6 +448,7 @@ struct mbuf *ether_vlanencap_proto(struct mbuf *,= uint16_t, uint16_t); >> bool ether_8021q_frame(struct mbuf **mp, struct ifnet *ife, >> struct ifnet *p, const struct ether_8021q_tag *); >> void ether_gen_addr(struct ifnet *ifp, struct ether_addr *hwaddr); >> +void ether_gen_addr_byname(const char *nameunit, struct ether_addr = *hwaddr); >> static __inline struct mbuf *ether_vlanencap(struct mbuf *m, uint16_t= tag) >> { >> diff --git a/sys/net/if_ethersubr.c b/sys/net/if_ethersubr.c >> index 7a32d0091260..ef0b1f705260 100644 >> --- a/sys/net/if_ethersubr.c >> +++ b/sys/net/if_ethersubr.c >> @@ -1487,7 +1487,7 @@ ether_8021q_frame(struct mbuf **mp, struct ifnet= *ife, struct ifnet *p, >> * allocate non-locally-administered addresses. >> */ >> void >> -ether_gen_addr(struct ifnet *ifp, struct ether_addr *hwaddr) >> +ether_gen_addr_byname(const char *nameunit, struct ether_addr *hwaddr= ) >> { >> SHA1_CTX ctx; >> char *buf; >> @@ -1506,7 +1506,7 @@ ether_gen_addr(struct ifnet *ifp, struct ether_a= ddr *hwaddr) >> /* If each (vnet) jail would also have a unique hostuuid this woul= d not >> * be necessary. */ >> getjailname(curthread->td_ucred, jailname, sizeof(jailname)); >> - sz =3D asprintf(&buf, M_TEMP, "%s-%s-%s", uuid, if_name(ifp), >> + sz =3D asprintf(&buf, M_TEMP, "%s-%s-%s", uuid, nameunit, >> jailname); >> if (sz < 0) { >> /* Fall back to a random mac address. */ >> @@ -1535,5 +1535,11 @@ rando: >> hwaddr->octet[0] |=3D 0x02; >> } >> +void >> +ether_gen_addr(struct ifnet *ifp, struct ether_addr *hwaddr) >> +{ >> + ether_gen_addr_byname(if_name(ifp), hwaddr); >> +} >> + >> DECLARE_MODULE(ether, ether_mod, SI_SUB_INIT_IF, SI_ORDER_ANY); >> MODULE_VERSION(ether, 1); >> >> >>