Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 7 Dec 2023 16:18:21 +0100 (CET)
From:      Ronald Klop <ronald-lists@klop.ws>
To:        Ronald Klop <ronald@FreeBSD.org>
Cc:        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.
Message-ID:  <271104654.206755.1701962301276@localhost>
In-Reply-To: <202312071133.3B7BX5iQ047655@gitrepo.freebsd.org>
References:  <202312071133.3B7BX5iQ047655@gitrepo.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
------=_Part_206754_566537090.1701962301262
Content-Type: text/plain; charset=us-ascii; format=flowed
Content-Transfer-Encoding: 7bit

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 usb_ether *ue)
        len = OF_getprop_alloc(node, "bootargs", (void **)&bootargs);
        if (len == -1 || bootargs == 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?


Regards,
Ronald.

 
Van: Ronald Klop <ronald@FreeBSD.org>
Datum: donderdag, 7 december 2023 12:33
Aan: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Onderwerp: git: 3878bbf1bb9e - main - Teach if_smsc to get MAC from bootargs.
> 
> The branch main has been updated by ronald:
> 
> URL: https://cgit.FreeBSD.org/src/commit/?id=3878bbf1bb9e68f8579b57cde7d4e5c77de93320
> 
> commit 3878bbf1bb9e68f8579b57cde7d4e5c77de93320
> Author:     Ronald Klop <ronald@FreeBSD.org>
> AuthorDate: 2023-11-04 14:14:00 +0000
> Commit:     Ronald Klop <ronald@FreeBSD.org>
> CommitDate: 2023-12-07 11:32:01 +0000
> 
>     Teach if_smsc to get MAC from bootargs.
>     
>     Some Raspberry Pi pass smsc95xx.macaddr=XX: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.
>     
>     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[] = {
>  #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_ether *ue)
> +{
> +   int values[6];
> +   int i;
> +   char* p;
> +
> +   p = strnstr(bootargs, BOOTARGS_SMSC95XX, len);
> +   if (p == NULL)
> +       return (false);
> +
> +   if (sscanf(p, BOOTARGS_SMSC95XX "=%x:%x:%x:%x:%x:%x%*c",
> +           &values[0], &values[1], &values[2],
> +           &values[3], &values[4], &values[5]) != 6) {
> +       smsc_warn_printf((struct smsc_softc *)ue->ue_sc,
> +               "invalid mac from bootargs '%s'.\n", p);
> +       return (false);
> +   }
> +
> +   for (i = 0; i < ETHER_ADDR_LEN; ++i)
> +       ue->ue_eaddr[i] = values[i];
> +
> +   smsc_dbg_printf((struct smsc_softc *)ue->ue_sc,
> +           "bootargs mac=%6D.\n", ue->ue_eaddr, ":");
> +   return (true);
> +}
> +
> +/**
> + * Raspberry Pi is known to pass smsc95xx.macaddr=XX: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) != 0)
> +       return (false);
> +   node = OF_finddevice("/chosen");
> +   if (node == -1)
> +       return (false);
> +   if (OF_hasprop(node, "bootargs") == 0) {
> +       smsc_dbg_printf((struct smsc_softc *)ue->ue_sc,
> +               "bootargs not found");
> +       return (false);
> +   }
> +   len = OF_getprop_alloc(node, "bootargs", (void **)&bootargs);
> +   if (len == -1 || bootargs == 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 interface
>   * @ue: the USB ethernet device
> @@ -1552,8 +1624,10 @@ static void
>  smsc_attach_post(struct usb_ether *ue)
>  {
>     struct smsc_softc *sc = 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 != 0) || (!ETHER_IS_VALID(sc->sc_ue.ue_eaddr)))
>             err = usb_fdt_get_mac_addr(sc->sc_ue.ue_dev, &sc->sc_ue);
> +       if ((err != 0) || (!ETHER_IS_VALID(sc->sc_ue.ue_eaddr)))
> +           err = smsc_bootargs_get_mac_addr(sc->sc_ue.ue_dev,
> +                   &sc->sc_ue) ? (0) : (1);
>  #endif
>         if ((err != 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] &= ~0x01;     /* unicast */
> -           sc->sc_ue.ue_eaddr[0] |=  0x02;     /* locally administered */
> +           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 = 0; i < ETHER_ADDR_LEN; i++)
> +               sc->sc_ue.ue_eaddr[i] = 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_addr *hwaddr)
>     /* If each (vnet) jail would also have a unique hostuuid this would not
>      * be necessary. */
>     getjailname(curthread->td_ucred, jailname, sizeof(jailname));
> -   sz = asprintf(&buf, M_TEMP, "%s-%s-%s", uuid, if_name(ifp),
> +   sz = 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] |= 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);
>  
> 
> 
> 

 
------=_Part_206754_566537090.1701962301262
Content-Type: text/html; charset=us-ascii
Content-Transfer-Encoding: 7bit

<html><head></head><body>Hi,<br>
<br>
My commit broke the build on armv6 and armv7 according to Jenkins.<br>
<br>
Printf(3) says %zd will be a better format specifier for ssize_t than %lu.<br>
<br>
diff --git a/sys/dev/usb/net/if_smsc.c b/sys/dev/usb/net/if_smsc.c<br>
index 54b18e0a67c..a59501b6bbf 100644<br>
--- a/sys/dev/usb/net/if_smsc.c<br>
+++ b/sys/dev/usb/net/if_smsc.c<br>
@@ -1594,7 +1594,7 @@ smsc_bootargs_get_mac_addr(device_t dev, struct usb_ether *ue)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; len = OF_getprop_alloc(node, "bootargs", (void **)&amp;bootargs);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (len == -1 || bootargs == NULL) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; smsc_warn_printf((struct smsc_softc *)ue-&gt;ue_sc,<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "failed alloc for bootargs (%lu)", len);<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "failed alloc for bootargs (%zd)", len);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (false);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; smsc_dbg_printf((struct smsc_softc *)ue-&gt;ue_sc, "bootargs: %s.\n",<br>
<br>
<br>
Ok to commit this?<br>
<br>
<br>
Regards,<br>
Ronald.<br>
<br>
&nbsp;
<p><strong>Van:</strong> Ronald Klop &lt;ronald@FreeBSD.org&gt;<br>
<strong>Datum:</strong> donderdag, 7 december 2023 12:33<br>
<strong>Aan:</strong> src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org<br>
<strong>Onderwerp:</strong> git: 3878bbf1bb9e - main - Teach if_smsc to get MAC from bootargs.</p>

<blockquote style="padding-right: 0px; padding-left: 5px; margin-left: 5px; border-left: #000000 2px solid; margin-right: 0px">
<div class="MessageRFC822Viewer" id="P">
<div class="TextPlainViewer" id="P.P">The branch main has been updated by ronald:<br>
<br>
URL: <a href="https://cgit.FreeBSD.org/src/commit/?id=3878bbf1bb9e68f8579b57cde7d4e5c77de93320">https://cgit.FreeBSD.org/src/commit/?id=3878bbf1bb9e68f8579b57cde7d4e5c77de93320</a><br>;
<br>
commit 3878bbf1bb9e68f8579b57cde7d4e5c77de93320<br>
Author: &nbsp;&nbsp;&nbsp;&nbsp;Ronald Klop &lt;ronald@FreeBSD.org&gt;<br>
AuthorDate: 2023-11-04 14:14:00 +0000<br>
Commit: &nbsp;&nbsp;&nbsp;&nbsp;Ronald Klop &lt;ronald@FreeBSD.org&gt;<br>
CommitDate: 2023-12-07 11:32:01 +0000<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;Teach if_smsc to get MAC from bootargs.<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;Some Raspberry Pi pass smsc95xx.macaddr=XX:XX:XX:XX:XX:XX as bootargs.<br>
&nbsp;&nbsp;&nbsp;&nbsp;Use this if no ethernet address is found in an EEPROM.<br>
&nbsp;&nbsp;&nbsp;&nbsp;As last resort fall back to ether_gen_addr() instead of random MAC.<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;PR: &nbsp;&nbsp;&nbsp;&nbsp;274092<br>
&nbsp;&nbsp;&nbsp;&nbsp;Reported by: &nbsp;&nbsp;&nbsp;Patrick M. Hausen (via ML)<br>
&nbsp;&nbsp;&nbsp;&nbsp;Reviewed by: &nbsp;&nbsp;&nbsp;imp, karels, zlei<br>
&nbsp;&nbsp;&nbsp;&nbsp;Tested by: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Patrick M. Hausen<br>
&nbsp;&nbsp;&nbsp;&nbsp;Approved by: &nbsp;&nbsp;&nbsp;karels<br>
&nbsp;&nbsp;&nbsp;&nbsp;MFC after: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1 month<br>
&nbsp;&nbsp;&nbsp;&nbsp;Relnotes: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yes<br>
&nbsp;&nbsp;&nbsp;&nbsp;Differential Revision: <a href="https://reviews.freebsd.org/D42463">https://reviews.freebsd.org/D42463</a><br>;
---<br>
&nbsp;sys/dev/usb/net/if_smsc.c | 86 +++++++++++++++++++++++++++++++++++++++++++++--<br>
&nbsp;sys/net/ethernet.h &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| &nbsp;1 +<br>
&nbsp;sys/net/if_ethersubr.c &nbsp;&nbsp;&nbsp;| 10 ++++--<br>
&nbsp;3 files changed, 92 insertions(+), 5 deletions(-)<br>
<br>
diff --git a/sys/dev/usb/net/if_smsc.c b/sys/dev/usb/net/if_smsc.c<br>
index ec8197229f17..54b18e0a67c9 100644<br>
--- a/sys/dev/usb/net/if_smsc.c<br>
+++ b/sys/dev/usb/net/if_smsc.c<br>
@@ -179,6 +179,8 @@ static const struct usb_device_id smsc_devs[] = {<br>
&nbsp;#define ETHER_IS_VALID(addr) \<br>
&nbsp;&nbsp;&nbsp;&nbsp;(!ETHER_IS_MULTICAST(addr) &amp;&amp; !ETHER_IS_ZERO(addr))<br>
&nbsp;<br>
+#define BOOTARGS_SMSC95XX &nbsp;"smsc95xx.macaddr"<br>
+<br>
&nbsp;static device_probe_t smsc_probe;<br>
&nbsp;static device_attach_t smsc_attach;<br>
&nbsp;static device_detach_t smsc_detach;<br>
@@ -1538,6 +1540,76 @@ smsc_ioctl(if_t ifp, u_long cmd, caddr_t data)<br>
&nbsp;&nbsp;&nbsp;&nbsp;return (rc);<br>
&nbsp;}<br>
&nbsp;<br>
+#ifdef FDT<br>
+static bool<br>
+smsc_get_smsc95xx_macaddr(char* bootargs, size_t len, struct usb_ether *ue)<br>
+{<br>
+ &nbsp;&nbsp;int values[6];<br>
+ &nbsp;&nbsp;int i;<br>
+ &nbsp;&nbsp;char* p;<br>
+<br>
+ &nbsp;&nbsp;p = strnstr(bootargs, BOOTARGS_SMSC95XX, len);<br>
+ &nbsp;&nbsp;if (p == NULL)<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (false);<br>
+<br>
+ &nbsp;&nbsp;if (sscanf(p, BOOTARGS_SMSC95XX "=%x:%x:%x:%x:%x:%x%*c",<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;values[0], &amp;values[1], &amp;values[2],<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;values[3], &amp;values[4], &amp;values[5]) != 6) {<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;smsc_warn_printf((struct smsc_softc *)ue-&gt;ue_sc,<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"invalid mac from bootargs '%s'.\n", p);<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (false);<br>
+ &nbsp;&nbsp;}<br>
+<br>
+ &nbsp;&nbsp;for (i = 0; i &lt; ETHER_ADDR_LEN; ++i)<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ue-&gt;ue_eaddr[i] = values[i];<br>
+<br>
+ &nbsp;&nbsp;smsc_dbg_printf((struct smsc_softc *)ue-&gt;ue_sc,<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"bootargs mac=%6D.\n", ue-&gt;ue_eaddr, ":");<br>
+ &nbsp;&nbsp;return (true);<br>
+}<br>
+<br>
+/**<br>
+ * Raspberry Pi is known to pass smsc95xx.macaddr=XX:XX:XX:XX:XX:XX via<br>
+ * bootargs.<br>
+ */<br>
+static bool<br>
+smsc_bootargs_get_mac_addr(device_t dev, struct usb_ether *ue)<br>
+{<br>
+ &nbsp;&nbsp;char *bootargs;<br>
+ &nbsp;&nbsp;ssize_t len;<br>
+ &nbsp;&nbsp;phandle_t node;<br>
+<br>
+ &nbsp;&nbsp;/* only use bootargs for the first device<br>
+ &nbsp;&nbsp;&nbsp;* to prevent duplicate mac addresses */<br>
+ &nbsp;&nbsp;if (device_get_unit(dev) != 0)<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (false);<br>
+ &nbsp;&nbsp;node = OF_finddevice("/chosen");<br>
+ &nbsp;&nbsp;if (node == -1)<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (false);<br>
+ &nbsp;&nbsp;if (OF_hasprop(node, "bootargs") == 0) {<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;smsc_dbg_printf((struct smsc_softc *)ue-&gt;ue_sc,<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"bootargs not found");<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (false);<br>
+ &nbsp;&nbsp;}<br>
+ &nbsp;&nbsp;len = OF_getprop_alloc(node, "bootargs", (void **)&amp;bootargs);<br>
+ &nbsp;&nbsp;if (len == -1 || bootargs == NULL) {<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;smsc_warn_printf((struct smsc_softc *)ue-&gt;ue_sc,<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"failed alloc for bootargs (%lu)", len);<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (false);<br>
+ &nbsp;&nbsp;}<br>
+ &nbsp;&nbsp;smsc_dbg_printf((struct smsc_softc *)ue-&gt;ue_sc, "bootargs: %s.\n",<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bootargs);<br>
+ &nbsp;&nbsp;if (!smsc_get_smsc95xx_macaddr(bootargs, len, ue)) {<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OF_prop_free(bootargs);<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (false);<br>
+ &nbsp;&nbsp;}<br>
+ &nbsp;&nbsp;OF_prop_free(bootargs);<br>
+ &nbsp;&nbsp;device_printf(dev, "MAC address found in bootargs %6D.\n",<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ue-&gt;ue_eaddr, ":");<br>
+ &nbsp;&nbsp;return (true);<br>
+}<br>
+#endif<br>
+<br>
&nbsp;/**<br>
&nbsp;&nbsp;* smsc_attach_post - Called after the driver attached to the USB interface<br>
&nbsp;&nbsp;* @ue: the USB ethernet device<br>
@@ -1552,8 +1624,10 @@ static void<br>
&nbsp;smsc_attach_post(struct usb_ether *ue)<br>
&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp;struct smsc_softc *sc = uether_getsc(ue);<br>
+ &nbsp;&nbsp;struct ether_addr eaddr;<br>
&nbsp;&nbsp;&nbsp;&nbsp;uint32_t mac_h, mac_l;<br>
&nbsp;&nbsp;&nbsp;&nbsp;int err;<br>
+ &nbsp;&nbsp;int i;<br>
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;smsc_dbg_printf(sc, "smsc_attach_post\n");<br>
&nbsp;<br>
@@ -1585,11 +1659,17 @@ smsc_attach_post(struct usb_ether *ue)<br>
&nbsp;#ifdef FDT<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ((err != 0) || (!ETHER_IS_VALID(sc-&gt;sc_ue.ue_eaddr)))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err = usb_fdt_get_mac_addr(sc-&gt;sc_ue.ue_dev, &amp;sc-&gt;sc_ue);<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ((err != 0) || (!ETHER_IS_VALID(sc-&gt;sc_ue.ue_eaddr)))<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err = smsc_bootargs_get_mac_addr(sc-&gt;sc_ue.ue_dev,<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;sc-&gt;sc_ue) ? (0) : (1);<br>
&nbsp;#endif<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ((err != 0) || (!ETHER_IS_VALID(sc-&gt;sc_ue.ue_eaddr))) {<br>
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;read_random(sc-&gt;sc_ue.ue_eaddr, ETHER_ADDR_LEN);<br>
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sc-&gt;sc_ue.ue_eaddr[0] &amp;= ~0x01; &nbsp;&nbsp;&nbsp;&nbsp;/* unicast */<br>
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sc-&gt;sc_ue.ue_eaddr[0] |= &nbsp;0x02; &nbsp;&nbsp;&nbsp;&nbsp;/* locally administered */<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;smsc_dbg_printf(sc, "No MAC address found."<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" Using ether_gen_addr().\n");<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ether_gen_addr_byname(device_get_nameunit(ue-&gt;ue_dev),<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;eaddr);<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (i = 0; i &lt; ETHER_ADDR_LEN; i++)<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sc-&gt;sc_ue.ue_eaddr[i] = eaddr.octet[i];<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>
&nbsp;&nbsp;&nbsp;&nbsp;}<br>
&nbsp;<br>
diff --git a/sys/net/ethernet.h b/sys/net/ethernet.h<br>
index fca6748a0da7..e7313e78c5bb 100644<br>
--- a/sys/net/ethernet.h<br>
+++ b/sys/net/ethernet.h<br>
@@ -448,6 +448,7 @@ struct mbuf &nbsp;*ether_vlanencap_proto(struct mbuf *, uint16_t, uint16_t);<br>
&nbsp;bool &nbsp;&nbsp;ether_8021q_frame(struct mbuf **mp, struct ifnet *ife,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct ifnet *p, const struct ether_8021q_tag *);<br>
&nbsp;void &nbsp;&nbsp;ether_gen_addr(struct ifnet *ifp, struct ether_addr *hwaddr);<br>
+void &nbsp;&nbsp;ether_gen_addr_byname(const char *nameunit, struct ether_addr *hwaddr);<br>
&nbsp;<br>
&nbsp;static __inline struct mbuf *ether_vlanencap(struct mbuf *m, uint16_t tag)<br>
&nbsp;{<br>
diff --git a/sys/net/if_ethersubr.c b/sys/net/if_ethersubr.c<br>
index 7a32d0091260..ef0b1f705260 100644<br>
--- a/sys/net/if_ethersubr.c<br>
+++ b/sys/net/if_ethersubr.c<br>
@@ -1487,7 +1487,7 @@ ether_8021q_frame(struct mbuf **mp, struct ifnet *ife, struct ifnet *p,<br>
&nbsp;&nbsp;* allocate non-locally-administered addresses.<br>
&nbsp;&nbsp;*/<br>
&nbsp;void<br>
-ether_gen_addr(struct ifnet *ifp, struct ether_addr *hwaddr)<br>
+ether_gen_addr_byname(const char *nameunit, struct ether_addr *hwaddr)<br>
&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp;SHA1_CTX ctx;<br>
&nbsp;&nbsp;&nbsp;&nbsp;char *buf;<br>
@@ -1506,7 +1506,7 @@ ether_gen_addr(struct ifnet *ifp, struct ether_addr *hwaddr)<br>
&nbsp;&nbsp;&nbsp;&nbsp;/* If each (vnet) jail would also have a unique hostuuid this would not<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* be necessary. */<br>
&nbsp;&nbsp;&nbsp;&nbsp;getjailname(curthread-&gt;td_ucred, jailname, sizeof(jailname));<br>
- &nbsp;&nbsp;sz = asprintf(&amp;buf, M_TEMP, "%s-%s-%s", uuid, if_name(ifp),<br>
+ &nbsp;&nbsp;sz = asprintf(&amp;buf, M_TEMP, "%s-%s-%s", uuid, nameunit,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jailname);<br>
&nbsp;&nbsp;&nbsp;&nbsp;if (sz &lt; 0) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* Fall back to a random mac address. */<br>
@@ -1535,5 +1535,11 @@ rando:<br>
&nbsp;&nbsp;&nbsp;&nbsp;hwaddr-&gt;octet[0] |= 0x02;<br>
&nbsp;}<br>
&nbsp;<br>
+void<br>
+ether_gen_addr(struct ifnet *ifp, struct ether_addr *hwaddr)<br>
+{<br>
+ &nbsp;&nbsp;ether_gen_addr_byname(if_name(ifp), hwaddr);<br>
+}<br>
+<br>
&nbsp;DECLARE_MODULE(ether, ether_mod, SI_SUB_INIT_IF, SI_ORDER_ANY);<br>
&nbsp;MODULE_VERSION(ether, 1);<br>
&nbsp;</div>

<hr></div>
</blockquote>
<br>
&nbsp;</body></html>
------=_Part_206754_566537090.1701962301262--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?271104654.206755.1701962301276>