diff --git a/net/netconsole.c b/net/netconsole.c index c817107..99b9984 100644 --- a/net/netconsole.c +++ b/net/netconsole.c @@ -52,24 +52,6 @@ kfifo_put(priv->fifo, packet, net_eth_to_udplen(pkt)); } -static int nc_init(void) -{ - struct nc_priv *priv = g_priv; - - if (priv->con) - net_unregister(priv->con); - - priv->con = net_udp_new(priv->ip, priv->port, nc_handler, NULL); - if (IS_ERR(priv->con)) { - int ret = PTR_ERR(priv->con); - priv->con = NULL; - return ret; - } - - net_udp_bind(priv->con, priv->port); - return 0; -} - static int nc_getc(struct console_device *cdev) { struct nc_priv *priv = container_of(cdev, @@ -123,9 +105,39 @@ priv->busy = 0; } -static int nc_port_set(struct param_d *p, void *_priv) +static int nc_set_active(struct console_device *cdev, unsigned flags) { - nc_init(); + struct nc_priv *priv = container_of(cdev, + struct nc_priv, cdev); + + if (priv->con) { + net_unregister(priv->con); + priv->con = NULL; + } + + if (!flags) + return 0; + + if (!priv->port) { + pr_err("port not set\n"); + return -EINVAL; + } + + if (!priv->ip) { + pr_err("ip not set\n"); + return -EINVAL; + } + + priv->con = net_udp_new(priv->ip, priv->port, nc_handler, NULL); + if (IS_ERR(priv->con)) { + int ret = PTR_ERR(priv->con); + priv->con = NULL; + return ret; + } + + net_udp_bind(priv->con, priv->port); + + pr_info("netconsole initialized with %s:%d\n", ip_to_string(priv->ip), priv->port); return 0; } @@ -142,6 +154,7 @@ cdev->putc = nc_putc; cdev->getc = nc_getc; cdev->devname = "netconsole"; + cdev->set_active = nc_set_active; g_priv = priv; @@ -157,7 +170,7 @@ priv->port = 6666; dev_add_param_ip(&cdev->class_dev, "ip", NULL, NULL, &priv->ip, NULL); - dev_add_param_int(&cdev->class_dev, "port", nc_port_set, NULL, &priv->port, "%u", NULL); + dev_add_param_int(&cdev->class_dev, "port", NULL, NULL, &priv->port, "%u", NULL); pr_info("registered as %s%d\n", cdev->class_dev.name, cdev->class_dev.id);