From: Martin Schiller <ms@dev.tdt.de>
To: andrew.hendry@gmail.com, davem@davemloft.net, kuba@kernel.org,
xie.he.0141@gmail.com
Cc: linux-x25@vger.kernel.org, netdev@vger.kernel.org,
linux-kernel@vger.kernel.org, Martin Schiller <ms@dev.tdt.de>
Subject: [PATCH 5/6] net/lapb: support netdev events
Date: Mon, 16 Nov 2020 08:31:48 +0100 [thread overview]
Message-ID: <20201116073149.23219-5-ms@dev.tdt.de> (raw)
In-Reply-To: <20201116073149.23219-1-ms@dev.tdt.de>
This makes it possible to handle carrier loss and detection.
In case of Carrier Loss, layer 2 is terminated
In case of Carrier Detection, we start timer t1 on a DCE interface,
and on a DTE interface we change to state LAPB_STATE_1 and start
sending SABM(E).
Signed-off-by: Martin Schiller <ms@dev.tdt.de>
---
net/lapb/lapb_iface.c | 74 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 74 insertions(+)
diff --git a/net/lapb/lapb_iface.c b/net/lapb/lapb_iface.c
index 3c03f6512c5f..6a109c8c286f 100644
--- a/net/lapb/lapb_iface.c
+++ b/net/lapb/lapb_iface.c
@@ -418,14 +418,88 @@ int lapb_data_transmit(struct lapb_cb *lapb, struct sk_buff *skb)
return used;
}
+/*
+ * Handle device status changes.
+ */
+static int lapb_device_event(struct notifier_block *this, unsigned long event,
+ void *ptr)
+{
+ struct net_device *dev = ptr;
+ struct lapb_cb *lapb;
+
+ if (!net_eq(dev_net(dev), &init_net))
+ return NOTIFY_DONE;
+
+ if (dev->type == ARPHRD_X25) {
+ switch (event) {
+ case NETDEV_REGISTER:
+ lapb_dbg(0, "(%p): got event NETDEV_REGISTER for device: %s\n", dev, dev->name);
+ break;
+ case NETDEV_POST_TYPE_CHANGE:
+ lapb_dbg(0, "(%p): got event NETDEV_POST_TYPE_CHANGE for device: %s\n", dev, dev->name);
+ break;
+ case NETDEV_UP:
+ lapb_dbg(0, "(%p): got event NETDEV_UP for device: %s\n", dev, dev->name);
+ break;
+ case NETDEV_GOING_DOWN:
+ lapb_dbg(0, "(%p): got event NETDEV_GOING_DOWN for device: %s\n", dev, dev->name);
+ break;
+ case NETDEV_DOWN:
+ lapb_dbg(0, "(%p): got event NETDEV_DOWN for device: %s\n", dev, dev->name);
+ break;
+ case NETDEV_PRE_TYPE_CHANGE:
+ lapb_dbg(0, "(%p): got event NETDEV_PRE_TYPE_CHANGE for device: %s\n", dev, dev->name);
+ break;
+ case NETDEV_UNREGISTER:
+ lapb_dbg(0, "(%p): got event NETDEV_UNREGISTER for device: %s\n", dev, dev->name);
+ break;
+ case NETDEV_CHANGE:
+ lapb_dbg(0, "(%p): got event NETDEV_CHANGE for device: %s\n", dev, dev->name);
+ lapb = lapb_devtostruct(dev);
+ if (lapb) {
+ if (!netif_carrier_ok(dev)) {
+ lapb_dbg(0, "(%p): Carrier lost -> Entering LAPB_STATE_0: %s\n", dev, dev->name);
+ lapb_disconnect_indication(lapb, LAPB_OK);
+ lapb_clear_queues(lapb);
+ lapb->state = LAPB_STATE_0;
+ lapb->n2count = 0;
+ lapb_stop_t1timer(lapb);
+ lapb_stop_t2timer(lapb);
+ } else {
+ lapb_dbg(0, "(%p): Carrier detected: %s\n", dev, dev->name);
+ if (lapb->mode & LAPB_DCE) {
+ lapb_start_t1timer(lapb);
+ } else {
+ if (lapb->state == LAPB_STATE_0) {
+ lapb->state = LAPB_STATE_1;
+ lapb_establish_data_link(lapb);
+ }
+ }
+ }
+ }
+ break;
+ }
+ }
+
+ return NOTIFY_DONE;
+}
+
+static struct notifier_block lapb_dev_notifier = {
+ .notifier_call = lapb_device_event,
+};
+
static int __init lapb_init(void)
{
+ register_netdevice_notifier(&lapb_dev_notifier);
+
return 0;
}
static void __exit lapb_exit(void)
{
WARN_ON(!list_empty(&lapb_list));
+
+ unregister_netdevice_notifier(&lapb_dev_notifier);
}
MODULE_AUTHOR("Jonathan Naylor <g4klx@g4klx.demon.co.uk>");
--
2.20.1
next prev parent reply other threads:[~2020-11-16 7:31 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-11-16 7:31 [PATCH 1/6] net/x25: add/remove x25_link_device by NETDEV_REGISTER/UNREGISTER Martin Schiller
2020-11-16 7:31 ` [PATCH 2/6] net/x25: make neighbour params configurable Martin Schiller
2020-11-16 13:10 ` kernel test robot
2020-11-16 13:10 ` kernel test robot
2020-11-16 7:31 ` [PATCH 3/6] net/x25: replace x25_kill_by_device with x25_kill_by_neigh Martin Schiller
2020-11-16 7:31 ` [PATCH 4/6] net/x25: support NETDEV_CHANGE notifier Martin Schiller
2020-11-16 7:31 ` Martin Schiller [this message]
2020-11-16 7:31 ` [PATCH 6/6] net/lapb: fix t1 timer handling Martin Schiller
2020-11-16 8:45 ` [PATCH 1/6] net/x25: add/remove x25_link_device by NETDEV_REGISTER/UNREGISTER Xie He
2020-11-16 8:59 ` Martin Schiller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20201116073149.23219-5-ms@dev.tdt.de \
--to=ms@dev.tdt.de \
--cc=andrew.hendry@gmail.com \
--cc=davem@davemloft.net \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-x25@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=xie.he.0141@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.