Module Name: src
Committed By: yamaguchi
Date: Thu Sep 30 03:47:28 UTC 2021
Modified Files:
src/sys/net: if_ethersubr.c if_vlan.c if_vlanvar.h
src/sys/rump/librump/rumpnet: net_stub.c
Log Message:
vlan: Register the callback to update link-state of vlan I/F
to link-state change hook
The callback is registered in every vlan I/F even if the parent
interface is the same. Therefore it is not needed to search the
vlan I/F by the parent interface unlike the previous callback.
To generate a diff of this commit:
cvs rdiff -u -r1.294 -r1.295 src/sys/net/if_ethersubr.c
cvs rdiff -u -r1.161 -r1.162 src/sys/net/if_vlan.c
cvs rdiff -u -r1.14 -r1.15 src/sys/net/if_vlanvar.h
cvs rdiff -u -r1.45 -r1.46 src/sys/rump/librump/rumpnet/net_stub.c
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_ethersubr.c
diff -u src/sys/net/if_ethersubr.c:1.294 src/sys/net/if_ethersubr.c:1.295
--- src/sys/net/if_ethersubr.c:1.294 Thu Sep 30 03:15:25 2021
+++ src/sys/net/if_ethersubr.c Thu Sep 30 03:47:27 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: if_ethersubr.c,v 1.294 2021/09/30 03:15:25 yamaguchi Exp $ */
+/* $NetBSD: if_ethersubr.c,v 1.295 2021/09/30 03:47:27 yamaguchi 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.294 2021/09/30 03:15:25 yamaguchi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ethersubr.c,v 1.295 2021/09/30 03:47:27 yamaguchi Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -1008,12 +1008,7 @@ ether_snprintf(char *buf, size_t len, co
static void
ether_link_state_changed(struct ifnet *ifp, int link_state)
{
-#if NVLAN > 0
- struct ethercom *ec = (void *)ifp;
- if (ec->ec_nvlans)
- vlan_link_state_changed(ifp, link_state);
-#endif
}
/*
Index: src/sys/net/if_vlan.c
diff -u src/sys/net/if_vlan.c:1.161 src/sys/net/if_vlan.c:1.162
--- src/sys/net/if_vlan.c:1.161 Sat Jul 17 15:37:04 2021
+++ src/sys/net/if_vlan.c Thu Sep 30 03:47:27 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: if_vlan.c,v 1.161 2021/07/17 15:37:04 hannken Exp $ */
+/* $NetBSD: if_vlan.c,v 1.162 2021/09/30 03:47:27 yamaguchi Exp $ */
/*
* Copyright (c) 2000, 2001 The NetBSD Foundation, Inc.
@@ -78,7 +78,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_vlan.c,v 1.161 2021/07/17 15:37:04 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_vlan.c,v 1.162 2021/09/30 03:47:27 yamaguchi Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -156,6 +156,7 @@ struct ifvlan {
*/
kmutex_t ifv_lock; /* writer lock for ifv_mib */
pserialize_t ifv_psz;
+ void *ifv_linkstate_hook;
LIST_HEAD(__vlan_mchead, vlan_mc_entry) ifv_mc_listhead;
LIST_ENTRY(ifvlan) ifv_list;
@@ -195,6 +196,7 @@ static int vlan_config(struct ifvlan *,
static int vlan_ioctl(struct ifnet *, u_long, void *);
static void vlan_start(struct ifnet *);
static int vlan_transmit(struct ifnet *, struct mbuf *);
+static void vlan_link_state_changed(void *);
static void vlan_unconfig(struct ifnet *);
static int vlan_unconfig_locked(struct ifvlan *, struct ifvlan_linkmib *);
static void vlan_hash_init(void);
@@ -549,10 +551,11 @@ vlan_config(struct ifvlan *ifv, struct i
nmib_psref = NULL;
omib_cleanup = true;
-
/*
* We inherit the parents link state.
*/
+ ifv->ifv_linkstate_hook = if_linkstate_change_establish(p,
+ vlan_link_state_changed, ifv);
if_link_state_change(&ifv->ifv_if, p->if_link_state);
done:
@@ -684,6 +687,8 @@ vlan_unconfig_locked(struct ifvlan *ifv,
pserialize_perform(vlan_psz);
mutex_exit(&ifv_hash.lock);
PSLIST_ENTRY_DESTROY(ifv, ifv_hash);
+ if_linkstate_change_disestablish(p,
+ ifv->ifv_linkstate_hook, NULL);
vlan_linkmib_update(ifv, nmib);
if_link_state_change(ifp, LINK_STATE_DOWN);
@@ -1733,30 +1738,28 @@ out:
/*
* If the parent link state changed, the vlan link state should change also.
*/
-void
-vlan_link_state_changed(struct ifnet *p, int link_state)
+static void
+vlan_link_state_changed(void *xifv)
{
- struct ifvlan *ifv;
+ struct ifvlan *ifv = xifv;
+ struct ifnet *ifp, *p;
struct ifvlan_linkmib *mib;
struct psref psref;
- struct ifnet *ifp;
-
- mutex_enter(&ifv_list.lock);
-
- LIST_FOREACH(ifv, &ifv_list.list, ifv_list) {
- mib = vlan_getref_linkmib(ifv, &psref);
- if (mib == NULL)
- continue;
- if (mib->ifvm_p == p) {
- ifp = &mib->ifvm_ifvlan->ifv_if;
- if_link_state_change(ifp, link_state);
- }
+ mib = vlan_getref_linkmib(ifv, &psref);
+ if (mib == NULL)
+ return;
+ if (mib->ifvm_p == NULL) {
vlan_putref_linkmib(mib, &psref);
+ return;
}
- mutex_exit(&ifv_list.lock);
+ ifp = &ifv->ifv_if;
+ p = mib->ifvm_p;
+ if_link_state_change(ifp, p->if_link_state);
+
+ vlan_putref_linkmib(mib, &psref);
}
/*
Index: src/sys/net/if_vlanvar.h
diff -u src/sys/net/if_vlanvar.h:1.14 src/sys/net/if_vlanvar.h:1.15
--- src/sys/net/if_vlanvar.h:1.14 Sat Sep 26 18:38:09 2020
+++ src/sys/net/if_vlanvar.h Thu Sep 30 03:47:27 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: if_vlanvar.h,v 1.14 2020/09/26 18:38:09 roy Exp $ */
+/* $NetBSD: if_vlanvar.h,v 1.15 2021/09/30 03:47:27 yamaguchi Exp $ */
/*
* Copyright (c) 2000 The NetBSD Foundation, Inc.
@@ -83,7 +83,6 @@ struct vlanreq {
#ifdef _KERNEL
void vlan_input(struct ifnet *, struct mbuf *);
void vlan_ifdetach(struct ifnet *);
-void vlan_link_state_changed(struct ifnet *, int);
/*
* Locking notes:
Index: src/sys/rump/librump/rumpnet/net_stub.c
diff -u src/sys/rump/librump/rumpnet/net_stub.c:1.45 src/sys/rump/librump/rumpnet/net_stub.c:1.46
--- src/sys/rump/librump/rumpnet/net_stub.c:1.45 Thu Sep 30 03:39:39 2021
+++ src/sys/rump/librump/rumpnet/net_stub.c Thu Sep 30 03:47:28 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: net_stub.c,v 1.45 2021/09/30 03:39:39 yamaguchi Exp $ */
+/* $NetBSD: net_stub.c,v 1.46 2021/09/30 03:47:28 yamaguchi Exp $ */
/*
* Copyright (c) 2008 Antti Kantee. All Rights Reserved.
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: net_stub.c,v 1.45 2021/09/30 03:39:39 yamaguchi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: net_stub.c,v 1.46 2021/09/30 03:47:28 yamaguchi Exp $");
#include <sys/mutex.h>
#include <sys/param.h>
@@ -75,7 +75,6 @@ __weak_alias(pppoedisc_input,rumpnet_stu
/* vlan */
__weak_alias(vlan_input,rumpnet_stub);
__weak_alias(vlan_ifdetach,rumpnet_stub);
-__weak_alias(vlan_link_state_changed,rumpnet_stub);
/* ipsec */
/* FIXME: should modularize netipsec and reduce reverse symbol references */