#include <linux/idr.h>
#include <linux/if_arp.h>
#include <linux/module.h>
#include <linux/skbuff.h>
#include <linux/tty.h>
#include <linux/workqueue.h>
#include <linux/crc-ccitt.h>
#include <linux/mctp.h>
#include <net/mctp.h>
#include <net/pkt_sched.h>
#define MCTP_SERIAL_MTU …
#define MCTP_SERIAL_FRAME_MTU …
#define MCTP_SERIAL_VERSION …
#define BUFSIZE …
#define BYTE_FRAME …
#define BYTE_ESC …
#define FCS_INIT …
static DEFINE_IDA(mctp_serial_ida);
enum mctp_serial_state { … };
struct mctp_serial { … };
static bool needs_escape(u8 c)
{ … }
static unsigned int next_chunk_len(struct mctp_serial *dev)
{ … }
static ssize_t write_chunk(struct mctp_serial *dev, u8 *buf, size_t len)
{ … }
static void mctp_serial_tx_work(struct work_struct *work)
{ … }
static netdev_tx_t mctp_serial_tx(struct sk_buff *skb, struct net_device *ndev)
{ … }
static void mctp_serial_tty_write_wakeup(struct tty_struct *tty)
{ … }
static void mctp_serial_rx(struct mctp_serial *dev)
{ … }
static void mctp_serial_push_header(struct mctp_serial *dev, u8 c)
{ … }
static void mctp_serial_push_trailer(struct mctp_serial *dev, u8 c)
{ … }
static void mctp_serial_push(struct mctp_serial *dev, u8 c)
{ … }
static void mctp_serial_tty_receive_buf(struct tty_struct *tty, const u8 *c,
const u8 *f, size_t len)
{ … }
static void mctp_serial_uninit(struct net_device *ndev)
{ … }
static const struct net_device_ops mctp_serial_netdev_ops = …;
static void mctp_serial_setup(struct net_device *ndev)
{ … }
static int mctp_serial_open(struct tty_struct *tty)
{ … }
static void mctp_serial_close(struct tty_struct *tty)
{ … }
static struct tty_ldisc_ops mctp_ldisc = …;
static int __init mctp_serial_init(void)
{ … }
static void __exit mctp_serial_exit(void)
{ … }
module_init(…) …;
module_exit(mctp_serial_exit);
MODULE_LICENSE(…) …;
MODULE_AUTHOR(…) …;
MODULE_DESCRIPTION(…) …;
#if IS_ENABLED(CONFIG_MCTP_SERIAL_TEST)
#include <kunit/test.h>
#define MAX_CHUNKS …
struct test_chunk_tx { … };
static void test_next_chunk_len(struct kunit *test)
{ … }
static struct test_chunk_tx chunk_tx_tests[] = …;
KUNIT_ARRAY_PARAM(chunk_tx, chunk_tx_tests, NULL);
static struct kunit_case mctp_serial_test_cases[] = …;
static struct kunit_suite mctp_serial_test_suite = …;
kunit_test_suite(…) …;
#endif