netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Struan Bartlett <struan.bartlett@gmail.com>
To: Matt Mackall <mpm@selenic.com>
Cc: linux-kernel@vger.kernel.org,
	Andreas Schwab <schwab@linux-m68k.org>,
	netdev@vger.kernel.org, "David S. Miller" <davem@davemloft.net>,
	Nikolay Aleksandrov <nikolay@redhat.com>,
	Andy Shevchenko <andy.shevchenko@gmail.com>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Jiri Pirko <jiri@resnulli.us>, Joe Perches <joe@perches.com>,
	Dan Aloni <alonid@postram.com>
Subject: [PATCH v2] netconsole: Add tty driver
Date: Tue, 01 Apr 2014 23:26:27 +0200	[thread overview]
Message-ID: <533B2F03.6060008@gmail.com> (raw)

Adds tty driver to netconsole module. When module is loaded,
creates /dev/netcon0 device and enables support for console=netcon0
kernel cmdline option, causing /dev/console output to be sent to
/dev/netcon0. This allows startup/shutdown script output from
headless platforms to be logged over (secure) network.

To: Matt Mackall <mpm@selenic.com>
Signed-off-by: Struan Bartlett <struan.bartlett@gmail.com>
---

Changes since v1:
  * Fixed whitespace mangled by broken mailer

--- a/drivers/net/netconsole.c	2014-03-31 04:40:15.000000000 +0100
+++ b/drivers/net/netconsole.c	2014-04-01 11:58:50.000000000 +0100
@@ -15,6 +15,7 @@
   *               generic card hooks
   *               works non-modular
   * 2003-09-07    rewritten with netpoll api
+ * 2014-03-31    tty driver by Struan Bartlett
   */

  /****************************************************************
@@ -47,6 +48,7 @@
  #include <linux/netpoll.h>
  #include <linux/inet.h>
  #include <linux/configfs.h>
+#include <linux/tty.h>

  MODULE_AUTHOR("Maintainer: Matt Mackall <mpm@selenic.com>");
  MODULE_DESCRIPTION("Console driver for network interfaces");
@@ -728,7 +730,7 @@ static struct notifier_block netconsole_
  	.notifier_call  = netconsole_netdev_event,
  };

-static void write_msg(struct console *con, const char *msg, unsigned 
int len)
+static void _write_msg(const char *msg, unsigned int len)
  {
  	int frag, left;
  	unsigned long flags;
@@ -764,10 +766,63 @@ static void write_msg(struct console *co
  	spin_unlock_irqrestore(&target_list_lock, flags);
  }

+static void write_msg(struct console *con, const char *msg, unsigned 
int len)
+{
+	_write_msg(msg, len);
+}
+
+static int netconsole_tty_open(struct tty_struct *tty, struct file *filp)
+{
+	return 0;
+}
+
+static void netconsole_tty_close(struct tty_struct *tty, struct file *filp)
+{
+}
+
+static int netconsole_tty_write(struct tty_struct *tty,
+				const unsigned char *buf, int count)
+{
+	_write_msg(buf, count);
+	return count;
+}
+
+static int netconsole_tty_put_char(struct tty_struct *tty, unsigned 
char ch)
+{
+	char temp[2] = { ch, 0 };
+	_write_msg(temp, 1);
+	return 1;
+}
+
+static int netconsole_tty_write_room(struct tty_struct *tty)
+{
+	return MAX_PRINT_CHUNK;
+}
+
+static const struct tty_operations netconsole_tty_ops = {
+	.open		= netconsole_tty_open,
+	.close		= netconsole_tty_close,
+	.write		= netconsole_tty_write,
+	.put_char	= netconsole_tty_put_char,
+	.write_room	= netconsole_tty_write_room,
+};
+
+static struct tty_port netconsole_tty_port;
+static struct tty_driver *netconsole_tty_driver;
+
+static struct tty_driver *netconsole_device(struct console *co, int *index)
+{
+	if (!(co->flags & CON_ENABLED))
+		return NULL;
+	*index = co->index;
+	return netconsole_tty_driver;
+}
+
  static struct console netconsole = {
  	.name	= "netcon",
  	.flags	= CON_ENABLED,
  	.write	= write_msg,
+	.device = netconsole_device
  };

  static int __init init_netconsole(void)
@@ -802,11 +857,39 @@ static int __init init_netconsole(void)
  	if (err)
  		goto undonotifier;

+	netconsole_tty_driver = alloc_tty_driver(1);
+	if (!netconsole_tty_driver) {
+		err = -ENOMEM;
+		goto undonotifier;
+	}
+
+	tty_port_init(&netconsole_tty_port);
+
+	netconsole_tty_driver->driver_name = "netcon";
+	netconsole_tty_driver->name = "netcon";
+	netconsole_tty_driver->type = TTY_DRIVER_TYPE_SYSTEM;
+	netconsole_tty_driver->subtype = SYSTEM_TYPE_TTY;
+	netconsole_tty_driver->init_termios = tty_std_termios;
+	netconsole_tty_driver->init_termios.c_iflag = 0;
+	netconsole_tty_driver->init_termios.c_oflag = 0;
+	netconsole_tty_driver->flags = TTY_DRIVER_REAL_RAW;
+
+	tty_set_operations(netconsole_tty_driver, &netconsole_tty_ops);
+	tty_port_link_device(&netconsole_tty_port, netconsole_tty_driver, 0);
+
+	err = tty_register_driver(netconsole_tty_driver);
+	if (err)
+		goto undotty;
+
  	register_console(&netconsole);
  	pr_info("network logging started\n");

  	return err;

+undotty:
+	put_tty_driver(netconsole_tty_driver);
+	tty_port_destroy(&netconsole_tty_port);
+
  undonotifier:
  	unregister_netdevice_notifier(&netconsole_netdev_notifier);

@@ -830,6 +913,10 @@ static void __exit cleanup_netconsole(vo
  {
  	struct netconsole_target *nt, *tmp;

+	tty_unregister_driver(netconsole_tty_driver);
+	put_tty_driver(netconsole_tty_driver);
+	tty_port_destroy(&netconsole_tty_port);
+
  	unregister_console(&netconsole);
  	dynamic_netconsole_exit();
  	unregister_netdevice_notifier(&netconsole_netdev_notifier);

             reply	other threads:[~2014-04-01 21:26 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-04-01 21:26 Struan Bartlett [this message]
2014-04-01 21:37 ` [PATCH v2] netconsole: Add tty driver David Miller
2014-04-02 12:16 ` Tetsuo Handa
2014-04-02 22:30   ` Struan Bartlett

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=533B2F03.6060008@gmail.com \
    --to=struan.bartlett@gmail.com \
    --cc=alonid@postram.com \
    --cc=andy.shevchenko@gmail.com \
    --cc=davem@davemloft.net \
    --cc=gregkh@linuxfoundation.org \
    --cc=jiri@resnulli.us \
    --cc=joe@perches.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mpm@selenic.com \
    --cc=netdev@vger.kernel.org \
    --cc=nikolay@redhat.com \
    --cc=schwab@linux-m68k.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).