亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? pktdrvr.c

?? uCLinux下的一個(gè)TCP/IP協(xié)議棧源碼
?? C
字號(hào):
/* Driver for FTP Software's packet driver interface. (PC specific code)
 */
#include <stdio.h>
#include <dos.h>
#include "global.h"
#include "proc.h"
#include "mbuf.h"
#include "netuser.h"
#include "enet.h"
#include "arcnet.h"
#include "ax25.h"
#include "slip.h"
#include "kiss.h"
#include "iface.h"
#include "arp.h"
#include "trace.h"
#include "pktdrvr.h"
#include "config.h"
#include "devparam.h"

static long access_type(int intno,int if_class,int if_type,
	int if_number, uint8 *type,unsigned typelen,
	INTERRUPT (*receiver)(void) );
static int driver_info(int intno,int handle,int *version,
	int *class,int *type,int *number,int *basic);
static int release_type(int intno,int handle);
static int get_address(int intno,int handle,uint8 *buf,int len);
static int set_rcv_mode(int intno,int handle,int mode);
static int pk_raw(struct iface *iface,struct mbuf **bpp);
static int pk_stop(struct iface *iface);
static int send_pkt(int intno,uint8 *buffer,unsigned length);


static INTERRUPT (*Pkvec[])() = { pkvec0,pkvec1,pkvec2 };
static struct pktdrvr Pktdrvr[PK_MAX];
static int Derr;
char Pkt_sig[] = "PKT DRVR";	/* Packet driver signature */

/*
 * Send routine for packet driver
 */

int
pk_send(
struct mbuf **bpp,	/* Buffer to send */
struct iface *iface,	/* Pointer to interface control block */
int32 gateway,		/* Ignored  */
uint8 tos
){
	if(iface == NULL){
		free_p(bpp);
		return -1;
	}
	return (*iface->raw)(iface,bpp);
}

/* Send raw packet (caller provides header) */
static int
pk_raw(
struct iface *iface,	/* Pointer to interface control block */
struct mbuf **bpp	/* Data field */
){
	register struct pktdrvr *pp;
	uint16 size;
	struct mbuf *bp1;

	iface->rawsndcnt++;
	iface->lastsent = secclock();

	dump(iface,IF_TRACE_OUT,*bpp);
	pp = &Pktdrvr[iface->dev];
	size = len_p(*bpp);

	/* Perform class-specific processing, if any */
	switch(pp->class){
	case CL_ETHERNET:
		if(size < RUNT){
			/* Pad the packet out to the minimum */
#ifdef	SECURE
			/* This option copies the packet to a new mbuf,
			 * padded out with zeros. Otherwise we just lie
			 * to the packet driver about the length, and it
			 * will spit out bytes beyond the end of the mbuf
			 * that might be compromising. The cost is another
			 * alloc, free and copy.
			 */
			bp1 = ambufw(RUNT);
			bp1->cnt = RUNT;
			memset(bp1->data+size,0,RUNT-size);
			pullup(bpp,bp1->data,size);
			free_p(bpp);	/* Shouldn't be necessary */
			*bpp = bp1;
#endif
			size = RUNT;
		}
		break;
	case CL_KISS:
		/* This *really* shouldn't be done here, but it was the
		 * easiest way. Put the type field for KISS TNC on front.
		 */
		pushdown(bpp,NULL,1);
		(*bpp)->data[0] = PARAM_DATA;
		size++;
		break;
	}
	if((*bpp)->next != NULL){
		/* Copy to contiguous buffer, since driver can't handle mbufs */
		bp1 = copy_p(*bpp,size);
		free_p(bpp);
		*bpp = bp1;
		if(*bpp == NULL)
			return -1;
	}
	send_pkt(pp->intno,(*bpp)->data,size);
	free_p(bpp);
	return 0;
}

/* Packet driver receive upcall routine. Called by the packet driver TSR
 * twice for each incoming packet: first with ax == 0 to allocate a buffer,
 * and then with ax == 1 to signal completion of the copy.
 *
 * The packet driver actually calls an assembler hook (pkvec* in pkvec.s)
 * that passes the driver's ax and cx registers to us as args.
 * It then passes our return value back to the packet driver in es:di.
 *
 * Note that pushing es and di to us as args that we can modify only
 * works reliably when the function is of type "interrupt". Otherwise the
 * compiler can cache the args in registers and optimize out the stores back
 * into the stack since C args are normally call-by-value.
 */
uint8 *
pkint(
int dev,
unsigned short cx,
unsigned short ax
){
	register struct pktdrvr *pp;
	uint8 *retval = NULL;	

	if(dev < 0 || dev >= PK_MAX)
		return NULL;	/* Unknown device */
	pp = &Pktdrvr[dev];
	if(pp->iface == NULL)
		return NULL;	/* Unknown device */
	switch(ax){
	case 0:	/* Space allocate call */
		if((pp->buffer = alloc_mbuf(cx+sizeof(struct iface *))) != NULL){
			pp->buffer->data += sizeof(struct iface *);
			pp->buffer->cnt = cx;
			retval = pp->buffer->data;
		}
		break;
	case 1:	/* Packet complete call */
		net_route(pp->iface,&pp->buffer);
		break;
	default:
		break;
	}
	return retval;
}

/* Shut down the packet interface */
static int
pk_stop(
struct iface *iface
){
	struct pktdrvr *pp;

	pp = &Pktdrvr[iface->dev];
	/* Call driver's release_type() entry */
	if(release_type(pp->intno,pp->handle1) == -1)
		printf("%s: release_type error code %u\n",iface->name,Derr);

	if(pp->class == CL_ETHERNET || pp->class == CL_ARCNET){
		release_type(pp->intno,pp->handle2);
		release_type(pp->intno,pp->handle3);
	}
	pp->iface = NULL;
	return 0;
}
/* Attach a packet driver to the system
 * argv[0]: hardware type, must be "packet"
 * argv[1]: software interrupt vector, e.g., x7e
 * argv[2]: interface label, e.g., "trw0"
 * argv[3]: maximum number of packets allowed on transmit queue, e.g., "5"
 * argv[4]: maximum transmission unit, bytes, e.g., "1500"
 * argv[5]: IP address (optional)
 */
int
pk_attach(
int argc,
char *argv[],
void *p
){
	register struct iface *if_pk;
	int class,type;
	unsigned int intno;
	static uint8 iptype[] = {IP_TYPE >> 8,IP_TYPE};
	static uint8 arptype[] = {ARP_TYPE >> 8,ARP_TYPE};
	static uint8 revarptype[] = {REVARP_TYPE >> 8, REVARP_TYPE};
	long handle;
	int i;
#ifdef	ARCNET
	static uint8 arcip[] = {ARC_IP};
	static uint8 arcarp[] = {ARC_ARP};
#endif

	long drvvec;
	char sig[8];	/* Copy of driver signature "PKT DRVR" */
	register struct pktdrvr *pp;
	char tmp[25];
	char *cp;

	for(i=0;i<PK_MAX;i++){
		if(Pktdrvr[i].iface == NULL)
			break;
	}
	if(i >= PK_MAX){
		printf("Too many packet drivers\n");
		return -1;
	}
	if(if_lookup(argv[2]) != NULL){
		printf("Interface %s already exists\n",argv[2]);
		return -1;
	}

	intno = htoi(argv[1]);
	/* Verify that there's really a packet driver there, so we don't
	 * go off into the ozone (if there's any left)
	 */
	drvvec = (long)getvect(intno);
	movblock(FP_OFF(drvvec)+3, FP_SEG(drvvec),
		FP_OFF(sig),FP_SEG(sig),strlen(Pkt_sig));
	if(strncmp(sig,Pkt_sig,strlen(Pkt_sig)) != 0){
		printf("No packet driver loaded at int 0x%x\n",intno);
		return -1;
	}
	if_pk = (struct iface *)callocw(1,sizeof(struct iface));
	if_pk->name = strdup(argv[2]);
	if(argc > 5)
		if_pk->addr = resolve(argv[5]);
	else
		if_pk->addr = Ip_addr;
	pp = &Pktdrvr[i];
	if_pk->mtu = atoi(argv[4]);
	if_pk->dev = i;
	if_pk->raw = pk_raw;
	if_pk->stop = pk_stop;
	pp->intno = intno;
	pp->iface = if_pk;

 	/* Version 1.08 of the packet driver spec dropped the handle
 	 * requirement from the driver_info call.  However, if we are using
 	 * a version 1.05 packet driver, the following call will fail.
  	 */
 	if(driver_info(intno,-1,NULL,&class,&type,NULL,NULL) < 0){
		/* Find out by exhaustive search what class this driver is (ugh) */
		for(class=1;class<=NCLASS;class++){
			/* Store handle in temp long so we can tell an
			 * error return (-1) from a handle of 0xffff
			 */
			handle = access_type(intno,class,ANYTYPE,0,iptype,2,
				Pkvec[if_pk->dev]);
			if(handle != -1 || Derr == TYPE_INUSE){
				pp->handle1 = handle;
				break;
			}
		}
		/* Now that we know, release it and do it all over again with the
		 * right type fields
		 */
		release_type(intno,pp->handle1);
	}
	switch(class){
	case CL_ETHERNET:
		pp->handle1 = access_type(intno,class,ANYTYPE,0,iptype,2,
			Pkvec[if_pk->dev]);
		pp->handle2 = access_type(intno,class,ANYTYPE,0,arptype,2,
			Pkvec[if_pk->dev]);
		pp->handle3 = access_type(intno,class,ANYTYPE,0,revarptype,2,
			Pkvec[if_pk->dev]);
		setencap(if_pk,"Ethernet");

		/**** temp set multicast flag ****/
/*		i = set_rcv_mode(intno,pp->handle1,5);
		printf("set_rcv_mode returns %d, Derr = %d\n",i,Derr); */

		/* Get hardware Ethernet address from driver */
		if_pk->hwaddr = mallocw(EADDR_LEN);
		get_address(intno,pp->handle1,if_pk->hwaddr,EADDR_LEN);
		if(if_pk->hwaddr[0] & 1){
			printf("Warning! Interface '%s' has a multicast address:",
			 if_pk->name);
			printf(" (%s)\n",
			 (*if_pk->iftype->format)(tmp,if_pk->hwaddr));
		}
		break;
#ifdef	ARCNET
	case CL_ARCNET:
		pp->handle1 = access_type(intno,class,ANYTYPE,0,arcip,1,
			Pkvec[if_pk->dev]);
		pp->handle2 = access_type(intno,class,ANYTYPE,0,arcarp,1,
			Pkvec[if_pk->dev]);
		if_pk->output = anet_output;
		/* Get hardware ARCnet address from driver */
		if_pk->hwaddr = mallocw(AADDR_LEN);
		get_address(intno,pp->handle1,if_pk->hwaddr,AADDR_LEN);
		break;
#endif
	case CL_SERIAL_LINE:
		pp->handle1 = access_type(intno,class,ANYTYPE,0,NULL,0,
		 Pkvec[if_pk->dev]);
		setencap(if_pk,"SLIP");
		break;
#ifdef	AX25
	case CL_KISS:	/* Note that the raw routine puts on the command */
	case CL_AX25:
		pp->handle1 = access_type(intno,class,ANYTYPE,0,NULL,0,
		 Pkvec[if_pk->dev]);
		setencap(if_pk,"AX25");
		if_pk->hwaddr = mallocw(AXALEN);
		memcpy(if_pk->hwaddr,Mycall,AXALEN);
		break;
#endif
	case CL_SLFP:
		pp->handle1 = access_type(intno,class,ANYTYPE,0,NULL,0,
		 Pkvec[if_pk->dev]);
		setencap(if_pk,"SLFP");
		get_address(intno,pp->handle1,(uint8 *)&if_pk->addr,4);
		break;
	default:
		printf("Packet driver has unsupported class %u\n",class);
		free(if_pk->name);
		free(if_pk);
		return -1;
	}
	pp->class = class;
	if_pk->next = Ifaces;
	Ifaces = if_pk;
	cp = if_name(if_pk," tx");
	if_pk->txproc = newproc(cp,768,if_tx,if_pk->dev,if_pk,NULL,0);
	free(cp);

	return 0;
}
static long
access_type(
int intno,
int if_class,
int if_type,
int if_number,
uint8 *type,
unsigned typelen,
INTERRUPT (*receiver)()
){
	union REGS regs;
	struct SREGS sregs;

	segread(&sregs);
	regs.h.dl = if_number;		/* Number */
	sregs.ds = FP_SEG(type);	/* Packet type template */
	regs.x.si = FP_OFF(type);
	regs.x.cx = typelen;		/* Length of type */
	sregs.es = FP_SEG(receiver);	/* Address of receive handler */
	regs.x.di = FP_OFF(receiver);
	regs.x.bx = if_type;		/* Type */
	regs.h.ah = ACCESS_TYPE;	/* Access_type() function */
	regs.h.al = if_class;		/* Class */
	int86x(intno,&regs,&regs,&sregs);
	if(regs.x.cflag){
		Derr = regs.h.dh;
		return -1;
	} else
		return regs.x.ax;
}
static int
release_type(
int intno,
int handle
){
	union REGS regs;

	regs.x.bx = handle;
	regs.h.ah = RELEASE_TYPE;
	int86(intno,&regs,&regs);
	if(regs.x.cflag){
		Derr = regs.h.dh;
		return -1;
	} else
		return 0;
}
static int
send_pkt(
int intno,
uint8 *buffer,
unsigned length
){
	union REGS regs;
	struct SREGS sregs;

	segread(&sregs);
	sregs.ds = FP_SEG(buffer);
	sregs.es = FP_SEG(buffer); /* for buggy univation pkt driver - CDY */
	regs.x.si = FP_OFF(buffer);
	regs.x.cx = length;
	regs.h.ah = SEND_PKT;
	int86x(intno,&regs,&regs,&sregs);
	if(regs.x.cflag){
		Derr = regs.h.dh;
		return -1;
	} else
		return 0;
}
static int
driver_info(
int intno,
int handle,
int *version,
int *class,
int *type,
int *number,
int *basic
){
	union REGS regs;

	regs.x.bx = handle;
	regs.h.ah = DRIVER_INFO;
	regs.h.al = 0xff;
	int86(intno,&regs,&regs);
	if(regs.x.cflag){
		Derr = regs.h.dh;
		return -1;
	}
	if(version != NULL)
		*version = regs.x.bx;
	if(class != NULL)
		*class = regs.h.ch;
	if(type != NULL)
		*type = regs.x.dx;
	if(number != NULL)
		*number = regs.h.cl;
	if(basic != NULL)
		*basic = regs.h.al;
	return 0;
}
static int
get_address(
int intno,
int handle,
uint8 *buf,
int len
){
	union REGS regs;
	struct SREGS sregs;

	segread(&sregs);
	sregs.es = FP_SEG(buf);
	regs.x.di = FP_OFF(buf);
	regs.x.cx = len;
	regs.x.bx = handle;
	regs.h.ah = GET_ADDRESS;
	int86x(intno,&regs,&regs,&sregs);
	if(regs.x.cflag){
		Derr = regs.h.dh;
		return -1;
	}
	return 0;
}
static int
set_rcv_mode(
int intno,
int handle,
int mode
){
	union REGS regs;
	struct SREGS sregs;

	segread(&sregs);
	regs.x.cx = mode;
	regs.x.bx = handle;
	regs.h.ah = SET_RCV_MODE;
	int86x(intno,&regs,&regs,&sregs);
	if(regs.x.cflag){
		Derr = regs.h.dh;
		return -1;
	}
	return 0;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产午夜精品久久久久久免费视 | 午夜精品久久久久久久| 韩国三级在线一区| 欧美日韩综合一区| 国产精品传媒视频| 丰满亚洲少妇av| 日韩一区二区三区在线| 美腿丝袜亚洲三区| 日韩三级视频在线观看| 91在线观看污| 26uuu色噜噜精品一区二区| 日本不卡一区二区| 欧美视频一区在线| 日韩专区在线视频| 欧美成人午夜电影| 紧缚捆绑精品一区二区| 久久午夜电影网| 欧美日韩卡一卡二| 免费视频最近日韩| 一区二区三区四区亚洲| 欧美午夜寂寞影院| eeuss影院一区二区三区| 一区二区三区四区不卡在线 | 久久精品视频在线免费观看 | 欧美日韩欧美一区二区| 波多野结衣精品在线| 国内精品嫩模私拍在线| 全国精品久久少妇| 亚洲444eee在线观看| 日韩精品资源二区在线| 国产福利精品导航| 亚洲丝袜自拍清纯另类| 538在线一区二区精品国产| 精品一区二区在线视频| 天天操天天综合网| 亚洲国产精品久久久久婷婷884| 日韩三级高清在线| 91精品国产一区二区三区蜜臀| 国产乱对白刺激视频不卡| 亚洲精品久久久蜜桃| 精品伦理精品一区| 日韩三级中文字幕| 欧美zozozo| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 日韩亚洲欧美一区二区三区| 欧美日韩五月天| 欧美日韩精品一区二区三区 | 日韩福利视频网| 丝袜美腿亚洲一区| 日本欧美肥老太交大片| 裸体健美xxxx欧美裸体表演| 国产精品系列在线| 51精品秘密在线观看| 884aa四虎影成人精品一区| 欧美精品自拍偷拍动漫精品| 成人av网站免费观看| 免费成人在线影院| 激情综合色综合久久| 国产精一品亚洲二区在线视频| 国产成人综合亚洲91猫咪| 成人午夜私人影院| 经典三级一区二区| 成人激情黄色小说| 日本精品视频一区二区三区| 国产麻豆成人精品| 麻豆国产精品官网| 国产一区二区三区免费看| 成人高清视频在线观看| 99re这里只有精品视频首页| 欧美视频在线一区二区三区| 91精品国产手机| 久久精品亚洲精品国产欧美kt∨| 国产精品久久免费看| 一区二区国产视频| 美女脱光内衣内裤视频久久网站 | 国产999精品久久久久久| 99re这里只有精品首页| 欧美电影一区二区三区| 2021中文字幕一区亚洲| 亚洲日本电影在线| 亚洲一区欧美一区| 亚洲视频在线一区| 日本视频在线一区| 粉嫩高潮美女一区二区三区| 欧美性猛交xxxxxx富婆| 精品1区2区在线观看| 91精品在线一区二区| 久久精品一区二区三区不卡牛牛| 亚洲欧美电影一区二区| 日韩美女久久久| 91视频xxxx| 欧美久久久久久蜜桃| 国产欧美日韩卡一| 2021国产精品久久精品| 一区二区三区高清在线| 国产综合色视频| 在线观看不卡一区| 欧美日韩极品在线观看一区| 国产无遮挡一区二区三区毛片日本| 一区二区三区四区中文字幕| 国产.欧美.日韩| 51久久夜色精品国产麻豆| 亚洲欧洲三级电影| 亚洲一区二区综合| 成人美女视频在线观看18| 911国产精品| 一区二区在线观看视频在线观看| 狠狠色狠狠色综合系列| 欧美日韩在线电影| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆 | 日本视频中文字幕一区二区三区| 99久久精品国产网站| 久久青草国产手机看片福利盒子 | 久久久不卡影院| 五月婷婷综合在线| 色哟哟国产精品| 在线播放/欧美激情| 亚洲欧美另类图片小说| 国产suv精品一区二区三区| 精品人伦一区二区色婷婷| 婷婷开心激情综合| 色久综合一二码| 亚洲欧洲精品一区二区精品久久久| 911精品产国品一二三产区| 亚洲综合另类小说| 99久精品国产| 中文字幕乱码亚洲精品一区| 亚洲美女免费视频| av电影在线不卡| 中文字幕av不卡| 国产成人啪午夜精品网站男同| 精品国产1区2区3区| 九色porny丨国产精品| 日韩欧美资源站| 免费观看日韩电影| 欧美一区二区视频在线观看2022| 午夜久久久影院| 欧美日产在线观看| 午夜婷婷国产麻豆精品| 欧美日韩亚洲综合在线| 午夜精品久久久久久久99水蜜桃| 欧美三区免费完整视频在线观看| 亚洲午夜久久久久久久久久久| 91麻豆国产精品久久| 亚洲女同女同女同女同女同69| 91美女在线看| 亚洲国产精品视频| 日韩视频中午一区| 蜜臀av性久久久久蜜臀aⅴ流畅 | 亚洲亚洲精品在线观看| 欧美色图免费看| 日韩黄色在线观看| 日韩欧美电影在线| 国产精品18久久久久久vr| 国产日韩欧美麻豆| 97精品国产97久久久久久久久久久久| 亚洲欧美综合另类在线卡通| 在线中文字幕一区| 日韩中文字幕一区二区三区| 欧美大片一区二区三区| 国产大陆精品国产| 亚洲免费观看高清完整版在线观看| 在线观看中文字幕不卡| 日日夜夜精品免费视频| 久久综合九色综合欧美98| 不卡视频一二三| 亚洲一区二区欧美| 日韩精品一区二区三区四区| 成人一区二区三区| 亚洲免费观看高清在线观看| 91精品国产乱| 国产成人在线色| 一区二区三区国产| 精品久久久久久最新网址| 成人一区二区视频| 亚洲国产欧美在线| 久久免费电影网| 在线视频欧美区| 国产真实精品久久二三区| 国产精品精品国产色婷婷| 欧美三电影在线| 国产mv日韩mv欧美| 视频一区二区中文字幕| 国产欧美日韩视频一区二区| 欧美又粗又大又爽| 国产精品一区二区x88av| 一区二区久久久| 亚洲国产精华液网站w| 欧美美女黄视频| 成人av第一页| 麻豆成人久久精品二区三区小说| 亚洲欧美怡红院| 欧美成人伊人久久综合网| 色悠久久久久综合欧美99| 国内成+人亚洲+欧美+综合在线 | 国产99久久久精品| 七七婷婷婷婷精品国产| 亚洲精品菠萝久久久久久久| 精品欧美久久久| 欧美日韩一区不卡|