Rev 3 |
Blame |
Compare with Previous |
Last modification |
View Log
| RSS feed
/* Emulates Linux sk buffers using hartik net buffers... */
#include <kernel/kern.h>
#include <semaphore.h>
#include "../net/netbuff.h"
#include "../net/eth_priv.h"
#include"linux/skbuff.h"
#define LOWLEV_TX_BUFFERS 50
#define LOWLEV_RX_BUFFERS 50
struct netbuff rxbuff
;
struct netbuff lowlevel_txbuff
;
void skb_init
(void)
{
netbuff_init
(&lowlevel_txbuff
, LOWLEV_TX_BUFFERS
, ETH_MAX_LEN
);
netbuff_init
(&rxbuff
, LOWLEV_RX_BUFFERS
, ETH_MAX_LEN
);
}
struct sk_buff
*dev_alloc_skb
(unsigned int len
)
{
struct sk_buff
*skb
;
kern_cli
();
skb
= kern_alloc
(sizeof(struct sk_buff
));
kern_sti
();
skb
->data
= netbuff_get
(&rxbuff
, NON_BLOCK
);
if (skb
->data
== NULL
) {
return NULL
;
}
skb
->head
= skb
->data
;
skb
->tail
= skb
->data
;
skb
->len
= 0;
skb
->truesize
= len
;
return skb
;
}
void skb_reserve
(struct sk_buff
*skb
, int len
)
{
/* changed by PJ ... before it did nothing... */
skb
->data
+=len
;
skb
->tail
+=len
;
}
unsigned char *skb_put
(struct sk_buff
*skb
, int len
)
{
unsigned char *tmp
=skb
->tail
;
skb
->tail
+=len
;
skb
->len
+=len
;
return tmp
;
}
void skb_queue_head_init
(struct sk_buff_head
*list
)
{
list
->prev
= (struct sk_buff
*)list
;
list
->next
= (struct sk_buff
*)list
;
list
->qlen
= 0;
}
struct sk_buff
*skb_realloc_headroom
(struct sk_buff
*skb
, int newheadroom
)
{
struct sk_buff
*n
;
unsigned long offset
;
int headroom
= skb_headroom
(skb
);
/*
* Allocate the copy buffer
*/
n
=alloc_skb
(skb
->truesize
+newheadroom
-headroom
, GFP_ATOMIC
);
if(n
==NULL
)
return NULL
;
skb_reserve
(n
,newheadroom
);
/*
* Shift between the two data areas in bytes
*/
offset
=n
->data
-skb
->data
;
/* Set the tail pointer and length */
skb_put
(n
,skb
->len
);
/* Copy the bytes */
memcpy(n
->data
,skb
->data
,skb
->len
);
n
->list
=NULL
;
// n->sk=NULL;
// n->priority=skb->priority;
n
->protocol
=skb
->protocol
;
n
->dev
=skb
->dev
;
// n->dst=dst_clone(skb->dst);
// n->h.raw=skb->h.raw+offset;
// n->nh.raw=skb->nh.raw+offset;
// n->mac.raw=skb->mac.raw+offset;
memcpy(n
->cb
, skb
->cb
, sizeof(skb
->cb
));
n
->used
=skb
->used
;
// n->is_clone=0;
// atomic_set(&n->users, 1);
// n->pkt_type=skb->pkt_type;
// n->stamp=skb->stamp;
// n->destructor = NULL;
// n->security=skb->security;
#ifdef CONFIG_IP_FIREWALL
n
->fwmark
= skb
->fwmark
;
#endif
return n
;
}