ncrx/ncrx.h (33 lines of code) (raw):

/* * ncrx - extended netconsole receiver library * * Copyright (C) 2016, Facebook, Inc. * All rights reserved. * * This source code is licensed under the license found in the LICENSE file in * the root directory of this source tree. */ #ifndef __NETCONSOLE_NCRX__ #define __NETCONSOLE_NCRX__ #include <inttypes.h> #define NCRX_LINE_MAX 8192 /* max payload len for responses, this is what netconsole uses on tx side */ #define NCRX_PKT_MAX 1000 #include "ncrx-struct.h" /* * ncrx parameters. Specify NULL to use defaults for all. Specify 0 to use * default for individual parameters. All time periods are in millisecs. * * nr_slots * The number of reorder slots. This bounds the maximum memory which * may be consumed by the ncrx instance. Lowering this number * increases the chance of the ordering window passing by a missing * message before it can be obtained leading to missed messages. * * ack_intv * A received message is acked after this period. Transmission side * ack timeout is 10s and this should be shorter than that. * * retx_intv * Retransmission request is sent and repeated every this period. * * retx_stride * A missing message generates retransmission request whenever it gets * pushed back this number of slots by newly arriving message. * * msg_timeout * A missing message expires after this period and the sequence number * will be skipped in the output. * * oos_thr * Among last 32 message, if more than this number of messages are * out-of-order, the message stream is reset. * * oos_intv * A message is considered out-of-sequence only if the last message * received with the sequence number is older than this. * * oos_timeout * If sequence is not reset in this period after reception of an * out-of-order message, the message is output. */ struct ncrx_param { int nr_slots; int ack_intv; int retx_intv; int retx_stride; int msg_timeout; int oos_thr; int oos_intv; int oos_timeout; }; /* default params */ #define NCRX_DFL_NR_SLOTS 8192 #define NCRX_DFL_ACK_INTV 0 /* disable ack logic by default */ #define NCRX_DFL_RETX_INTV 1000 #define NCRX_DFL_RETX_STRIDE 256 #define NCRX_DFL_MSG_TIMEOUT 30000 #define NCRX_DFL_OOS_THR (32 * 3 / 5) /* 19 */ #define NCRX_DFL_OOS_INTV 5000 #define NCRX_DFL_OOS_TIMEOUT NCRX_DFL_MSG_TIMEOUT /* * A ncrx instance is created by ncrx_create() and destroyed by * ncrx_destroy(). All accesses to a given instance must be serialized; * however, a process may create any number of instances and use them * concurrently. */ struct ncrx; struct ncrx *ncrx_create(const struct ncrx_param *param); void ncrx_destroy(struct ncrx *ncrx); /* * A ncrx instance doesn't do any IO or blocking. It's just a state * machine that the user can feed data into and get the results out of. * * ncrx_process() * Process @payload of a packet. @now_mono is the current time in msecs. * The origin doesn't matter as long as it's monotonously increasing. * @payload may be NULL. See ncrx_invoke_process_at(). * * @now_real is an optional timestamp which will be stored at rx_at_real * in the resulting ncrx_msg struct. The library does not use this value * at all, so it can be zero. * * Returns 0 on success. 1 on failure with errno set. EINVAL * indicates that @payload is not a valid extended netconsole message. * * ncrx_response() * The response to send to log source. If the user calls this * function after each ncrx_process() invocation and sends back the * output, re- and emergency transmissions are activated increasing * the reliability especially if the network is flaky. If not, ncrx * will passively reorder and assemble messages. * * Returns pointer to '\0' terminated response string or NULL if * there's nothing to send back. If @lenp is not NULL, *@lenp is set * to the length of the response string. * * ncrx_next_msg() * Fetches the next completed message. Call repeatedly until NULL is * returned after each ncrx_process() invocation. Each message should * be free()'d by the user after consumption. * * ncrx_invoke_process_at() * Message processing is timing dependent and ncrx often needs to take * actions after a certain time period even when there hasn't been any * new packets. This function indicates when the caller should invoke * ncrx_process() at the latest. * * The returned time is relative to @now previously provided to * ncrx_process(). e.g. if ncrx_process() needs to be invoked after 4 * seconds since the last invocation where @now was 60000, this * function will return 64000. Returns UINT64_MAX if there's no * pending timing dependent operation. * * See tools/ncrx/ncrx.c for a simple example. */ int ncrx_process(const char *payload, uint64_t now_mono, uint64_t now_real, struct ncrx *ncrx); const char *ncrx_response(struct ncrx *ncrx, int *lenp); struct ncrx_msg *ncrx_next_msg(struct ncrx *ncrx); uint64_t ncrx_invoke_process_at(struct ncrx *ncrx); #endif /* __NETCONSOLE_NCRX__ */