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;
232 struct 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 246 struct 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 1544 272 extern unsigned int rtskb_pools;
273 extern unsigned int rtskb_pools_max;
274 extern unsigned int rtskb_amount;
275 extern unsigned int rtskb_amount_max;
277 #ifdef CONFIG_XENO_DRIVERS_NET_CHECKED 278 extern void rtskb_over_panic(
struct rtskb *skb,
int len,
void *here);
279 extern void rtskb_under_panic(
struct rtskb *skb,
int len,
void *here);
282 extern struct rtskb *rtskb_pool_dequeue(
struct rtskb_pool *pool);
284 extern void rtskb_pool_queue_tail(
struct rtskb_pool *pool,
struct rtskb *skb);
286 extern struct rtskb *alloc_rtskb(
unsigned int size,
struct rtskb_pool *pool);
288 extern void kfree_rtskb(
struct rtskb *skb);
289 #define dev_kfree_rtskb(a) kfree_rtskb(a) 291 static inline void rtskb_tx_timestamp(
struct rtskb *skb)
305 static inline void rtskb_queue_init(
struct rtskb_queue *queue)
316 static inline void rtskb_prio_queue_init(
struct rtskb_prio_queue *prioqueue)
318 memset(prioqueue, 0,
sizeof(
struct rtskb_prio_queue));
326 static inline int rtskb_queue_empty(
struct rtskb_queue *queue)
328 return (queue->first == NULL);
335 static inline int rtskb_prio_queue_empty(
struct rtskb_prio_queue *prioqueue)
337 return (prioqueue->usage == 0);
345 static 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;
362 static inline void rtskb_queue_head(
struct rtskb_queue *queue,
368 __rtskb_queue_head(queue, skb);
378 static 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);
395 static inline void rtskb_prio_queue_head(
struct rtskb_prio_queue *prioqueue,
401 __rtskb_prio_queue_head(prioqueue, skb);
410 static 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;
429 static inline void rtskb_queue_tail(
struct rtskb_queue *queue,
435 __rtskb_queue_tail(queue, skb);
445 static inline bool rtskb_queue_tail_check(
struct rtskb_queue *queue,
452 ret = queue->first == NULL;
453 __rtskb_queue_tail(queue, skb);
465 static 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);
482 static inline void rtskb_prio_queue_tail(
struct rtskb_prio_queue *prioqueue,
488 __rtskb_prio_queue_tail(prioqueue, skb);
496 static inline struct rtskb *__rtskb_dequeue(
struct rtskb_queue *queue)
498 struct rtskb *result;
500 if ((result = queue->first) != NULL) {
501 queue->first = result->next;
512 static inline struct rtskb *rtskb_dequeue(
struct rtskb_queue *queue)
515 struct rtskb *result;
518 result = __rtskb_dequeue(queue);
529 static 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);
552 static inline struct rtskb *
553 rtskb_prio_dequeue(
struct rtskb_prio_queue *prioqueue)
556 struct rtskb *result;
559 result = __rtskb_prio_dequeue(prioqueue);
570 static 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;
589 static inline struct rtskb *rtskb_dequeue_chain(
struct rtskb_queue *queue)
592 struct rtskb *result;
595 result = __rtskb_dequeue_chain(queue);
606 static inline struct rtskb *
607 rtskb_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);
631 static inline void rtskb_queue_purge(
struct rtskb_queue *queue)
634 while ((skb = rtskb_dequeue(queue)) != NULL)
638 static inline int rtskb_headlen(
const struct rtskb *skb)
643 static inline void rtskb_reserve(
struct rtskb *skb,
unsigned int len)
649 static 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());); \ 674 static 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());); \ 696 static inline unsigned char *__rtskb_pull(
struct rtskb *skb,
unsigned int len)
698 RTNET_ASSERT(len <= skb->len,
return NULL;);
702 return skb->data += len;
705 static inline unsigned char *rtskb_pull(
struct rtskb *skb,
unsigned int len)
712 return skb->data += len;
715 static inline void rtskb_trim(
struct rtskb *skb,
unsigned int len)
717 if (skb->len > len) {
719 skb->tail = skb->data + len;
723 static 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);
733 static inline dma_addr_t rtskb_data_dma_addr(
struct rtskb *rtskb,
736 return rtskb->buf_dma_addr + rtskb->data - rtskb->buf_start + offset;
739 extern struct rtskb_pool global_pool;
741 extern unsigned int rtskb_pool_init(
struct rtskb_pool *pool,
742 unsigned int initial_size,
743 const struct rtskb_pool_lock_ops *lock_ops,
746 extern 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) 753 extern void rtskb_pool_release(
struct rtskb_pool *pool);
755 extern unsigned int rtskb_pool_extend(
struct rtskb_pool *pool,
756 unsigned int add_rtskbs);
757 extern unsigned int rtskb_pool_shrink(
struct rtskb_pool *pool,
758 unsigned int rem_rtskbs);
759 extern int rtskb_acquire(
struct rtskb *rtskb,
struct rtskb_pool *comp_pool);
760 extern struct rtskb *rtskb_clone(
struct rtskb *rtskb,
struct rtskb_pool *pool);
762 extern int rtskb_pools_init(
void);
763 extern void rtskb_pools_release(
void);
765 extern unsigned int rtskb_copy_and_csum_bits(
const struct rtskb *skb,
766 int offset, u8 *to,
int len,
768 extern void rtskb_copy_and_csum_dev(
const struct rtskb *skb, u8 *to);
770 #if IS_ENABLED(CONFIG_XENO_DRIVERS_NET_ADDON_RTCAP) 773 extern void (*rtcap_handler)(
struct rtskb *skb);
775 static inline void rtcap_mark_incoming(
struct rtskb *skb)
777 skb->cap_start = skb->data;
778 skb->cap_len = skb->len;
781 static inline void rtcap_report_incoming(
struct rtskb *skb)
786 if (rtcap_handler != NULL)
792 static 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) static void rtdm_lock_put_irqrestore(rtdm_lock_t *lock, rtdm_lockctx_t context)
Release lock and restore preemption state
Definition: driver.h:631
ipipe_spinlock_t rtdm_lock_t
Lock variable.
Definition: driver.h:551
#define rtdm_lock_get_irqsave(__lock, __context)
Acquire lock and disable preemption, by stalling the head domain.
Definition: driver.h:607
uint64_t nanosecs_abs_t
RTDM type for representing absolute dates.
Definition: rtdm.h:43
static void rtdm_lock_init(rtdm_lock_t *lock)
Dynamic lock initialisation
Definition: driver.h:564
nanosecs_abs_t rtdm_clock_read(void)
Get system time
unsigned long rtdm_lockctx_t
Variable to save the context while holding a lock.
Definition: driver.h:554