| /* | |
| * Copyright (C) 2002 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com) | |
| * Licensed under the GPL | |
| */ | |
| #ifndef __UM_VECTOR_KERN_H | |
| #define __UM_VECTOR_KERN_H | |
| #include <linux/netdevice.h> | |
| #include <linux/platform_device.h> | |
| #include <linux/skbuff.h> | |
| #include <linux/socket.h> | |
| #include <linux/list.h> | |
| #include <linux/ctype.h> | |
| #include <linux/workqueue.h> | |
| #include <linux/interrupt.h> | |
| #include "vector_user.h" | |
| /* Queue structure specially adapted for multiple enqueue/dequeue | |
| * in a mmsgrecv/mmsgsend context | |
| */ | |
| /* Dequeue method */ | |
| #define QUEUE_SENDMSG 0 | |
| #define QUEUE_SENDMMSG 1 | |
| #define VECTOR_RX 1 | |
| #define VECTOR_TX (1 << 1) | |
| #define VECTOR_BPF (1 << 2) | |
| #define VECTOR_QDISC_BYPASS (1 << 3) | |
| #define ETH_MAX_PACKET 1500 | |
| #define ETH_HEADER_OTHER 32 /* just in case someone decides to go mad on QnQ */ | |
| struct vector_queue { | |
| struct mmsghdr *mmsg_vector; | |
| void **skbuff_vector; | |
| /* backlink to device which owns us */ | |
| struct net_device *dev; | |
| spinlock_t head_lock; | |
| spinlock_t tail_lock; | |
| int queue_depth, head, tail, max_depth, max_iov_frags; | |
| short options; | |
| }; | |
| struct vector_estats { | |
| uint64_t rx_queue_max; | |
| uint64_t rx_queue_running_average; | |
| uint64_t tx_queue_max; | |
| uint64_t tx_queue_running_average; | |
| uint64_t rx_encaps_errors; | |
| uint64_t tx_timeout_count; | |
| uint64_t tx_restart_queue; | |
| uint64_t tx_kicks; | |
| uint64_t tx_flow_control_xon; | |
| uint64_t tx_flow_control_xoff; | |
| uint64_t rx_csum_offload_good; | |
| uint64_t rx_csum_offload_errors; | |
| uint64_t sg_ok; | |
| uint64_t sg_linearized; | |
| }; | |
| #define VERIFY_HEADER_NOK -1 | |
| #define VERIFY_HEADER_OK 0 | |
| #define VERIFY_CSUM_OK 1 | |
| struct vector_private { | |
| struct list_head list; | |
| spinlock_t lock; | |
| struct net_device *dev; | |
| int unit; | |
| /* Timeout timer in TX */ | |
| struct timer_list tl; | |
| /* Scheduled "remove device" work */ | |
| struct work_struct reset_tx; | |
| struct vector_fds *fds; | |
| struct vector_queue *rx_queue; | |
| struct vector_queue *tx_queue; | |
| int rx_irq; | |
| int tx_irq; | |
| struct arglist *parsed; | |
| void *transport_data; /* transport specific params if needed */ | |
| int max_packet; | |
| int req_size; /* different from max packet - used for TSO */ | |
| int headroom; | |
| int options; | |
| /* remote address if any - some transports will leave this as null */ | |
| int header_size; | |
| int rx_header_size; | |
| int coalesce; | |
| void *header_rxbuffer; | |
| void *header_txbuffer; | |
| int (*form_header)(uint8_t *header, | |
| struct sk_buff *skb, struct vector_private *vp); | |
| int (*verify_header)(uint8_t *header, | |
| struct sk_buff *skb, struct vector_private *vp); | |
| spinlock_t stats_lock; | |
| struct tasklet_struct tx_poll; | |
| bool rexmit_scheduled; | |
| bool opened; | |
| bool in_write_poll; | |
| /* ethtool stats */ | |
| struct vector_estats estats; | |
| void *bpf; | |
| char user[0]; | |
| }; | |
| extern int build_transport_data(struct vector_private *vp); | |
| #endif |