#include <linux/module.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/spinlock.h>
#include <linux/hrtimer.h>
#include <linux/wait.h>
#include <linux/uio.h>
#include <linux/net.h>
#include <linux/netdevice.h>
#include <linux/socket.h>
#include <linux/if_arp.h>
#include <linux/skbuff.h>
#include <linux/can.h>
#include <linux/can/core.h>
#include <linux/can/skb.h>
#include <linux/can/isotp.h>
#include <linux/slab.h>
#include <net/sock.h>
#include <net/net_namespace.h>
MODULE_DESCRIPTION(…) …;
MODULE_LICENSE(…) …;
MODULE_AUTHOR(…) …;
MODULE_ALIAS(…) …;
#define ISOTP_MIN_NAMELEN …
#define SINGLE_MASK(id) …
#define DEFAULT_MAX_PDU_SIZE …
#define MAX_12BIT_PDU_SIZE …
#define MAX_PDU_SIZE …
static unsigned int max_pdu_size __read_mostly = …;
module_param(max_pdu_size, uint, 0444);
MODULE_PARM_DESC(…) …;
#define N_PCI_SF …
#define N_PCI_FF …
#define N_PCI_CF …
#define N_PCI_FC …
#define N_PCI_SZ …
#define SF_PCI_SZ4 …
#define SF_PCI_SZ8 …
#define FF_PCI_SZ12 …
#define FF_PCI_SZ32 …
#define FC_CONTENT_SZ …
#define ISOTP_CHECK_PADDING …
#define ISOTP_ALL_BC_FLAGS …
#define ISOTP_FC_CTS …
#define ISOTP_FC_WT …
#define ISOTP_FC_OVFLW …
#define ISOTP_FC_TIMEOUT …
#define ISOTP_ECHO_TIMEOUT …
enum { … };
struct tpcon { … };
struct isotp_sock { … };
static LIST_HEAD(isotp_notifier_list);
static DEFINE_SPINLOCK(isotp_notifier_lock);
static struct isotp_sock *isotp_busy_notifier;
static inline struct isotp_sock *isotp_sk(const struct sock *sk)
{ … }
static u32 isotp_bc_flags(struct isotp_sock *so)
{ … }
static bool isotp_register_rxid(struct isotp_sock *so)
{ … }
static enum hrtimer_restart isotp_rx_timer_handler(struct hrtimer *hrtimer)
{ … }
static int isotp_send_fc(struct sock *sk, int ae, u8 flowstatus)
{ … }
static void isotp_rcv_skb(struct sk_buff *skb, struct sock *sk)
{ … }
static u8 padlen(u8 datalen)
{ … }
static int check_optimized(struct canfd_frame *cf, int start_index)
{ … }
static int check_pad(struct isotp_sock *so, struct canfd_frame *cf,
int start_index, u8 content)
{ … }
static void isotp_send_cframe(struct isotp_sock *so);
static int isotp_rcv_fc(struct isotp_sock *so, struct canfd_frame *cf, int ae)
{ … }
static int isotp_rcv_sf(struct sock *sk, struct canfd_frame *cf, int pcilen,
struct sk_buff *skb, int len)
{ … }
static int isotp_rcv_ff(struct sock *sk, struct canfd_frame *cf, int ae)
{ … }
static int isotp_rcv_cf(struct sock *sk, struct canfd_frame *cf, int ae,
struct sk_buff *skb)
{ … }
static void isotp_rcv(struct sk_buff *skb, void *data)
{ … }
static void isotp_fill_dataframe(struct canfd_frame *cf, struct isotp_sock *so,
int ae, int off)
{ … }
static void isotp_send_cframe(struct isotp_sock *so)
{ … }
static void isotp_create_fframe(struct canfd_frame *cf, struct isotp_sock *so,
int ae)
{ … }
static void isotp_rcv_echo(struct sk_buff *skb, void *data)
{ … }
static enum hrtimer_restart isotp_tx_timer_handler(struct hrtimer *hrtimer)
{ … }
static enum hrtimer_restart isotp_txfr_timer_handler(struct hrtimer *hrtimer)
{ … }
static int isotp_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
{ … }
static int isotp_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
int flags)
{ … }
static int isotp_release(struct socket *sock)
{ … }
static int isotp_bind(struct socket *sock, struct sockaddr *uaddr, int len)
{ … }
static int isotp_getname(struct socket *sock, struct sockaddr *uaddr, int peer)
{ … }
static int isotp_setsockopt_locked(struct socket *sock, int level, int optname,
sockptr_t optval, unsigned int optlen)
{ … }
static int isotp_setsockopt(struct socket *sock, int level, int optname,
sockptr_t optval, unsigned int optlen)
{ … }
static int isotp_getsockopt(struct socket *sock, int level, int optname,
char __user *optval, int __user *optlen)
{ … }
static void isotp_notify(struct isotp_sock *so, unsigned long msg,
struct net_device *dev)
{ … }
static int isotp_notifier(struct notifier_block *nb, unsigned long msg,
void *ptr)
{ … }
static int isotp_init(struct sock *sk)
{ … }
static __poll_t isotp_poll(struct file *file, struct socket *sock, poll_table *wait)
{ … }
static int isotp_sock_no_ioctlcmd(struct socket *sock, unsigned int cmd,
unsigned long arg)
{ … }
static const struct proto_ops isotp_ops = …;
static struct proto isotp_proto __read_mostly = …;
static const struct can_proto isotp_can_proto = …;
static struct notifier_block canisotp_notifier = …;
static __init int isotp_module_init(void)
{ … }
static __exit void isotp_module_exit(void)
{ … }
module_init(…) …;
module_exit(isotp_module_exit);