2 * Linux OS Independent Layer For SKB Packet Handling
4 * Copyright 2005, Broadcom Corporation
7 * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
8 * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
9 * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
10 * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
18 #include <linux/netdevice.h>
19 #include <linux/skbuff.h>
21 * BINOSL selects the slightly slower function-call-based binary compatible osl.
29 osl_pktsetcookie(void *skb, void *x)
31 ((struct sk_buff*)skb)->csum = (uint)x;
35 osl_pktget(osl_t *osh, uint len, bool send)
39 if ((skb = dev_alloc_skb(len)) == NULL)
44 /* ensure the cookie field is cleared */
45 osl_pktsetcookie(skb, NULL);
53 struct sk_buff *skb, *nskb;
55 skb = (struct sk_buff*) p;
57 /* perversion: we use skb->next to chain multi-skb packets */
62 dev_kfree_skb_any(skb);
64 if (skb->destructor) {
65 /* cannot kfree_skb() on hard IRQ (net/core/skbuff.c) if destructor exists */
66 dev_kfree_skb_any(skb);
68 /* can free immediately (even in_irq()) if destructor does not exist */
77 osl_pktdata(osl_t *osh, void *skb)
79 return (((struct sk_buff*)skb)->data);
83 osl_pktlen(osl_t *osh, void *skb)
85 return (((struct sk_buff*)skb)->len);
89 osl_pktheadroom(osl_t *osh, void *skb)
91 return (uint) skb_headroom((struct sk_buff *) skb);
95 osl_pkttailroom(osl_t *osh, void *skb)
97 return (uint) skb_tailroom((struct sk_buff *) skb);
101 osl_pktnext(osl_t *osh, void *skb)
103 return (((struct sk_buff*)skb)->next);
107 osl_pktsetnext(void *skb, void *x)
109 ((struct sk_buff*)skb)->next = (struct sk_buff*)x;
113 osl_pktsetlen(osl_t *osh, void *skb, uint len)
115 __skb_trim((struct sk_buff*)skb, len);
119 osl_pktpush(osl_t *osh, void *skb, int bytes)
121 return (skb_push((struct sk_buff*)skb, bytes));
125 osl_pktpull(osl_t *osh, void *skb, int bytes)
127 return (skb_pull((struct sk_buff*)skb, bytes));
131 osl_pktdup(osl_t *osh, void *skb)
133 return (skb_clone((struct sk_buff*)skb, GFP_ATOMIC));
137 osl_pktcookie(void *skb)
139 return ((void*)((struct sk_buff*)skb)->csum);
143 osl_pktlink(void *skb)
145 return (((struct sk_buff*)skb)->prev);
149 osl_pktsetlink(void *skb, void *x)
151 ((struct sk_buff*)skb)->prev = (struct sk_buff*)x;
155 #define PRIO_LOC_NFMARK 16
159 osl_pktprio(void *skb)
162 ((struct sk_buff*)skb)->priority = ((struct sk_buff*)skb)->nfmark>>PRIO_LOC_NFMARK & 0x7;
164 return (((struct sk_buff*)skb)->priority);
168 osl_pktsetprio(void *skb, uint x)
170 ((struct sk_buff*)skb)->priority = x;
173 ((struct sk_buff*)skb)->nfmark &= ~(0xf << PRIO_LOC_NFMARK);
174 ((struct sk_buff*)skb)->nfmark |= (x & 0x7) << PRIO_LOC_NFMARK;
179 EXPORT_SYMBOL(osl_pktsetcookie);
180 EXPORT_SYMBOL(osl_pktget);
181 EXPORT_SYMBOL(osl_pktfree);
182 EXPORT_SYMBOL(osl_pktdata);
183 EXPORT_SYMBOL(osl_pktlen);
184 EXPORT_SYMBOL(osl_pktheadroom);
185 EXPORT_SYMBOL(osl_pkttailroom);
186 EXPORT_SYMBOL(osl_pktnext);
187 EXPORT_SYMBOL(osl_pktsetnext);
188 EXPORT_SYMBOL(osl_pktsetlen);
189 EXPORT_SYMBOL(osl_pktpush);
190 EXPORT_SYMBOL(osl_pktpull);
191 EXPORT_SYMBOL(osl_pktdup);
192 EXPORT_SYMBOL(osl_pktcookie);
193 EXPORT_SYMBOL(osl_pktlink);
194 EXPORT_SYMBOL(osl_pktsetlink);
195 EXPORT_SYMBOL(osl_pktprio);
196 EXPORT_SYMBOL(osl_pktsetprio);