Module Name:    src
Committed By:   ozaki-r
Date:           Wed Dec 28 07:26:25 UTC 2016

Modified Files:
        src/share/man/man9: ethersubr.9
        src/sys/net: if_ethersubr.c
        src/sys/netinet: ip_carp.c

Log Message:
Use ether_ifattach in carp_clone_create instead of C&P code

carp_clone_destroy calls ether_ifdetach so not calling ether_ifattach is
inconsistent. If we add something pair of initialization and destruction
to ether_ifattach and ether_ifdetach (e.g., mutex_init/mutex_destroy),
ether_ifdetach of carp_clone_destroy won't work. So use ether_ifattach.

In order to do so, make ether_ifattach accept the 2nd argument (lla) as
NULL to allow carp to initialize its link level address by itself.


To generate a diff of this commit:
cvs rdiff -u -r1.25 -r1.26 src/share/man/man9/ethersubr.9
cvs rdiff -u -r1.229 -r1.230 src/sys/net/if_ethersubr.c
cvs rdiff -u -r1.80 -r1.81 src/sys/netinet/ip_carp.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/share/man/man9/ethersubr.9
diff -u src/share/man/man9/ethersubr.9:1.25 src/share/man/man9/ethersubr.9:1.26
--- src/share/man/man9/ethersubr.9:1.25	Tue Sep 17 19:58:03 2013
+++ src/share/man/man9/ethersubr.9	Wed Dec 28 07:26:24 2016
@@ -1,4 +1,4 @@
-.\"	$NetBSD: ethersubr.9,v 1.25 2013/09/17 19:58:03 wiz Exp $
+.\"	$NetBSD: ethersubr.9,v 1.26 2016/12/28 07:26:24 ozaki-r Exp $
 .\"
 .\" Copyright (c) 1997 The NetBSD Foundation, Inc.
 .\" All rights reserved.
@@ -27,7 +27,7 @@
 .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 .\" POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd March 3, 1997
+.Dd December 28, 2016
 .Dt ETHERSUBR 9
 .Os
 .Sh NAME
@@ -94,6 +94,11 @@ address in the interface's address list 
 pointed to by
 .Fa lla
 there.
+Drivers can initialize the link level address by themselves by calling
+the function with
+.Fa lla
+as NULL and calling
+.Fn if_set_sadl .
 .Pp
 This function must be called from the driver's attach function.
 .It Fn fddi_ifattach "ifp" "lla"

Index: src/sys/net/if_ethersubr.c
diff -u src/sys/net/if_ethersubr.c:1.229 src/sys/net/if_ethersubr.c:1.230
--- src/sys/net/if_ethersubr.c:1.229	Tue Oct 18 07:30:30 2016
+++ src/sys/net/if_ethersubr.c	Wed Dec 28 07:26:24 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_ethersubr.c,v 1.229 2016/10/18 07:30:30 ozaki-r Exp $	*/
+/*	$NetBSD: if_ethersubr.c,v 1.230 2016/12/28 07:26:24 ozaki-r Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_ethersubr.c,v 1.229 2016/10/18 07:30:30 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ethersubr.c,v 1.230 2016/12/28 07:26:24 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -962,7 +962,8 @@ ether_ifattach(struct ifnet *ifp, const 
 	if (ifp->if_baudrate == 0)
 		ifp->if_baudrate = IF_Mbps(10);		/* just a default */
 
-	if_set_sadl(ifp, lla, ETHER_ADDR_LEN, !ETHER_IS_LOCAL(lla));
+	if (lla != NULL)
+		if_set_sadl(ifp, lla, ETHER_ADDR_LEN, !ETHER_IS_LOCAL(lla));
 
 	LIST_INIT(&ec->ec_multiaddrs);
 	ifp->if_broadcastaddr = etherbroadcastaddr;

Index: src/sys/netinet/ip_carp.c
diff -u src/sys/netinet/ip_carp.c:1.80 src/sys/netinet/ip_carp.c:1.81
--- src/sys/netinet/ip_carp.c:1.80	Mon Dec 12 03:55:57 2016
+++ src/sys/netinet/ip_carp.c	Wed Dec 28 07:26:25 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: ip_carp.c,v 1.80 2016/12/12 03:55:57 ozaki-r Exp $	*/
+/*	$NetBSD: ip_carp.c,v 1.81 2016/12/28 07:26:25 ozaki-r Exp $	*/
 /*	$OpenBSD: ip_carp.c,v 1.113 2005/11/04 08:11:54 mcbride Exp $	*/
 
 /*
@@ -33,7 +33,7 @@
 #endif
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip_carp.c,v 1.80 2016/12/12 03:55:57 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip_carp.c,v 1.81 2016/12/28 07:26:25 ozaki-r Exp $");
 
 /*
  * TODO:
@@ -835,33 +835,17 @@ carp_clone_create(struct if_clone *ifc, 
 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
 	ifp->if_ioctl = carp_ioctl;
 	ifp->if_start = carp_start;
-	ifp->if_output = carp_output;
-	ifp->if_type = IFT_CARP;
-	ifp->if_addrlen = ETHER_ADDR_LEN;
-	ifp->if_hdrlen = ETHER_HDR_LEN;
-	ifp->if_mtu = ETHERMTU;
 	IFQ_SET_MAXLEN(&ifp->if_snd, ifqmaxlen);
 	IFQ_SET_READY(&ifp->if_snd);
-	if_attach(ifp);
-
-	if_alloc_sadl(ifp);
-	ifp->if_broadcastaddr = etherbroadcastaddr;
+	if_initialize(ifp);
+	ether_ifattach(ifp, NULL);
 	carp_set_enaddr(sc);
-	LIST_INIT(&sc->sc_ac.ec_multiaddrs);
-	bpf_attach(ifp, DLT_EN10MB, ETHER_HDR_LEN);
-#ifdef MBUFTRACE
-	strlcpy(sc->sc_ac.ec_tx_mowner.mo_name, ifp->if_xname,
-	    sizeof(sc->sc_ac.ec_tx_mowner.mo_name));
-	strlcpy(sc->sc_ac.ec_tx_mowner.mo_descr, "tx",
-	    sizeof(sc->sc_ac.ec_tx_mowner.mo_descr));
-	strlcpy(sc->sc_ac.ec_rx_mowner.mo_name, ifp->if_xname,
-	    sizeof(sc->sc_ac.ec_rx_mowner.mo_name));
-	strlcpy(sc->sc_ac.ec_rx_mowner.mo_descr, "rx",
-	    sizeof(sc->sc_ac.ec_rx_mowner.mo_descr));
-	MOWNER_ATTACH(&sc->sc_ac.ec_tx_mowner);
-	MOWNER_ATTACH(&sc->sc_ac.ec_rx_mowner);
-	ifp->if_mowner = &sc->sc_ac.ec_tx_mowner;
-#endif
+	/* Overwrite ethernet defaults */
+	ifp->if_type = IFT_CARP;
+	ifp->if_output = carp_output;
+	ifp->if_extflags &= ~IFEF_OUTPUT_MPSAFE;
+	if_register(ifp);
+
 	return (0);
 }
 

Reply via email to