Lines Matching +full:mpm +full:- +full:pin +full:- +full:count
1 // SPDX-License-Identifier: GPL-2.0-or-later
7 * This file contains the implementation of an IRQ-safe, crash-safe
13 * 2001-09-17 started by Ingo Molnar.
14 * 2003-08-11 2.6 port by Matt Mackall
17 * works non-modular
18 * 2003-09-07 rewritten with netpoll api
41 MODULE_AUTHOR("Maintainer: Matt Mackall <mpm@selenic.com>");
50 MODULE_PARM_DESC(netconsole, " netconsole=[src-port]@[src-ip]/[dev],[tgt-port]@<tgt-ip>/[tgt-macadd…
78 * struct netconsole_target - Represents a configured netconsole target.
82 * Visible from userspace (read-write).
92 * dev_name (read-write)
93 * local_port (read-write)
94 * remote_port (read-write)
95 * local_ip (read-write)
96 * remote_ip (read-write)
97 * local_mac (read-only)
98 * remote_mac (read-write)
131 * never go away, so make these a no-op for them.
135 if (config_item_name(&nt->item)) in netconsole_target_get()
136 config_item_get(&nt->item); in netconsole_target_get()
141 if (config_item_name(&nt->item)) in netconsole_target_put()
142 config_item_put(&nt->item); in netconsole_target_put()
171 * Note that these targets get their config_item fields zeroed-out.
182 nt->extended = true; in alloc_and_init()
184 nt->release = true; in alloc_and_init()
186 nt->np.name = "netconsole"; in alloc_and_init()
187 strscpy(nt->np.dev_name, "eth0", IFNAMSIZ); in alloc_and_init()
188 nt->np.local_port = 6665; in alloc_and_init()
189 nt->np.remote_port = 6666; in alloc_and_init()
190 eth_broadcast_addr(nt->np.remote_mac); in alloc_and_init()
203 err = -ENOMEM; in alloc_param_target()
208 nt->extended = true; in alloc_param_target()
213 if (!nt->extended) { in alloc_param_target()
215 err = -EINVAL; in alloc_param_target()
218 nt->release = true; in alloc_param_target()
223 err = netpoll_parse_options(&nt->np, target_config); in alloc_param_target()
227 err = netpoll_setup(&nt->np); in alloc_param_target()
231 nt->enabled = true; in alloc_param_target()
243 netpoll_cleanup(&nt->np); in free_param_target()
281 return sysfs_emit(buf, "%d\n", to_target(item)->enabled); in enabled_show()
286 return sysfs_emit(buf, "%d\n", to_target(item)->extended); in extended_show()
291 return sysfs_emit(buf, "%d\n", to_target(item)->release); in release_show()
296 return sysfs_emit(buf, "%s\n", to_target(item)->np.dev_name); in dev_name_show()
301 return sysfs_emit(buf, "%d\n", to_target(item)->np.local_port); in local_port_show()
306 return sysfs_emit(buf, "%d\n", to_target(item)->np.remote_port); in remote_port_show()
313 if (nt->np.ipv6) in local_ip_show()
314 return sysfs_emit(buf, "%pI6c\n", &nt->np.local_ip.in6); in local_ip_show()
316 return sysfs_emit(buf, "%pI4\n", &nt->np.local_ip); in local_ip_show()
323 if (nt->np.ipv6) in remote_ip_show()
324 return sysfs_emit(buf, "%pI6c\n", &nt->np.remote_ip.in6); in remote_ip_show()
326 return sysfs_emit(buf, "%pI4\n", &nt->np.remote_ip); in remote_ip_show()
331 struct net_device *dev = to_target(item)->np.dev; in local_mac_show()
334 return sysfs_emit(buf, "%pM\n", dev ? dev->dev_addr : bcast); in local_mac_show()
339 return sysfs_emit(buf, "%pM\n", to_target(item)->np.remote_mac); in remote_mac_show()
343 * This one is special -- targets created through the configfs interface
350 const char *buf, size_t count) in enabled_store() argument
362 err = -EINVAL; in enabled_store()
363 if ((bool)enabled == nt->enabled) { in enabled_store()
365 nt->enabled ? "started" : "stopped"); in enabled_store()
370 if (nt->release && !nt->extended) { in enabled_store()
375 if (nt->extended && !console_is_registered(&netconsole_ext)) in enabled_store()
379 * Skip netpoll_parse_options() -- all the attributes are in enabled_store()
382 netpoll_print_options(&nt->np); in enabled_store()
384 err = netpoll_setup(&nt->np); in enabled_store()
392 * nt->np.dev == NULL and nt->enabled == true in enabled_store()
395 nt->enabled = false; in enabled_store()
397 netpoll_cleanup(&nt->np); in enabled_store()
400 nt->enabled = enabled; in enabled_store()
403 return strnlen(buf, count); in enabled_store()
410 size_t count) in release_store() argument
417 if (nt->enabled) { in release_store()
419 config_item_name(&nt->item)); in release_store()
420 err = -EINVAL; in release_store()
428 nt->release = release; in release_store()
431 return strnlen(buf, count); in release_store()
438 size_t count) in extended_store() argument
445 if (nt->enabled) { in extended_store()
447 config_item_name(&nt->item)); in extended_store()
448 err = -EINVAL; in extended_store()
456 nt->extended = extended; in extended_store()
459 return strnlen(buf, count); in extended_store()
466 size_t count) in dev_name_store() argument
472 if (nt->enabled) { in dev_name_store()
474 config_item_name(&nt->item)); in dev_name_store()
476 return -EINVAL; in dev_name_store()
479 strscpy(nt->np.dev_name, buf, IFNAMSIZ); in dev_name_store()
482 len = strnlen(nt->np.dev_name, IFNAMSIZ); in dev_name_store()
483 if (nt->np.dev_name[len - 1] == '\n') in dev_name_store()
484 nt->np.dev_name[len - 1] = '\0'; in dev_name_store()
487 return strnlen(buf, count); in dev_name_store()
491 size_t count) in local_port_store() argument
494 int rv = -EINVAL; in local_port_store()
497 if (nt->enabled) { in local_port_store()
499 config_item_name(&nt->item)); in local_port_store()
503 rv = kstrtou16(buf, 10, &nt->np.local_port); in local_port_store()
507 return strnlen(buf, count); in local_port_store()
514 const char *buf, size_t count) in remote_port_store() argument
517 int rv = -EINVAL; in remote_port_store()
520 if (nt->enabled) { in remote_port_store()
522 config_item_name(&nt->item)); in remote_port_store()
526 rv = kstrtou16(buf, 10, &nt->np.remote_port); in remote_port_store()
530 return strnlen(buf, count); in remote_port_store()
537 size_t count) in local_ip_store() argument
542 if (nt->enabled) { in local_ip_store()
544 config_item_name(&nt->item)); in local_ip_store()
548 if (strnchr(buf, count, ':')) { in local_ip_store()
550 if (in6_pton(buf, count, nt->np.local_ip.in6.s6_addr, -1, &end) > 0) { in local_ip_store()
555 nt->np.ipv6 = true; in local_ip_store()
559 if (!nt->np.ipv6) { in local_ip_store()
560 nt->np.local_ip.ip = in_aton(buf); in local_ip_store()
566 return strnlen(buf, count); in local_ip_store()
569 return -EINVAL; in local_ip_store()
573 size_t count) in remote_ip_store() argument
578 if (nt->enabled) { in remote_ip_store()
580 config_item_name(&nt->item)); in remote_ip_store()
584 if (strnchr(buf, count, ':')) { in remote_ip_store()
586 if (in6_pton(buf, count, nt->np.remote_ip.in6.s6_addr, -1, &end) > 0) { in remote_ip_store()
591 nt->np.ipv6 = true; in remote_ip_store()
595 if (!nt->np.ipv6) { in remote_ip_store()
596 nt->np.remote_ip.ip = in_aton(buf); in remote_ip_store()
602 return strnlen(buf, count); in remote_ip_store()
605 return -EINVAL; in remote_ip_store()
609 size_t count) in remote_mac_store() argument
615 if (nt->enabled) { in remote_mac_store()
617 config_item_name(&nt->item)); in remote_mac_store()
623 if (buf[3 * ETH_ALEN - 1] && buf[3 * ETH_ALEN - 1] != '\n') in remote_mac_store()
625 memcpy(nt->np.remote_mac, remote_mac, ETH_ALEN); in remote_mac_store()
628 return strnlen(buf, count); in remote_mac_store()
631 return -EINVAL; in remote_mac_store()
690 return ERR_PTR(-ENOMEM); in make_netconsole_target()
693 config_item_init_type_name(&nt->item, name, &netconsole_target_type); in make_netconsole_target()
697 list_add(&nt->list, &target_list); in make_netconsole_target()
700 return &nt->item; in make_netconsole_target()
710 list_del(&nt->list); in drop_netconsole_target()
717 if (nt->enabled) in drop_netconsole_target()
718 netpoll_cleanup(&nt->np); in drop_netconsole_target()
720 config_item_put(&nt->item); in drop_netconsole_target()
762 if (nt->np.dev == dev) { in netconsole_netdev_event()
765 strscpy(nt->np.dev_name, dev->name, IFNAMSIZ); in netconsole_netdev_event()
775 __netpoll_cleanup(&nt->np); in netconsole_netdev_event()
778 netdev_put(nt->np.dev, &nt->np.dev_tracker); in netconsole_netdev_event()
779 nt->np.dev = NULL; in netconsole_netdev_event()
780 nt->enabled = false; in netconsole_netdev_event()
803 dev->name, msg); in netconsole_netdev_event()
815 * send_ext_msg_udp - send extended log message to target
835 if (nt->release) { in send_ext_msg_udp()
836 release = init_utsname()->release; in send_ext_msg_udp()
842 if (nt->release) { in send_ext_msg_udp()
847 netpoll_send_udp(&nt->np, msg_ready, msg_len); in send_ext_msg_udp()
857 header_len = body - header; in send_ext_msg_udp()
858 body_len = msg_len - header_len - 1; in send_ext_msg_udp()
863 * "ncfrag=<byte-offset>/<total-bytes>" in send_ext_msg_udp()
865 if (nt->release) in send_ext_msg_udp()
875 sizeof(buf) - this_header, in send_ext_msg_udp()
878 this_chunk = min(body_len - offset, in send_ext_msg_udp()
879 MAX_PRINT_CHUNK - this_header); in send_ext_msg_udp()
885 netpoll_send_udp(&nt->np, buf, this_header + this_chunk); in send_ext_msg_udp()
902 if (nt->extended && nt->enabled && netif_running(nt->np.dev)) in write_ext_msg()
922 if (!nt->extended && nt->enabled && netif_running(nt->np.dev)) { in write_msg()
924 * We nest this inside the for-each-target loop above in write_msg()
927 * of unnecessarily keeping all targets in lock-step. in write_msg()
932 netpoll_send_udp(&nt->np, tmp, frag); in write_msg()
934 left -= frag; in write_msg()
970 if (nt->extended) { in init_netconsole()
978 list_add(&nt->list, &target_list); in init_netconsole()
1010 list_del(&nt->list); in init_netconsole()
1028 * Targets created via configfs pin references on our module in cleanup_netconsole()
1036 list_del(&nt->list); in cleanup_netconsole()
1043 * initialized after network device driver if built-in.