Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  1 /*
  2  *  linux/drivers/net/netconsole.c
  3  *
  4  *  Copyright (C) 2001  Ingo Molnar <mingo@redhat.com>
  5  *
  6  *  This file contains the implementation of an IRQ-safe, crash-safe
  7  *  kernel console implementation that outputs kernel messages to the
  8  *  network.
  9  *
 10  * Modification history:
 11  *
 12  * 2001-09-17    started by Ingo Molnar.
 13  * 2003-08-11    2.6 port by Matt Mackall
 14  *               simplified options
 15  *               generic card hooks
 16  *               works non-modular
 17  * 2003-09-07    rewritten with netpoll api
 18  */
 19 
 20 /****************************************************************
 21  *      This program is free software; you can redistribute it and/or modify
 22  *      it under the terms of the GNU General Public License as published by
 23  *      the Free Software Foundation; either version 2, or (at your option)
 24  *      any later version.
 25  *
 26  *      This program is distributed in the hope that it will be useful,
 27  *      but WITHOUT ANY WARRANTY; without even the implied warranty of
 28  *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 29  *      GNU General Public License for more details.
 30  *
 31  *      You should have received a copy of the GNU General Public License
 32  *      along with this program; if not, write to the Free Software
 33  *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 34  *
 35  ****************************************************************/
 36 
 37 #include <linux/mm.h>
 38 #include <linux/tty.h>
 39 #include <linux/init.h>
 40 #include <linux/module.h>
 41 #include <linux/console.h>
 42 #include <linux/tty_driver.h>
 43 #include <linux/moduleparam.h>
 44 #include <linux/string.h>
 45 #include <linux/sysrq.h>
 46 #include <linux/smp.h>
 47 #include <linux/netpoll.h>
 48 
 49 MODULE_AUTHOR("Maintainer: Matt Mackall <mpm@selenic.com>");
 50 MODULE_DESCRIPTION("Console driver for network interfaces");
 51 MODULE_LICENSE("GPL");
 52 
 53 static char config[256];
 54 module_param_string(netconsole, config, 256, 0);
 55 MODULE_PARM_DESC(netconsole, " netconsole=[src-port]@[src-ip]/[dev],[tgt-port]@<tgt-ip>/[tgt-macaddr]\n");
 56 
 57 static struct netpoll np = {
 58         .name = "netconsole",
 59         .dev_name = "eth0",
 60         .local_port = 6665,
 61         .remote_port = 6666,
 62         .remote_mac = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
 63 };
 64 static int configured = 0;
 65 
 66 #define MAX_PRINT_CHUNK 1000
 67 
 68 static void write_msg(struct console *con, const char *msg, unsigned int len)
 69 {
 70         int frag, left;
 71         unsigned long flags;
 72 
 73         if (!np.dev)
 74                 return;
 75 
 76         local_irq_save(flags);
 77 
 78         for(left = len; left; ) {
 79                 frag = min(left, MAX_PRINT_CHUNK);
 80                 netpoll_send_udp(&np, msg, frag);
 81                 msg += frag;
 82                 left -= frag;
 83         }
 84 
 85         local_irq_restore(flags);
 86 }
 87 
 88 static struct console netconsole = {
 89         .flags = CON_ENABLED | CON_PRINTBUFFER,
 90         .write = write_msg
 91 };
 92 
 93 static int option_setup(char *opt)
 94 {
 95         configured = !netpoll_parse_options(&np, opt);
 96         return 0;
 97 }
 98 
 99 __setup("netconsole=", option_setup);
100 
101 static int init_netconsole(void)
102 {
103         if(strlen(config))
104                 option_setup(config);
105 
106         if(!configured) {
107                 printk("netconsole: not configured, aborting\n");
108                 return -EINVAL;
109         }
110 
111         if(netpoll_setup(&np))
112                 return -EINVAL;
113 
114         register_console(&netconsole);
115         printk(KERN_INFO "netconsole: network logging started\n");
116         return 0;
117 }
118 
119 static void cleanup_netconsole(void)
120 {
121         unregister_console(&netconsole);
122         netpoll_cleanup(&np);
123 }
124 
125 module_init(init_netconsole);
126 module_exit(cleanup_netconsole);
127 
  This page was automatically generated by the LXR engine.