diff options
author | Conrad Meyer <cem@FreeBSD.org> | 2019-10-17 16:23:03 +0000 |
---|---|---|
committer | Conrad Meyer <cem@FreeBSD.org> | 2019-10-17 16:23:03 +0000 |
commit | 7790c8c1996ad89a22b8bd194a230cf23ee67f4b (patch) | |
tree | 78e6de7914d8cdd8021ca4912f6223b1c30c0d32 /sys/net/debugnet_int.h | |
parent | 756368b68b98ad0d95e6dc1754ab09b55e4d567f (diff) | |
download | src-7790c8c1996ad89a22b8bd194a230cf23ee67f4b.tar.gz src-7790c8c1996ad89a22b8bd194a230cf23ee67f4b.zip |
Split out a more generic debugnet(4) from netdump(4)
Debugnet is a simplistic and specialized panic- or debug-time reliable
datagram transport. It can drive a single connection at a time and is
currently unidirectional (debug/panic machine transmit to remote server
only).
It is mostly a verbatim code lift from netdump(4). Netdump(4) remains
the only consumer (until the rest of this patch series lands).
The INET-specific logic has been extracted somewhat more thoroughly than
previously in netdump(4), into debugnet_inet.c. UDP-layer logic and up, as
much as possible as is protocol-independent, remains in debugnet.c. The
separation is not perfect and future improvement is welcome. Supporting
INET6 is a long-term goal.
Much of the diff is "gratuitous" renaming from 'netdump_' or 'nd_' to
'debugnet_' or 'dn_' -- sorry. I thought keeping the netdump name on the
generic module would be more confusing than the refactoring.
The only functional change here is the mbuf allocation / tracking. Instead
of initiating solely on netdump-configured interface(s) at dumpon(8)
configuration time, we watch for any debugnet-enabled NIC for link
activation and query it for mbuf parameters at that time. If they exceed
the existing high-water mark allocation, we re-allocate and track the new
high-water mark. Otherwise, we leave the pre-panic mbuf allocation alone.
In a future patch in this series, this will allow initiating netdump from
panic ddb(4) without pre-panic configuration.
No other functional change intended.
Reviewed by: markj (earlier version)
Some discussion with: emaste, jhb
Objection from: marius
Differential Revision: https://reviews.freebsd.org/D21421
Notes
Notes:
svn path=/head/; revision=353685
Diffstat (limited to 'sys/net/debugnet_int.h')
-rw-r--r-- | sys/net/debugnet_int.h | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/sys/net/debugnet_int.h b/sys/net/debugnet_int.h new file mode 100644 index 000000000000..0dd206cf6761 --- /dev/null +++ b/sys/net/debugnet_int.h @@ -0,0 +1,91 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD + * + * Copyright (c) 2019 Isilon Systems, LLC. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#pragma once + +#ifndef DEBUGNET_INTERNAL +#error "Don't include this" +#endif + +#define DNETDEBUG(f, ...) do { \ + if (debugnet_debug > 0) \ + printf(("%s: " f), __func__, ## __VA_ARGS__); \ +} while (0) +#define DNETDEBUG_IF(i, f, ...) do { \ + if (debugnet_debug > 0) \ + if_printf((i), ("%s: " f), __func__, ## __VA_ARGS__); \ +} while (0) +#define DNETDEBUGV(f, ...) do { \ + if (debugnet_debug > 1) \ + printf(("%s: " f), __func__, ## __VA_ARGS__); \ +} while (0) + +enum dnet_pcb_st { + DN_STATE_INIT = 1, + DN_STATE_HAVE_GW_MAC, + DN_STATE_GOT_HERALD_PORT, +}; + +struct debugnet_pcb { + uint64_t dp_rcvd_acks; + + in_addr_t dp_client; + in_addr_t dp_server; + in_addr_t dp_gateway; + uint32_t dp_seqno; + + struct ether_addr dp_gw_mac; + uint16_t dp_server_port; + + struct ifnet *dp_ifp; + /* Saved driver if_input to restore on close. */ + void (*dp_drv_input)(struct ifnet *, struct mbuf *); + + enum dnet_pcb_st dp_state; + uint16_t dp_client_ack_port; +}; + +/* TODO(CEM): Obviate this assertion by using a BITSET(9) for acks. */ +CTASSERT(sizeof(((struct debugnet_pcb *)0)->dp_rcvd_acks) * NBBY >= + DEBUGNET_MAX_IN_FLIGHT); + +extern unsigned debugnet_debug; +SYSCTL_DECL(_net_debugnet); + +int debugnet_ether_output(struct mbuf *, struct ifnet *, struct ether_addr, + u_short); +void debugnet_handle_udp(struct debugnet_pcb *, struct mbuf **); +void debugnet_network_poll(struct ifnet *); + +#ifdef INET +int debugnet_arp_gw(struct debugnet_pcb *); +void debugnet_handle_arp(struct debugnet_pcb *, struct mbuf **); +void debugnet_handle_ip(struct debugnet_pcb *, struct mbuf **); +int debugnet_ip_output(struct debugnet_pcb *, struct mbuf *); +#endif |