30 #include <linux/skbuff.h> 33 #include <rtnet_internal.h> 140 #ifndef CHECKSUM_PARTIAL 141 #define CHECKSUM_PARTIAL CHECKSUM_HW 144 #define RTSKB_CAP_SHARED 1 145 #define RTSKB_CAP_RTMAC_STAMP 2 147 #define RTSKB_UNMAPPED 0 158 struct rtskb *chain_end;
161 struct rtskb_pool *pool;
163 unsigned int priority;
166 struct rtnet_device *rtdev;
180 struct icmphdr *icmph;
181 struct iphdr *ipihdr;
196 struct ethhdr *ethernet;
200 unsigned short protocol;
201 unsigned char pkt_type;
203 unsigned char ip_summed;
211 dma_addr_t buf_dma_addr;
213 unsigned char *buf_start;
215 #ifdef CONFIG_XENO_DRIVERS_NET_CHECKED 216 unsigned char *buf_end;
219 #if IS_ENABLED(CONFIG_XENO_DRIVERS_NET_ADDON_RTCAP) 221 struct rtskb *cap_comp_skb;
222 struct rtskb *cap_next;
223 unsigned char *cap_start;
224 unsigned int cap_len;
228 struct list_head entry;
237 struct rtskb_pool_lock_ops {
238 int (*trylock)(
void *cookie);
239 void (*unlock)(
void *cookie);
243 struct rtskb_queue queue;
244 const struct rtskb_pool_lock_ops *lock_ops;
248 #define QUEUE_MAX_PRIO 0 249 #define QUEUE_MIN_PRIO 31 251 struct rtskb_prio_queue {
254 struct rtskb_queue queue[QUEUE_MIN_PRIO+1];
257 #define RTSKB_PRIO_MASK 0x0000FFFF 258 #define RTSKB_CHANNEL_MASK 0xFFFF0000 259 #define RTSKB_CHANNEL_SHIFT 16 261 #define RTSKB_DEF_RT_CHANNEL SOCK_DEF_RT_CHANNEL 262 #define RTSKB_DEF_NRT_CHANNEL SOCK_DEF_NRT_CHANNEL 263 #define RTSKB_USER_CHANNEL SOCK_USER_CHANNEL 266 #define RTSKB_PRIO_VALUE SOCK_XMIT_PARAMS 270 #define DEFAULT_GLOBAL_RTSKBS 0 271 #define DEFAULT_DEVICE_RTSKBS 16 272 #define DEFAULT_SOCKET_RTSKBS 16 274 #define ALIGN_RTSKB_STRUCT_LEN SKB_DATA_ALIGN(sizeof(struct rtskb)) 275 #define RTSKB_SIZE 1544 277 extern unsigned int rtskb_pools;
278 extern unsigned int rtskb_pools_max;
279 extern unsigned int rtskb_amount;
280 extern unsigned int rtskb_amount_max;
282 #ifdef CONFIG_XENO_DRIVERS_NET_CHECKED 283 extern void rtskb_over_panic(
struct rtskb *skb,
int len,
void *here);
284 extern void rtskb_under_panic(
struct rtskb *skb,
int len,
void *here);
287 extern struct rtskb *rtskb_pool_dequeue(
struct rtskb_pool *pool);
289 extern void rtskb_pool_queue_tail(
struct rtskb_pool *pool,
struct rtskb *skb);
291 extern struct rtskb *alloc_rtskb(
unsigned int size,
struct rtskb_pool *pool);
293 extern void kfree_rtskb(
struct rtskb *skb);
294 #define dev_kfree_rtskb(a) kfree_rtskb(a) 297 #define rtskb_checksum_none_assert(skb) (skb->ip_summed = CHECKSUM_NONE) 299 static inline void rtskb_tx_timestamp(
struct rtskb *skb)
313 static inline void rtskb_queue_init(
struct rtskb_queue *queue)
324 static inline void rtskb_prio_queue_init(
struct rtskb_prio_queue *prioqueue)
326 memset(prioqueue, 0,
sizeof(
struct rtskb_prio_queue));
334 static inline int rtskb_queue_empty(
struct rtskb_queue *queue)
336 return (queue->first == NULL);
343 static inline int rtskb_prio_queue_empty(
struct rtskb_prio_queue *prioqueue)
345 return (prioqueue->usage == 0);
353 static inline void __rtskb_queue_head(
struct rtskb_queue *queue,
356 struct rtskb *chain_end = skb->chain_end;
358 chain_end->next = queue->first;
360 if (queue->first == NULL)
361 queue->last = chain_end;
370 static inline void rtskb_queue_head(
struct rtskb_queue *queue,
struct rtskb *skb)
375 __rtskb_queue_head(queue, skb);
385 static inline void __rtskb_prio_queue_head(
struct rtskb_prio_queue *prioqueue,
388 unsigned int prio = skb->priority & RTSKB_PRIO_MASK;
390 RTNET_ASSERT(prio <= 31, prio = 31;);
392 __rtskb_queue_head(&prioqueue->queue[prio], skb);
393 __set_bit(prio, &prioqueue->usage);
402 static inline void rtskb_prio_queue_head(
struct rtskb_prio_queue *prioqueue,
408 __rtskb_prio_queue_head(prioqueue, skb);
417 static inline void __rtskb_queue_tail(
struct rtskb_queue *queue,
420 struct rtskb *chain_end = skb->chain_end;
422 chain_end->next = NULL;
424 if (queue->first == NULL)
427 queue->last->next = skb;
428 queue->last = chain_end;
436 static inline void rtskb_queue_tail(
struct rtskb_queue *queue,
442 __rtskb_queue_tail(queue, skb);
452 static inline void __rtskb_prio_queue_tail(
struct rtskb_prio_queue *prioqueue,
455 unsigned int prio = skb->priority & RTSKB_PRIO_MASK;
457 RTNET_ASSERT(prio <= 31, prio = 31;);
459 __rtskb_queue_tail(&prioqueue->queue[prio], skb);
460 __set_bit(prio, &prioqueue->usage);
469 static inline void rtskb_prio_queue_tail(
struct rtskb_prio_queue *prioqueue,
475 __rtskb_prio_queue_tail(prioqueue, skb);
483 static inline struct rtskb *__rtskb_dequeue(
struct rtskb_queue *queue)
485 struct rtskb *result;
487 if ((result = queue->first) != NULL) {
488 queue->first = result->next;
499 static inline struct rtskb *rtskb_dequeue(
struct rtskb_queue *queue)
502 struct rtskb *result;
505 result = __rtskb_dequeue(queue);
516 static inline struct rtskb *
517 __rtskb_prio_dequeue(
struct rtskb_prio_queue *prioqueue)
520 struct rtskb *result = NULL;
521 struct rtskb_queue *sub_queue;
523 if (prioqueue->usage) {
524 prio = ffz(~prioqueue->usage);
525 sub_queue = &prioqueue->queue[prio];
526 result = __rtskb_dequeue(sub_queue);
527 if (rtskb_queue_empty(sub_queue))
528 __change_bit(prio, &prioqueue->usage);
539 static inline struct rtskb *
540 rtskb_prio_dequeue(
struct rtskb_prio_queue *prioqueue)
543 struct rtskb *result;
546 result = __rtskb_prio_dequeue(prioqueue);
557 static inline struct rtskb *__rtskb_dequeue_chain(
struct rtskb_queue *queue)
559 struct rtskb *result;
560 struct rtskb *chain_end;
562 if ((result = queue->first) != NULL) {
563 chain_end = result->chain_end;
564 queue->first = chain_end->next;
565 chain_end->next = NULL;
576 static inline struct rtskb *rtskb_dequeue_chain(
struct rtskb_queue *queue)
579 struct rtskb *result;
582 result = __rtskb_dequeue_chain(queue);
594 struct rtskb *rtskb_prio_dequeue_chain(
struct rtskb_prio_queue *prioqueue)
598 struct rtskb *result = NULL;
599 struct rtskb_queue *sub_queue;
602 if (prioqueue->usage) {
603 prio = ffz(~prioqueue->usage);
604 sub_queue = &prioqueue->queue[prio];
605 result = __rtskb_dequeue_chain(sub_queue);
606 if (rtskb_queue_empty(sub_queue))
607 __change_bit(prio, &prioqueue->usage);
618 static inline void rtskb_queue_purge(
struct rtskb_queue *queue)
621 while ( (skb=rtskb_dequeue(queue))!=NULL )
625 static inline int rtskb_headlen(
const struct rtskb *skb)
630 static inline void rtskb_reserve(
struct rtskb *skb,
unsigned int len)
636 static inline unsigned char *__rtskb_put(
struct rtskb *skb,
unsigned int len)
638 unsigned char *tmp=skb->tail;
645 #define rtskb_put(skb, length) \ 647 struct rtskb *__rtskb = (skb); \ 648 unsigned int __len = (length); \ 649 unsigned char *tmp=__rtskb->tail; \ 651 __rtskb->tail += __len; \ 652 __rtskb->len += __len; \ 654 RTNET_ASSERT(__rtskb->tail <= __rtskb->buf_end, \ 655 rtskb_over_panic(__rtskb, __len, current_text_addr());); \ 660 static inline unsigned char *__rtskb_push(
struct rtskb *skb,
unsigned int len)
667 #define rtskb_push(skb, length) \ 669 struct rtskb *__rtskb = (skb); \ 670 unsigned int __len = (length); \ 672 __rtskb->data -= __len; \ 673 __rtskb->len += __len; \ 675 RTNET_ASSERT(__rtskb->data >= __rtskb->buf_start, \ 676 rtskb_under_panic(__rtskb, __len, current_text_addr());); \ 681 static inline unsigned char *__rtskb_pull(
struct rtskb *skb,
unsigned int len)
683 RTNET_ASSERT(len <= skb->len,
return NULL;);
687 return skb->data += len;
690 static inline unsigned char *rtskb_pull(
struct rtskb *skb,
unsigned int len)
697 return skb->data += len;
700 static inline void rtskb_trim(
struct rtskb *skb,
unsigned int len)
704 skb->tail = skb->data+len;
708 static inline struct rtskb *rtskb_padto(
struct rtskb *rtskb,
unsigned int len)
710 RTNET_ASSERT(len <= (
unsigned int)(rtskb->buf_end + 1 - rtskb->data),
713 memset(rtskb->data + rtskb->len, 0, len - rtskb->len);
718 static inline dma_addr_t rtskb_data_dma_addr(
struct rtskb *rtskb,
721 return rtskb->buf_dma_addr + rtskb->data - rtskb->buf_start + offset;
724 extern struct rtskb_pool global_pool;
726 extern unsigned int rtskb_pool_init(
struct rtskb_pool *pool,
727 unsigned int initial_size,
728 const struct rtskb_pool_lock_ops *lock_ops,
731 extern unsigned int __rtskb_module_pool_init(
struct rtskb_pool *pool,
732 unsigned int initial_size,
733 struct module *module);
735 #define rtskb_module_pool_init(pool, size) \ 736 __rtskb_module_pool_init(pool, size, THIS_MODULE) 738 extern void rtskb_pool_release(
struct rtskb_pool *pool);
740 extern unsigned int rtskb_pool_extend(
struct rtskb_pool *pool,
741 unsigned int add_rtskbs);
742 extern unsigned int rtskb_pool_shrink(
struct rtskb_pool *pool,
743 unsigned int rem_rtskbs);
744 extern int rtskb_acquire(
struct rtskb *rtskb,
struct rtskb_pool *comp_pool);
745 extern struct rtskb* rtskb_clone(
struct rtskb *rtskb,
746 struct rtskb_pool *pool);
748 extern int rtskb_pools_init(
void);
749 extern void rtskb_pools_release(
void);
751 extern unsigned int rtskb_copy_and_csum_bits(
const struct rtskb *skb,
752 int offset, u8 *to,
int len,
754 extern void rtskb_copy_and_csum_dev(
const struct rtskb *skb, u8 *to);
757 #if IS_ENABLED(CONFIG_XENO_DRIVERS_NET_ADDON_RTCAP) 760 extern void (*rtcap_handler)(
struct rtskb *skb);
762 static inline void rtcap_mark_incoming(
struct rtskb *skb)
764 skb->cap_start = skb->data;
765 skb->cap_len = skb->len;
768 static inline void rtcap_report_incoming(
struct rtskb *skb)
774 if (rtcap_handler != NULL)
780 static inline void rtcap_mark_rtmac_enqueue(
struct rtskb *skb)
783 skb->cap_flags |= RTSKB_CAP_RTMAC_STAMP;
789 #define rtcap_mark_incoming(skb) 790 #define rtcap_report_incoming(skb) 791 #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:626
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:603
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:563
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