Module Name: src
Committed By: knakahara
Date: Mon Oct 30 11:24:04 UTC 2017
Modified Files:
src/sys/net: if_l2tp.c if_l2tp.h
Log Message:
If if_attach() failed in the attach function, return. Add comments about
if_initialize().
suggested by [email protected].
To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.13 src/sys/net/if_l2tp.c
cvs rdiff -u -r1.2 -r1.3 src/sys/net/if_l2tp.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/net/if_l2tp.c
diff -u src/sys/net/if_l2tp.c:1.12 src/sys/net/if_l2tp.c:1.13
--- src/sys/net/if_l2tp.c:1.12 Thu Oct 19 11:28:30 2017
+++ src/sys/net/if_l2tp.c Mon Oct 30 11:24:04 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: if_l2tp.c,v 1.12 2017/10/19 11:28:30 knakahara Exp $ */
+/* $NetBSD: if_l2tp.c,v 1.13 2017/10/30 11:24:04 knakahara Exp $ */
/*
* Copyright (c) 2017 Internet Initiative Japan Inc.
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_l2tp.c,v 1.12 2017/10/19 11:28:30 knakahara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_l2tp.c,v 1.13 2017/10/30 11:24:04 knakahara Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -227,10 +227,17 @@ l2tp_clone_create(struct if_clone *ifc,
{
struct l2tp_softc *sc;
struct l2tp_variant *var;
+ int rv;
sc = kmem_zalloc(sizeof(struct l2tp_softc), KM_SLEEP);
- var = kmem_zalloc(sizeof(struct l2tp_variant), KM_SLEEP);
+ if_initname(&sc->l2tp_ec.ec_if, ifc->ifc_name, unit);
+ rv = l2tpattach0(sc);
+ if (rv != 0) {
+ kmem_free(sc, sizeof(struct l2tp_softc));
+ return rv;
+ }
+ var = kmem_zalloc(sizeof(struct l2tp_variant), KM_SLEEP);
var->lv_softc = sc;
var->lv_state = L2TP_STATE_DOWN;
var->lv_use_cookie = L2TP_COOKIE_OFF;
@@ -240,10 +247,6 @@ l2tp_clone_create(struct if_clone *ifc,
mutex_init(&sc->l2tp_lock, MUTEX_DEFAULT, IPL_NONE);
PSLIST_ENTRY_INIT(sc, l2tp_hash);
- if_initname(&sc->l2tp_ec.ec_if, ifc->ifc_name, unit);
-
- l2tpattach0(sc);
-
sc->l2tp_ro_percpu = percpu_alloc(sizeof(struct l2tp_ro));
percpu_foreach(sc->l2tp_ro_percpu, l2tp_ro_init_pc, NULL);
@@ -254,9 +257,10 @@ l2tp_clone_create(struct if_clone *ifc,
return (0);
}
-void
+int
l2tpattach0(struct l2tp_softc *sc)
{
+ int rv;
sc->l2tp_ec.ec_if.if_addrlen = 0;
sc->l2tp_ec.ec_if.if_mtu = L2TP_MTU;
@@ -270,9 +274,19 @@ l2tpattach0(struct l2tp_softc *sc)
sc->l2tp_ec.ec_if.if_transmit = l2tp_transmit;
sc->l2tp_ec.ec_if._if_input = ether_input;
IFQ_SET_READY(&sc->l2tp_ec.ec_if.if_snd);
- if_attach(&sc->l2tp_ec.ec_if);
+ /* XXX
+ * It may improve performance to use if_initialize()/if_register()
+ * so that l2tp_input() calls if_input() instead of
+ * if_percpuq_enqueue(). However, that causes recursive softnet_lock
+ * when NET_MPSAFE is not set.
+ */
+ rv = if_attach(&sc->l2tp_ec.ec_if);
+ if (rv != 0)
+ return rv;
if_alloc_sadl(&sc->l2tp_ec.ec_if);
bpf_attach(&sc->l2tp_ec.ec_if, DLT_EN10MB, sizeof(struct ether_header));
+
+ return 0;
}
void
Index: src/sys/net/if_l2tp.h
diff -u src/sys/net/if_l2tp.h:1.2 src/sys/net/if_l2tp.h:1.3
--- src/sys/net/if_l2tp.h:1.2 Wed May 31 08:19:44 2017
+++ src/sys/net/if_l2tp.h Mon Oct 30 11:24:04 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: if_l2tp.h,v 1.2 2017/05/31 08:19:44 knakahara Exp $ */
+/* $NetBSD: if_l2tp.h,v 1.3 2017/10/30 11:24:04 knakahara Exp $ */
/*
* Copyright (c) 2017 Internet Initiative Japan Inc.
@@ -162,7 +162,7 @@ l2tp_heldref_variant(struct l2tp_variant
/* Prototypes */
void l2tpattach(int);
-void l2tpattach0(struct l2tp_softc *);
+int l2tpattach0(struct l2tp_softc *);
void l2tp_input(struct mbuf *, struct ifnet *);
int l2tp_ioctl(struct ifnet *, u_long, void *);