30#include <linux/skbuff.h>
33#include <rtnet_internal.h>
138#ifndef CHECKSUM_PARTIAL
139#define CHECKSUM_PARTIAL CHECKSUM_HW
142#define RTSKB_CAP_SHARED 1
143#define RTSKB_CAP_RTMAC_STAMP 2
145#define RTSKB_UNMAPPED 0
156 struct rtskb *chain_end;
159 struct rtskb_pool *pool;
161 unsigned int priority;
164 struct rtnet_device *rtdev;
177 struct icmphdr *icmph;
178 struct iphdr *ipihdr;
191 struct ethhdr *ethernet;
195 unsigned short protocol;
196 unsigned char pkt_type;
198 unsigned char ip_summed;
206 dma_addr_t buf_dma_addr;
208 unsigned char *buf_start;
210#ifdef CONFIG_XENO_DRIVERS_NET_CHECKED
211 unsigned char *buf_end;
214#if IS_ENABLED(CONFIG_XENO_DRIVERS_NET_ADDON_RTCAP)
216 struct rtskb *cap_comp_skb;
217 struct rtskb *cap_next;
218 unsigned char *cap_start;
219 unsigned int cap_len;
223 struct list_head entry;
232struct rtskb_pool_lock_ops {
233 int (*trylock)(
void *cookie);
234 void (*unlock)(
void *cookie);
238 struct rtskb_queue queue;
239 const struct rtskb_pool_lock_ops *lock_ops;
243#define QUEUE_MAX_PRIO 0
244#define QUEUE_MIN_PRIO 31
246struct rtskb_prio_queue {
249 struct rtskb_queue queue[QUEUE_MIN_PRIO + 1];
252#define RTSKB_PRIO_MASK 0x0000FFFF
253#define RTSKB_CHANNEL_MASK 0xFFFF0000
254#define RTSKB_CHANNEL_SHIFT 16
256#define RTSKB_DEF_RT_CHANNEL SOCK_DEF_RT_CHANNEL
257#define RTSKB_DEF_NRT_CHANNEL SOCK_DEF_NRT_CHANNEL
258#define RTSKB_USER_CHANNEL SOCK_USER_CHANNEL
261#define RTSKB_PRIO_VALUE SOCK_XMIT_PARAMS
264#define DEFAULT_GLOBAL_RTSKBS 0
265#define DEFAULT_DEVICE_RTSKBS \
267#define DEFAULT_SOCKET_RTSKBS 16
269#define ALIGN_RTSKB_STRUCT_LEN SKB_DATA_ALIGN(sizeof(struct rtskb))
270#define RTSKB_SIZE (2048 + NET_IP_ALIGN)
272extern unsigned int rtskb_pools;
273extern unsigned int rtskb_pools_max;
274extern unsigned int rtskb_amount;
275extern unsigned int rtskb_amount_max;
277#ifdef CONFIG_XENO_DRIVERS_NET_CHECKED
278extern void rtskb_over_panic(
struct rtskb *skb,
int len,
void *here);
279extern void rtskb_under_panic(
struct rtskb *skb,
int len,
void *here);
282extern struct rtskb *rtskb_pool_dequeue(
struct rtskb_pool *pool);
284extern void rtskb_pool_queue_tail(
struct rtskb_pool *pool,
struct rtskb *skb);
286extern struct rtskb *alloc_rtskb(
unsigned int size,
struct rtskb_pool *pool);
288extern void kfree_rtskb(
struct rtskb *skb);
289#define dev_kfree_rtskb(a) kfree_rtskb(a)
291static inline void rtskb_tx_timestamp(
struct rtskb *skb)
305static inline void rtskb_queue_init(
struct rtskb_queue *queue)
316static inline void rtskb_prio_queue_init(
struct rtskb_prio_queue *prioqueue)
318 memset(prioqueue, 0,
sizeof(
struct rtskb_prio_queue));
326static inline int rtskb_queue_empty(
struct rtskb_queue *queue)
328 return (queue->first == NULL);
335static inline int rtskb_prio_queue_empty(
struct rtskb_prio_queue *prioqueue)
337 return (prioqueue->usage == 0);
345static inline void __rtskb_queue_head(
struct rtskb_queue *queue,
348 struct rtskb *chain_end = skb->chain_end;
350 chain_end->next = queue->first;
352 if (queue->first == NULL)
353 queue->last = chain_end;
362static inline void rtskb_queue_head(
struct rtskb_queue *queue,
368 __rtskb_queue_head(queue, skb);
378static inline void __rtskb_prio_queue_head(
struct rtskb_prio_queue *prioqueue,
381 unsigned int prio = skb->priority & RTSKB_PRIO_MASK;
383 RTNET_ASSERT(prio <= 31, prio = 31;);
385 __rtskb_queue_head(&prioqueue->queue[prio], skb);
386 __set_bit(prio, &prioqueue->usage);
395static inline void rtskb_prio_queue_head(
struct rtskb_prio_queue *prioqueue,
401 __rtskb_prio_queue_head(prioqueue, skb);
410static inline void __rtskb_queue_tail(
struct rtskb_queue *queue,
413 struct rtskb *chain_end = skb->chain_end;
415 chain_end->next = NULL;
417 if (queue->first == NULL)
420 queue->last->next = skb;
421 queue->last = chain_end;
429static inline void rtskb_queue_tail(
struct rtskb_queue *queue,
435 __rtskb_queue_tail(queue, skb);
445static inline bool rtskb_queue_tail_check(
struct rtskb_queue *queue,
452 ret = queue->first == NULL;
453 __rtskb_queue_tail(queue, skb);
465static inline void __rtskb_prio_queue_tail(
struct rtskb_prio_queue *prioqueue,
468 unsigned int prio = skb->priority & RTSKB_PRIO_MASK;
470 RTNET_ASSERT(prio <= 31, prio = 31;);
472 __rtskb_queue_tail(&prioqueue->queue[prio], skb);
473 __set_bit(prio, &prioqueue->usage);
482static inline void rtskb_prio_queue_tail(
struct rtskb_prio_queue *prioqueue,
488 __rtskb_prio_queue_tail(prioqueue, skb);
496static inline struct rtskb *__rtskb_dequeue(
struct rtskb_queue *queue)
498 struct rtskb *result;
500 if ((result = queue->first) != NULL) {
501 queue->first = result->next;
512static inline struct rtskb *rtskb_dequeue(
struct rtskb_queue *queue)
515 struct rtskb *result;
518 result = __rtskb_dequeue(queue);
529static inline struct rtskb *
530__rtskb_prio_dequeue(
struct rtskb_prio_queue *prioqueue)
533 struct rtskb *result = NULL;
534 struct rtskb_queue *sub_queue;
536 if (prioqueue->usage) {
537 prio = ffz(~prioqueue->usage);
538 sub_queue = &prioqueue->queue[prio];
539 result = __rtskb_dequeue(sub_queue);
540 if (rtskb_queue_empty(sub_queue))
541 __change_bit(prio, &prioqueue->usage);
552static inline struct rtskb *
553rtskb_prio_dequeue(
struct rtskb_prio_queue *prioqueue)
556 struct rtskb *result;
559 result = __rtskb_prio_dequeue(prioqueue);
570static inline struct rtskb *__rtskb_dequeue_chain(
struct rtskb_queue *queue)
572 struct rtskb *result;
573 struct rtskb *chain_end;
575 if ((result = queue->first) != NULL) {
576 chain_end = result->chain_end;
577 queue->first = chain_end->next;
578 chain_end->next = NULL;
589static inline struct rtskb *rtskb_dequeue_chain(
struct rtskb_queue *queue)
592 struct rtskb *result;
595 result = __rtskb_dequeue_chain(queue);
606static inline struct rtskb *
607rtskb_prio_dequeue_chain(
struct rtskb_prio_queue *prioqueue)
611 struct rtskb *result = NULL;
612 struct rtskb_queue *sub_queue;
615 if (prioqueue->usage) {
616 prio = ffz(~prioqueue->usage);
617 sub_queue = &prioqueue->queue[prio];
618 result = __rtskb_dequeue_chain(sub_queue);
619 if (rtskb_queue_empty(sub_queue))
620 __change_bit(prio, &prioqueue->usage);
631static inline void rtskb_queue_purge(
struct rtskb_queue *queue)
634 while ((skb = rtskb_dequeue(queue)) != NULL)
638static inline int rtskb_headlen(
const struct rtskb *skb)
643static inline void rtskb_reserve(
struct rtskb *skb,
unsigned int len)
649static inline unsigned char *__rtskb_put(
struct rtskb *skb,
unsigned int len)
651 unsigned char *tmp = skb->tail;
658#define rtskb_put(skb, length) \
660 struct rtskb *__rtskb = (skb); \
661 unsigned int __len = (length); \
662 unsigned char *tmp = __rtskb->tail; \
664 __rtskb->tail += __len; \
665 __rtskb->len += __len; \
667 RTNET_ASSERT(__rtskb->tail <= __rtskb->buf_end, \
668 rtskb_over_panic(__rtskb, __len, \
669 current_text_addr());); \
674static inline unsigned char *__rtskb_push(
struct rtskb *skb,
unsigned int len)
681#define rtskb_push(skb, length) \
683 struct rtskb *__rtskb = (skb); \
684 unsigned int __len = (length); \
686 __rtskb->data -= __len; \
687 __rtskb->len += __len; \
689 RTNET_ASSERT(__rtskb->data >= __rtskb->buf_start, \
690 rtskb_under_panic(__rtskb, __len, \
691 current_text_addr());); \
696static inline unsigned char *__rtskb_pull(
struct rtskb *skb,
unsigned int len)
698 RTNET_ASSERT(len <= skb->len,
return NULL;);
702 return skb->data += len;
705static inline unsigned char *rtskb_pull(
struct rtskb *skb,
unsigned int len)
712 return skb->data += len;
715static inline void rtskb_trim(
struct rtskb *skb,
unsigned int len)
717 if (skb->len > len) {
719 skb->tail = skb->data + len;
723static inline struct rtskb *rtskb_padto(
struct rtskb *rtskb,
unsigned int len)
725 RTNET_ASSERT(len <= (
unsigned int)(rtskb->buf_end + 1 - rtskb->data),
728 memset(rtskb->data + rtskb->len, 0, len - rtskb->len);
733static inline dma_addr_t rtskb_data_dma_addr(
struct rtskb *rtskb,
736 return rtskb->buf_dma_addr + rtskb->data - rtskb->buf_start + offset;
739extern struct rtskb_pool global_pool;
741extern unsigned int rtskb_pool_init(
struct rtskb_pool *pool,
742 unsigned int initial_size,
743 const struct rtskb_pool_lock_ops *lock_ops,
746extern unsigned int __rtskb_module_pool_init(
struct rtskb_pool *pool,
747 unsigned int initial_size,
748 struct module *module);
750#define rtskb_module_pool_init(pool, size) \
751 __rtskb_module_pool_init(pool, size, THIS_MODULE)
753extern void rtskb_pool_release(
struct rtskb_pool *pool);
755extern unsigned int rtskb_pool_extend(
struct rtskb_pool *pool,
756 unsigned int add_rtskbs);
757extern unsigned int rtskb_pool_shrink(
struct rtskb_pool *pool,
758 unsigned int rem_rtskbs);
759extern int rtskb_acquire(
struct rtskb *rtskb,
struct rtskb_pool *comp_pool);
760extern struct rtskb *rtskb_clone(
struct rtskb *rtskb,
struct rtskb_pool *pool);
762extern int rtskb_pools_init(
void);
763extern void rtskb_pools_release(
void);
765extern unsigned int rtskb_copy_and_csum_bits(
const struct rtskb *skb,
766 int offset, u8 *to,
int len,
768extern void rtskb_copy_and_csum_dev(
const struct rtskb *skb, u8 *to);
770#if IS_ENABLED(CONFIG_XENO_DRIVERS_NET_ADDON_RTCAP)
773extern void (*rtcap_handler)(
struct rtskb *skb);
775static inline void rtcap_mark_incoming(
struct rtskb *skb)
777 skb->cap_start = skb->data;
778 skb->cap_len = skb->len;
781static inline void rtcap_report_incoming(
struct rtskb *skb)
786 if (rtcap_handler != NULL)
792static inline void rtcap_mark_rtmac_enqueue(
struct rtskb *skb)
795 skb->cap_flags |= RTSKB_CAP_RTMAC_STAMP;
801#define rtcap_mark_incoming(skb)
802#define rtcap_report_incoming(skb)
803#define rtcap_mark_rtmac_enqueue(skb)
nanosecs_abs_t rtdm_clock_read(void)
Get system time.
#define rtdm_lock_get_irqsave(__lock, __context)
Acquire lock and disable preemption, by stalling the head domain.
Definition driver.h:604
unsigned long rtdm_lockctx_t
Variable to save the context while holding a lock.
Definition driver.h:555
pipeline_spinlock_t rtdm_lock_t
Lock variable.
Definition driver.h:552
static void rtdm_lock_init(rtdm_lock_t *lock)
Dynamic lock initialisation.
Definition driver.h:564
static void rtdm_lock_put_irqrestore(rtdm_lock_t *lock, rtdm_lockctx_t context)
Release lock and restore preemption state.
Definition driver.h:627
uint64_t nanosecs_abs_t
RTDM type for representing absolute dates.
Definition rtdm.h:43