The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/net/debugnet.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
    3  *
    4  * Copyright (c) 2019 Isilon Systems, LLC.
    5  * Copyright (c) 2005-2014 Sandvine Incorporated
    6  * Copyright (c) 2000 Darrell Anderson <anderson@cs.duke.edu>
    7  * All rights reserved.
    8  *
    9  * Redistribution and use in source and binary forms, with or without
   10  * modification, are permitted provided that the following conditions
   11  * are met:
   12  * 1. Redistributions of source code must retain the above copyright
   13  *    notice, this list of conditions and the following disclaimer.
   14  * 2. Redistributions in binary form must reproduce the above copyright
   15  *    notice, this list of conditions and the following disclaimer in the
   16  *    documentation and/or other materials provided with the distribution.
   17  *
   18  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   19  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   21  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   22  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   23  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   24  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   25  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   26  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   27  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   28  * SUCH DAMAGE.
   29  *
   30  * $FreeBSD$
   31  */
   32 
   33 /*
   34  * Debugnet provides a reliable, bidirectional, UDP-encapsulated datagram
   35  * transport while a machine is in a debug state.  (N-1 CPUs stopped,
   36  * interrupts disabled, may or may not be in a panic(9) state.)  Only one
   37  * stream may be active at a time.  A dedicated server must be running to
   38  * accept connections.
   39  */
   40 
   41 #pragma once
   42 
   43 #include <sys/types.h>
   44 #include <netinet/in.h>
   45 
   46 /*
   47  * Debugnet protocol details.
   48  */
   49 #define DEBUGNET_HERALD         1       /* Connection handshake. */
   50 #define DEBUGNET_FINISHED       2       /* Close the connection. */
   51 #define DEBUGNET_DATA           3       /* Contains data. */
   52 
   53 struct debugnet_msg_hdr {
   54         uint32_t        mh_type;        /* Debugnet message type. */
   55         uint32_t        mh_seqno;       /* Match acks with msgs. */
   56         uint64_t        mh_offset;      /* Offset in fragment. */
   57         uint32_t        mh_len;         /* Attached data (bytes). */
   58         uint32_t        mh_aux2;        /* Consumer-specific. */
   59 } __packed;
   60 
   61 struct debugnet_ack {
   62         uint32_t        da_seqno;       /* Match acks with msgs. */
   63 } __packed;
   64 
   65 #define DEBUGNET_MAX_IN_FLIGHT  64
   66 
   67 #ifdef _KERNEL
   68 /*
   69  * Hook API for network drivers.
   70  */
   71 enum debugnet_ev {
   72         DEBUGNET_START,
   73         DEBUGNET_END,
   74 };
   75 
   76 struct ifnet;
   77 struct mbuf;
   78 typedef void debugnet_init_t(struct ifnet *, int *nrxr, int *ncl, int *clsize);
   79 typedef void debugnet_event_t(struct ifnet *, enum debugnet_ev);
   80 typedef int debugnet_transmit_t(struct ifnet *, struct mbuf *);
   81 typedef int debugnet_poll_t(struct ifnet *, int);
   82 
   83 struct debugnet_methods {
   84         debugnet_init_t         *dn_init;
   85         debugnet_event_t        *dn_event;
   86         debugnet_transmit_t     *dn_transmit;
   87         debugnet_poll_t         *dn_poll;
   88 };
   89 
   90 #define DEBUGNET_SUPPORTED_NIC(ifp)                             \
   91         ((ifp)->if_debugnet_methods != NULL && (ifp)->if_type == IFT_ETHER)
   92 
   93 struct debugnet_pcb; /* opaque */
   94 
   95 /*
   96  * Debugnet consumer API.
   97  */
   98 struct debugnet_conn_params {
   99         struct ifnet    *dc_ifp;
  100         in_addr_t       dc_client;
  101         in_addr_t       dc_server;
  102         in_addr_t       dc_gateway;
  103 
  104         uint16_t        dc_herald_port;
  105         uint16_t        dc_client_port;
  106 
  107         const void      *dc_herald_data;
  108         uint32_t        dc_herald_datalen;
  109 
  110         /*
  111          * Consistent with debugnet_send(), aux parameters to debugnet
  112          * functions are provided host-endian (but converted to
  113          * network endian on the wire).
  114          */
  115         uint32_t        dc_herald_aux2;
  116         uint64_t        dc_herald_offset;
  117 
  118         /*
  119          * If NULL, debugnet is a unidirectional channel from panic machine to
  120          * remote server (like netdump).
  121          *
  122          * If handler is non-NULL, packets received on the client port that are
  123          * not just tx acks are forwarded to the provided handler.
  124          *
  125          * The mbuf chain will have all non-debugnet framing headers removed
  126          * (ethernet, inet, udp).  It will start with a debugnet_msg_hdr, of
  127          * which the header is guaranteed to be contiguous.  If m_pullup is
  128          * used, the supplied in-out mbuf pointer should be updated
  129          * appropriately.
  130          *
  131          * If the handler frees the mbuf chain, it should set the mbuf pointer
  132          * to NULL.  Otherwise, the debugnet input framework will free the
  133          * chain.
  134          *
  135          * The handler should ACK receieved packets with debugnet_ack_output.
  136          */
  137         void            (*dc_rx_handler)(struct debugnet_pcb *, struct mbuf **);
  138 };
  139 
  140 /*
  141  * Open a stream to the specified server's herald port.
  142  *
  143  * If all goes well, the server will send ACK from a different port to our ack
  144  * port.  This allows servers to somewhat gracefully handle multiple debugnet
  145  * clients.  (Clients are limited to single connections.)
  146  *
  147  * Returns zero on success, or errno.
  148  */
  149 int debugnet_connect(const struct debugnet_conn_params *,
  150     struct debugnet_pcb **pcb_out);
  151 
  152 /*
  153  * Free a debugnet stream that was previously successfully opened.
  154  *
  155  * No attempt is made to cleanly terminate communication with the remote
  156  * server.  Consumers should first send an empty DEBUGNET_FINISHED message, or
  157  * otherwise let the remote know they are signing off.
  158  */
  159 void debugnet_free(struct debugnet_pcb *);
  160 
  161 /*
  162  * Send a message, with common debugnet_msg_hdr header, to the connected remote
  163  * server.
  164  *
  165  * - mhtype translates directly to mh_type (e.g., DEBUGNET_DATA, or some other
  166  *   protocol-specific type).
  167  * - Data and datalen describe the attached data; datalen may be zero.
  168  * - If auxdata is NULL, mh_offset's initial value and mh_aux2 will be zero.
  169  *   Otherwise, mh_offset's initial value will be auxdata->dp_offset_start and
  170  *   mh_aux2 will have the value of auxdata->dp_aux2.
  171  *
  172  * Returns zero on success, or an errno on failure.
  173  */
  174 struct debugnet_proto_aux {
  175         uint64_t dp_offset_start;
  176         uint32_t dp_aux2;
  177 };
  178 int debugnet_send(struct debugnet_pcb *, uint32_t mhtype, const void *data,
  179     uint32_t datalen, const struct debugnet_proto_aux *auxdata);
  180 
  181 /*
  182  * A simple wrapper around the above when no data or auxdata is needed.
  183  */
  184 static inline int
  185 debugnet_sendempty(struct debugnet_pcb *pcb, uint32_t mhtype)
  186 {
  187         return (debugnet_send(pcb, mhtype, NULL, 0, NULL));
  188 }
  189 
  190 /*
  191  * Full-duplex RX should ACK received messages.
  192  */
  193 int debugnet_ack_output(struct debugnet_pcb *, uint32_t seqno /*net endian*/);
  194 
  195 /*
  196  * Check and/or wait for further packets.
  197  */
  198 void debugnet_network_poll(struct debugnet_pcb *);
  199 
  200 /*
  201  * PCB accessors.
  202  */
  203 
  204 /*
  205  * Get the 48-bit MAC address of the discovered next hop (gateway, or
  206  * destination server if it is on the same segment.
  207  */
  208 const unsigned char *debugnet_get_gw_mac(const struct debugnet_pcb *);
  209 
  210 /*
  211  * Callbacks from core mbuf code.
  212  */
  213 void debugnet_any_ifnet_update(struct ifnet *);
  214 
  215 /*
  216  * DDB parsing helper for common debugnet options.
  217  *
  218  * -s <server> [-g <gateway -c <localip> -i <interface>]
  219  *
  220  * Order is not significant.  Interface is an online interface that supports
  221  * debugnet and can route to the debugnet server.  The other parameters are all
  222  * IP addresses.  Only the server parameter is required.  The others are
  223  * inferred automatically from the routing table, if not explicitly provided.
  224  *
  225  * Provides basic '-h' using provided 'cmd' string.
  226  *
  227  * Returns zero on success, or errno.
  228  */
  229 struct debugnet_ddb_config {
  230         struct ifnet    *dd_ifp;        /* not ref'd */
  231         in_addr_t       dd_client;
  232         in_addr_t       dd_server;
  233         in_addr_t       dd_gateway;
  234         bool            dd_has_client : 1;
  235         bool            dd_has_gateway : 1;
  236 };
  237 int debugnet_parse_ddb_cmd(const char *cmd,
  238     struct debugnet_ddb_config *result);
  239 
  240 /* Expose sysctl variables for netdump(4) to alias. */
  241 extern int debugnet_npolls;
  242 extern int debugnet_nretries;
  243 extern int debugnet_arp_nretries;
  244 
  245 /*
  246  * Conditionally-defined macros for device drivers so we can avoid ifdef
  247  * wrappers in every single implementation.
  248  */
  249 #ifdef DEBUGNET
  250 #define DEBUGNET_DEFINE(driver)                                 \
  251         static debugnet_init_t driver##_debugnet_init;          \
  252         static debugnet_event_t driver##_debugnet_event;        \
  253         static debugnet_transmit_t driver##_debugnet_transmit;  \
  254         static debugnet_poll_t driver##_debugnet_poll;          \
  255                                                                 \
  256         static struct debugnet_methods driver##_debugnet_methods = { \
  257                 .dn_init = driver##_debugnet_init,              \
  258                 .dn_event = driver##_debugnet_event,            \
  259                 .dn_transmit = driver##_debugnet_transmit,      \
  260                 .dn_poll = driver##_debugnet_poll,              \
  261         }
  262 
  263 #define DEBUGNET_NOTIFY_MTU(ifp)        debugnet_any_ifnet_update(ifp)
  264 
  265 #define DEBUGNET_SET(ifp, driver)                               \
  266         if_setdebugnet_methods((ifp), &driver##_debugnet_methods)
  267 
  268 #else /* !DEBUGNET || !INET */
  269 
  270 #define DEBUGNET_DEFINE(driver)
  271 #define DEBUGNET_NOTIFY_MTU(ifp)
  272 #define DEBUGNET_SET(ifp, driver)
  273 
  274 #endif /* DEBUGNET && INET */
  275 #endif /* _KERNEL */

Cache object: 2a815cef046c64b9d91619124260e02a


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.