diff options
author | Ralf Baechle <ralf@linux-mips.org> | 1995-11-14 08:00:00 +0000 |
---|---|---|
committer | <ralf@linux-mips.org> | 1995-11-14 08:00:00 +0000 |
commit | e7c2a72e2680827d6a733931273a93461c0d8d1b (patch) | |
tree | c9abeda78ef7504062bb2e816bcf3e3c9d680112 /include/linux/skbuff.h | |
parent | ec6044459060a8c9ce7f64405c465d141898548c (diff) |
Import of Linux/MIPS 1.3.0
Diffstat (limited to 'include/linux/skbuff.h')
-rw-r--r-- | include/linux/skbuff.h | 216 |
1 files changed, 183 insertions, 33 deletions
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index fca7ba7cd..e831eb130 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -16,8 +16,9 @@ #include <linux/malloc.h> #include <linux/wait.h> #include <linux/time.h> +#include <linux/config.h> -#define CONFIG_SKB_CHECK 1 +#undef CONFIG_SKB_CHECK #define HAVE_ALLOC_SKB /* For the drivers to know */ @@ -36,17 +37,17 @@ struct sk_buff_head { struct sk_buff { - struct sk_buff * volatile next; - struct sk_buff * volatile prev; + struct sk_buff * volatile next; /* Next buffer in list */ + struct sk_buff * volatile prev; /* Previous buffer in list */ #if CONFIG_SKB_CHECK int magic_debug_cookie; #endif - struct sk_buff * volatile link3; - struct sock *sk; - volatile unsigned long when; /* used to compute rtt's */ - struct timeval stamp; - struct device *dev; - struct sk_buff *mem_addr; + struct sk_buff * volatile link3; /* Link for IP protocol level buffer chains */ + struct sock *sk; /* Socket we are owned by */ + volatile unsigned long when; /* used to compute rtt's */ + struct timeval stamp; /* Time we arrived */ + struct device *dev; /* Device we arrived on/are leaving by */ + struct sk_buff *mem_addr; /* Self reference (obsolete) */ union { struct tcphdr *th; struct ethhdr *eth; @@ -55,30 +56,34 @@ struct sk_buff { unsigned char *raw; unsigned long seq; } h; - struct iphdr *ip_hdr; /* For IPPROTO_RAW */ - unsigned long mem_len; - unsigned long len; - unsigned long fraglen; - struct sk_buff *fraglist; /* Fragment list */ - unsigned long truesize; - unsigned long saddr; - unsigned long daddr; - unsigned long raddr; /* next hop addr */ - volatile char acked, - used, - free, - arp; - unsigned char tries,lock,localroute,pkt_type; -#define PACKET_HOST 0 /* To us */ -#define PACKET_BROADCAST 1 -#define PACKET_MULTICAST 2 -#define PACKET_OTHERHOST 3 /* Unmatched promiscuous */ - unsigned short users; /* User count - see datagram.c (and soon seqpacket.c/stream.c) */ + struct iphdr *ip_hdr; /* For IPPROTO_RAW */ + unsigned long mem_len; /* Length of allocated memory */ + unsigned long len; /* Length of actual data */ + unsigned long fraglen; /* Unused (yet) */ + struct sk_buff *fraglist; /* Fragment list */ + unsigned long truesize; /* True buffer size (obsolete) */ + unsigned long saddr; /* IP source address */ + unsigned long daddr; /* IP target address */ + unsigned long raddr; /* IP next hop address */ + volatile char acked, /* Are we acked ? */ + used, /* Are we in use ? */ + free, /* How to free this buffer */ + arp; /* Has IP/ARP resolution finished */ + unsigned char tries, /* Times tried */ + lock, /* Are we locked ? */ + localroute, /* Local routing asserted for this frame */ + pkt_type; /* Packet class */ +#define PACKET_HOST 0 /* To us */ +#define PACKET_BROADCAST 1 /* To all */ +#define PACKET_MULTICAST 2 /* To group */ +#define PACKET_OTHERHOST 3 /* To someone else */ + unsigned short users; /* User count - see datagram.c,tcp.c */ + unsigned short protocol; /* Packet protocol from driver. */ #ifdef CONFIG_SLAVE_BALANCING unsigned short in_dev_queue; #endif - unsigned long padding[0]; - unsigned char data[0]; + unsigned long padding[0]; /* Force long word alignment */ + unsigned char data[0]; /* Data follows */ }; #define SK_WMEM_MAX 32767 @@ -94,7 +99,9 @@ struct sk_buff { /* * Handling routines are only of interest to the kernel */ - + +#include <asm/system.h> + #if 0 extern void print_skb(struct sk_buff *); #endif @@ -131,8 +138,151 @@ extern int skb_check(struct sk_buff *skb,int,int, char *); #define IS_SKB(skb) skb_check((skb), 0, __LINE__,__FILE__) #define IS_SKB_HEAD(skb) skb_check((skb), 1, __LINE__,__FILE__) #else -#define IS_SKB(skb) 0 -#define IS_SKB_HEAD(skb) 0 +#define IS_SKB(skb) +#define IS_SKB_HEAD(skb) + +extern __inline__ void skb_queue_head_init(struct sk_buff_head *list) +{ + list->prev = (struct sk_buff *)list; + list->next = (struct sk_buff *)list; +} + +/* + * Insert an sk_buff at the start of a list. + */ + +extern __inline__ void skb_queue_head(struct sk_buff_head *list_,struct sk_buff *newsk) +{ + unsigned long flags; + struct sk_buff *list = (struct sk_buff *)list_; + + save_flags(flags); + cli(); + newsk->next = list->next; + newsk->prev = list; + newsk->next->prev = newsk; + newsk->prev->next = newsk; + restore_flags(flags); +} + +/* + * Insert an sk_buff at the end of a list. + */ + +extern __inline__ void skb_queue_tail(struct sk_buff_head *list_, struct sk_buff *newsk) +{ + unsigned long flags; + struct sk_buff *list = (struct sk_buff *)list_; + + save_flags(flags); + cli(); + + newsk->next = list; + newsk->prev = list->prev; + + newsk->next->prev = newsk; + newsk->prev->next = newsk; + + restore_flags(flags); +} + +/* + * Remove an sk_buff from a list. This routine is also interrupt safe + * so you can grab read and free buffers as another process adds them. + * + * Note we now do the ful list + */ + +extern __inline__ struct sk_buff *skb_dequeue(struct sk_buff_head *list_) +{ + long flags; + struct sk_buff *result; + struct sk_buff *list = (struct sk_buff *)list_; + + save_flags(flags); + cli(); + + result = list->next; + if (result == list) + { + restore_flags(flags); + return NULL; + } + else + { + result->next->prev = list; + list->next = result->next; + + result->next = NULL; + result->prev = NULL; + + restore_flags(flags); + + return result; + } +} + +/* + * Insert a packet before another one in a list. + */ + +extern __inline__ void skb_insert(struct sk_buff *old, struct sk_buff *newsk) +{ + unsigned long flags; + + save_flags(flags); + cli(); + newsk->next = old; + newsk->prev = old->prev; + old->prev = newsk; + newsk->prev->next = newsk; + + restore_flags(flags); +} + +/* + * Place a packet after a given packet in a list. + */ + +extern __inline__ void skb_append(struct sk_buff *old, struct sk_buff *newsk) +{ + unsigned long flags; + + save_flags(flags); + cli(); + + newsk->prev = old; + newsk->next = old->next; + newsk->next->prev = newsk; + old->next = newsk; + + restore_flags(flags); +} + +/* + * Remove an sk_buff from its list. Works even without knowing the list it + * is sitting on, which can be handy at times. It also means that THE LIST + * MUST EXIST when you unlink. Thus a list must have its contents unlinked + * _FIRST_. + */ + +extern __inline__ void skb_unlink(struct sk_buff *skb) +{ + unsigned long flags; + + save_flags(flags); + cli(); + + if(skb->prev && skb->next) + { + skb->next->prev = skb->prev; + skb->prev->next = skb->next; + skb->next = NULL; + skb->prev = NULL; + } + restore_flags(flags); +} + #endif extern struct sk_buff * skb_recv_datagram(struct sock *sk,unsigned flags,int noblock, int *err); |