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…
80 * struct netconsole_target - Represents a configured netconsole target.
84 * Visible from userspace (read-write).
94 * dev_name (read-write)
95 * local_port (read-write)
96 * remote_port (read-write)
97 * local_ip (read-write)
98 * remote_ip (read-write)
99 * local_mac (read-only)
100 * remote_mac (read-write)
133 * never go away, so make these a no-op for them.
137 if (config_item_name(&nt->item)) in netconsole_target_get()
138 config_item_get(&nt->item); in netconsole_target_get()
143 if (config_item_name(&nt->item)) in netconsole_target_put()
144 config_item_put(&nt->item); in netconsole_target_put()
177 * Note that these targets get their config_item fields zeroed-out.
188 nt->extended = true; in alloc_and_init()
190 nt->release = true; in alloc_and_init()
192 nt->np.name = "netconsole"; in alloc_and_init()
193 strscpy(nt->np.dev_name, "eth0", IFNAMSIZ); in alloc_and_init()
194 nt->np.local_port = 6665; in alloc_and_init()
195 nt->np.remote_port = 6666; in alloc_and_init()
196 eth_broadcast_addr(nt->np.remote_mac); in alloc_and_init()
235 return sysfs_emit(buf, "%d\n", to_target(item)->enabled); in enabled_show()
240 return sysfs_emit(buf, "%d\n", to_target(item)->extended); in extended_show()
245 return sysfs_emit(buf, "%d\n", to_target(item)->release); in release_show()
250 return sysfs_emit(buf, "%s\n", to_target(item)->np.dev_name); in dev_name_show()
255 return sysfs_emit(buf, "%d\n", to_target(item)->np.local_port); in local_port_show()
260 return sysfs_emit(buf, "%d\n", to_target(item)->np.remote_port); in remote_port_show()
267 if (nt->np.ipv6) in local_ip_show()
268 return sysfs_emit(buf, "%pI6c\n", &nt->np.local_ip.in6); in local_ip_show()
270 return sysfs_emit(buf, "%pI4\n", &nt->np.local_ip); in local_ip_show()
277 if (nt->np.ipv6) in remote_ip_show()
278 return sysfs_emit(buf, "%pI6c\n", &nt->np.remote_ip.in6); in remote_ip_show()
280 return sysfs_emit(buf, "%pI4\n", &nt->np.remote_ip); in remote_ip_show()
285 struct net_device *dev = to_target(item)->np.dev; in local_mac_show()
288 return sysfs_emit(buf, "%pM\n", dev ? dev->dev_addr : bcast); in local_mac_show()
293 return sysfs_emit(buf, "%pM\n", to_target(item)->np.remote_mac); in remote_mac_show()
297 * This one is special -- targets created through the configfs interface
304 const char *buf, size_t count) in enabled_store() argument
316 err = -EINVAL; in enabled_store()
317 if ((bool)enabled == nt->enabled) { in enabled_store()
319 nt->enabled ? "started" : "stopped"); in enabled_store()
324 if (nt->release && !nt->extended) { in enabled_store()
329 if (nt->extended && !console_is_registered(&netconsole_ext)) in enabled_store()
333 * Skip netpoll_parse_options() -- all the attributes are in enabled_store()
336 netpoll_print_options(&nt->np); in enabled_store()
338 err = netpoll_setup(&nt->np); in enabled_store()
346 * nt->np.dev == NULL and nt->enabled == true in enabled_store()
349 nt->enabled = false; in enabled_store()
351 netpoll_cleanup(&nt->np); in enabled_store()
354 nt->enabled = enabled; in enabled_store()
357 return strnlen(buf, count); in enabled_store()
364 size_t count) in release_store() argument
371 if (nt->enabled) { in release_store()
373 config_item_name(&nt->item)); in release_store()
374 err = -EINVAL; in release_store()
382 nt->release = release; in release_store()
385 return strnlen(buf, count); in release_store()
392 size_t count) in extended_store() argument
399 if (nt->enabled) { in extended_store()
401 config_item_name(&nt->item)); in extended_store()
402 err = -EINVAL; in extended_store()
410 nt->extended = extended; in extended_store()
413 return strnlen(buf, count); in extended_store()
420 size_t count) in dev_name_store() argument
426 if (nt->enabled) { in dev_name_store()
428 config_item_name(&nt->item)); in dev_name_store()
430 return -EINVAL; in dev_name_store()
433 strscpy(nt->np.dev_name, buf, IFNAMSIZ); in dev_name_store()
436 len = strnlen(nt->np.dev_name, IFNAMSIZ); in dev_name_store()
437 if (nt->np.dev_name[len - 1] == '\n') in dev_name_store()
438 nt->np.dev_name[len - 1] = '\0'; in dev_name_store()
441 return strnlen(buf, count); in dev_name_store()
445 size_t count) in local_port_store() argument
448 int rv = -EINVAL; in local_port_store()
451 if (nt->enabled) { in local_port_store()
453 config_item_name(&nt->item)); in local_port_store()
457 rv = kstrtou16(buf, 10, &nt->np.local_port); in local_port_store()
461 return strnlen(buf, count); in local_port_store()
468 const char *buf, size_t count) in remote_port_store() argument
471 int rv = -EINVAL; in remote_port_store()
474 if (nt->enabled) { in remote_port_store()
476 config_item_name(&nt->item)); in remote_port_store()
480 rv = kstrtou16(buf, 10, &nt->np.remote_port); in remote_port_store()
484 return strnlen(buf, count); in remote_port_store()
491 size_t count) in local_ip_store() argument
496 if (nt->enabled) { in local_ip_store()
498 config_item_name(&nt->item)); in local_ip_store()
502 if (strnchr(buf, count, ':')) { in local_ip_store()
504 if (in6_pton(buf, count, nt->np.local_ip.in6.s6_addr, -1, &end) > 0) { in local_ip_store()
509 nt->np.ipv6 = true; in local_ip_store()
513 if (!nt->np.ipv6) { in local_ip_store()
514 nt->np.local_ip.ip = in_aton(buf); in local_ip_store()
520 return strnlen(buf, count); in local_ip_store()
523 return -EINVAL; in local_ip_store()
527 size_t count) in remote_ip_store() argument
532 if (nt->enabled) { in remote_ip_store()
534 config_item_name(&nt->item)); in remote_ip_store()
538 if (strnchr(buf, count, ':')) { in remote_ip_store()
540 if (in6_pton(buf, count, nt->np.remote_ip.in6.s6_addr, -1, &end) > 0) { in remote_ip_store()
545 nt->np.ipv6 = true; in remote_ip_store()
549 if (!nt->np.ipv6) { in remote_ip_store()
550 nt->np.remote_ip.ip = in_aton(buf); in remote_ip_store()
556 return strnlen(buf, count); in remote_ip_store()
559 return -EINVAL; in remote_ip_store()
563 size_t count) in remote_mac_store() argument
569 if (nt->enabled) { in remote_mac_store()
571 config_item_name(&nt->item)); in remote_mac_store()
577 if (buf[3 * ETH_ALEN - 1] && buf[3 * ETH_ALEN - 1] != '\n') in remote_mac_store()
579 memcpy(nt->np.remote_mac, remote_mac, ETH_ALEN); in remote_mac_store()
582 return strnlen(buf, count); in remote_mac_store()
585 return -EINVAL; in remote_mac_store()
639 if (!strcmp(nt->item.ci_name, name)) { in find_cmdline_target()
667 return &nt->item; in make_netconsole_target()
672 return ERR_PTR(-ENOMEM); in make_netconsole_target()
675 config_item_init_type_name(&nt->item, name, &netconsole_target_type); in make_netconsole_target()
679 list_add(&nt->list, &target_list); in make_netconsole_target()
682 return &nt->item; in make_netconsole_target()
692 list_del(&nt->list); in drop_netconsole_target()
699 if (nt->enabled) in drop_netconsole_target()
700 netpoll_cleanup(&nt->np); in drop_netconsole_target()
702 config_item_put(&nt->item); in drop_netconsole_target()
732 config_item_init_type_name(&nt->item, target_name, in populate_configfs_item()
755 if (nt->np.dev == dev) { in netconsole_netdev_event()
758 strscpy(nt->np.dev_name, dev->name, IFNAMSIZ); in netconsole_netdev_event()
768 __netpoll_cleanup(&nt->np); in netconsole_netdev_event()
771 netdev_put(nt->np.dev, &nt->np.dev_tracker); in netconsole_netdev_event()
772 nt->np.dev = NULL; in netconsole_netdev_event()
773 nt->enabled = false; in netconsole_netdev_event()
796 dev->name, msg); in netconsole_netdev_event()
808 * send_ext_msg_udp - send extended log message to target
828 if (nt->release) { in send_ext_msg_udp()
829 release = init_utsname()->release; in send_ext_msg_udp()
835 if (nt->release) { in send_ext_msg_udp()
840 netpoll_send_udp(&nt->np, msg_ready, msg_len); in send_ext_msg_udp()
850 header_len = body - header; in send_ext_msg_udp()
851 body_len = msg_len - header_len - 1; in send_ext_msg_udp()
856 * "ncfrag=<byte-offset>/<total-bytes>" in send_ext_msg_udp()
858 if (nt->release) in send_ext_msg_udp()
868 sizeof(buf) - this_header, in send_ext_msg_udp()
871 this_chunk = min(body_len - offset, in send_ext_msg_udp()
872 MAX_PRINT_CHUNK - this_header); in send_ext_msg_udp()
878 netpoll_send_udp(&nt->np, buf, this_header + this_chunk); in send_ext_msg_udp()
895 if (nt->extended && nt->enabled && netif_running(nt->np.dev)) in write_ext_msg()
915 if (!nt->extended && nt->enabled && netif_running(nt->np.dev)) { in write_msg()
917 * We nest this inside the for-each-target loop above in write_msg()
920 * of unnecessarily keeping all targets in lock-step. in write_msg()
925 netpoll_send_udp(&nt->np, tmp, frag); in write_msg()
927 left -= frag; in write_msg()
943 err = -ENOMEM; in alloc_param_target()
948 nt->extended = true; in alloc_param_target()
953 if (!nt->extended) { in alloc_param_target()
955 err = -EINVAL; in alloc_param_target()
958 nt->release = true; in alloc_param_target()
963 err = netpoll_parse_options(&nt->np, target_config); in alloc_param_target()
967 err = netpoll_setup(&nt->np); in alloc_param_target()
972 nt->enabled = true; in alloc_param_target()
984 netpoll_cleanup(&nt->np); in free_param_target()
1004 unsigned int count = 0; in init_netconsole() local
1012 nt = alloc_param_target(target_config, count); in init_netconsole()
1018 if (nt->extended) { in init_netconsole()
1026 list_add(&nt->list, &target_list); in init_netconsole()
1028 count++; in init_netconsole()
1059 list_del(&nt->list); in init_netconsole()
1077 * Targets created via configfs pin references on our module in cleanup_netconsole()
1085 list_del(&nt->list); in cleanup_netconsole()
1092 * initialized after network device driver if built-in.