I'm very pleased to announce the release of our new website and documentation using the new toolchain with Hugo and AsciiDoctor. To get more information about the new toolchain please read the FreeBSD Documentation Project Primer[1], Hugo docs[2] and AsciiDoctor docs[3]. Acknowledgment: Benedict Reuschling <bcr@> Glen Barber <gjb@> Hiroki Sato <hrs@> Li-Wen Hsu <lwhsu@> Sean Chittenden <seanc@> The FreeBSD Foundation [1] https://docs.FreeBSD.org/en/books/fdp-primer/ [2] https://gohugo.io/documentation/ [3] https://docs.asciidoctor.org/home/ Approved by: doceng, core
112 lines
3 KiB
Diff
112 lines
3 KiB
Diff
--- sys/net/if_clone.c.orig
|
|
+++ sys/net/if_clone.c
|
|
@@ -211,6 +211,18 @@
|
|
return (if_clone_createif(ifc, name, len, params));
|
|
}
|
|
|
|
+void
|
|
+if_clone_addif(struct if_clone *ifc, struct ifnet *ifp)
|
|
+{
|
|
+
|
|
+ if ((ifc->ifc_flags & IFC_NOGROUP) == 0)
|
|
+ if_addgroup(ifp, ifc->ifc_name);
|
|
+
|
|
+ IF_CLONE_LOCK(ifc);
|
|
+ IFC_IFLIST_INSERT(ifc, ifp);
|
|
+ IF_CLONE_UNLOCK(ifc);
|
|
+}
|
|
+
|
|
/*
|
|
* Create a clone network interface.
|
|
*/
|
|
@@ -233,12 +245,7 @@
|
|
if (ifp == NULL)
|
|
panic("%s: lookup failed for %s", __func__, name);
|
|
|
|
- if ((ifc->ifc_flags & IFC_NOGROUP) == 0)
|
|
- if_addgroup(ifp, ifc->ifc_name);
|
|
-
|
|
- IF_CLONE_LOCK(ifc);
|
|
- IFC_IFLIST_INSERT(ifc, ifp);
|
|
- IF_CLONE_UNLOCK(ifc);
|
|
+ if_clone_addif(ifc, ifp);
|
|
}
|
|
|
|
return (err);
|
|
--- sys/net/if_clone.h.orig
|
|
+++ sys/net/if_clone.h
|
|
@@ -79,7 +79,8 @@
|
|
struct if_clone *if_clone_findifc(struct ifnet *);
|
|
void if_clone_addgroup(struct ifnet *, struct if_clone *);
|
|
|
|
-/* The below interface used only by epair(4). */
|
|
+/* The below interfaces are used only by epair(4). */
|
|
+void if_clone_addif(struct if_clone *, struct ifnet *);
|
|
int if_clone_destroyif(struct if_clone *, struct ifnet *);
|
|
|
|
#endif /* _KERNEL */
|
|
--- sys/net/if_epair.c.orig
|
|
+++ sys/net/if_epair.c
|
|
@@ -711,6 +711,21 @@
|
|
return (1);
|
|
}
|
|
|
|
+static void
|
|
+epair_clone_add(struct if_clone *ifc, struct epair_softc *scb)
|
|
+{
|
|
+ struct ifnet *ifp;
|
|
+ uint8_t eaddr[ETHER_ADDR_LEN]; /* 00:00:00:00:00:00 */
|
|
+
|
|
+ ifp = scb->ifp;
|
|
+ /* Copy epairNa etheraddr and change the last byte. */
|
|
+ memcpy(eaddr, scb->oifp->if_hw_addr, ETHER_ADDR_LEN);
|
|
+ eaddr[5] = 0x0b;
|
|
+ ether_ifattach(ifp, eaddr);
|
|
+
|
|
+ if_clone_addif(ifc, ifp);
|
|
+}
|
|
+
|
|
static int
|
|
epair_clone_create(struct if_clone *ifc, char *name, size_t len, caddr_t params)
|
|
{
|
|
@@ -723,24 +738,6 @@
|
|
uint32_t hash;
|
|
uint8_t eaddr[ETHER_ADDR_LEN]; /* 00:00:00:00:00:00 */
|
|
|
|
- /*
|
|
- * We are abusing params to create our second interface.
|
|
- * Actually we already created it and called if_clone_create()
|
|
- * for it to do the official insertion procedure the moment we knew
|
|
- * it cannot fail anymore. So just do attach it here.
|
|
- */
|
|
- if (params) {
|
|
- scb = (struct epair_softc *)params;
|
|
- ifp = scb->ifp;
|
|
- /* Copy epairNa etheraddr and change the last byte. */
|
|
- memcpy(eaddr, scb->oifp->if_hw_addr, ETHER_ADDR_LEN);
|
|
- eaddr[5] = 0x0b;
|
|
- ether_ifattach(ifp, eaddr);
|
|
- /* Correctly set the name for the cloner list. */
|
|
- strlcpy(name, ifp->if_xname, len);
|
|
- return (0);
|
|
- }
|
|
-
|
|
/* Try to see if a special unit was requested. */
|
|
error = ifc_name2unit(name, &unit);
|
|
if (error != 0)
|
|
@@ -891,10 +888,11 @@
|
|
if_setsendqready(ifp);
|
|
/* We need to play some tricks here for the second interface. */
|
|
strlcpy(name, epairname, len);
|
|
- error = if_clone_create(name, len, (caddr_t)scb);
|
|
- if (error)
|
|
- panic("%s: if_clone_create() for our 2nd iface failed: %d",
|
|
- __func__, error);
|
|
+
|
|
+ /* Correctly set the name for the cloner list. */
|
|
+ strlcpy(name, scb->ifp->if_xname, len);
|
|
+ epair_clone_add(ifc, scb);
|
|
+
|
|
scb->if_qflush = ifp->if_qflush;
|
|
ifp->if_qflush = epair_qflush;
|
|
ifp->if_transmit = epair_transmit;
|