⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pkt.cc

📁 a linux like c++ kernel
💻 CC
字号:
#include <lib/root.h>#include <lib/string.h>#include <init/ctor.h>#include <mm/allockm.h>#include "pkt.h"static pool_t * pktpool;__ctor(PRINET, SUBANY, initpktpool){	pktpool = new pool_t("pktpool", sizeof(pkt_t));}pkt_t * newpkt(int priority, int headlen, int datalen, int taillen){	int roomlen = headlen + datalen + taillen;	pkt_t * p = (pkt_t*) pktpool->alloc(priority);	if (!p)		return NULL;	pkb_t * pkb = (pkb_t*) allockm(priority, sizeof(pkb_t) + roomlen);	if (!pkb) {		pktpool->free(p);		return NULL;	}	p->next = p->prev = NULL;	pkb->refcnt = 1;	pkb->roomlen = roomlen;	p->pkb = pkb;	p->data = pkb->room + headlen;	p->datalen = datalen;	p->inputdev = NULL;	p->magic = 0x7483721;	return p;}void delpkt(pkt_t *p){	assert(p->magic == 0x7483721);	assert(p->pkb->refcnt > 0);	if (!--p->pkb->refcnt)		freekm(p->pkb);	p->magic = 0x3721dead;	pktpool->free(p);}/* clone() doesn't alloc a new sock buffer and copy the content    from the origianl sock buffer, it only increase the sock    buffer's refcnt by one */pkt_t * pkt_t::clone(int priority){	assert(pkb && pkb->refcnt);	pkt_t * x = (pkt_t*) pktpool->alloc(priority); 	if (!x)		return NULL;	x->next = x->prev = NULL;		x->data = data;	x->datalen = datalen;	x->pkb = pkb;	x->pkb->refcnt++;	x->inputdev = inputdev;	x->startseq = startseq;	x->endseq = endseq;	x->sendtick = sendtick;	x->magic = 0x7483721;	return x;}int pktq_t::peek(void * buf, int len){	int nread = 0;        pkt_t * pkt;        foreach (pkt, *this) {		int once = min(len, pkt->datalen);		memcpy(buf, pkt->data, once);		nread += once;		buf += once;		len -= once;		if (!len) break;	} 	return nread;}int pktq_t::fetch(void * buf, int len, int * freedroom){	int nread = 0;	if (freedroom) *freedroom = 0;        pkt_t * pkt;        foreachsafe (pkt, *this) {		int once = min(len, pkt->datalen);                pkt->delhead(buf, once);		if (!pkt->datalen) {			if (freedroom) *freedroom += pkt->roomlen();			pkt->unlink();			delpkt(pkt);		}		nread += once;		buf += once;		len -= once;		if (!len) break;	} 	return nread;}void pktq_t::zapall(){	pkt_t * p;	while (p = deqhead())		delpkt(p);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -