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

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

?? 網(wǎng)口程序?qū)嵗?txt

?? 關(guān)于數(shù)據(jù)發(fā)送方面和接收差不多,在上層協(xié)議放置好數(shù)據(jù)到mbuf鏈后,調(diào)用el_start函數(shù),該函數(shù)把mbuf鏈中 的數(shù)據(jù)放置到本塊網(wǎng)卡的發(fā)送隊列緩沖el_pktbuf中,然后再調(diào)用el_xmit函
?? TXT
?? 第 1 頁 / 共 3 頁
字號:
if (bpf)             bpf為真,即加入了BSD包過濾 
bpfattach(ifp, DLT_EN10MB, sizeof(struct ether_header)); 
if (ng_ether_attach_p != NULL) 
(*ng_ether_attach_p)(ifp); 
} 

*/ 
printf("el%d: 3c501 address %6D\n",idev->;id_unit, 
  sc->;arpcom.ac_enaddr, ":"); 

dprintf(("el_attach() finished.\n")); 
return(1); 
} 

/* 該例程重設(shè)接口. 在el_watchdog()中調(diào)用,因為watchdog不在本驅(qū)動程序中支持,所以從不被調(diào)用*/ 
static void  
el_reset(xsc)/*上面的一個函數(shù),重設(shè)硬件*/ 
void *xsc; 
{ 
struct el_softc *sc = xsc; 
int s; 

dprintf(("elreset()\n")); 
s = splimp();/*關(guān)網(wǎng)絡(luò)中斷*/ 
el_stop(sc);/*下面的一個函數(shù)*/ 
el_init(sc);/*重新初始化卡*/ 
splx(s);/*開網(wǎng)絡(luò)中斷*/ 
} 
/*停止接口,在el_ioctl()和el_reset()中調(diào)用*/ 
static void el_stop(xsc) 
void *xsc; 
{ 
struct el_softc *sc = xsc; 

outb(sc->;el_base+EL_AC,0);/*用0寫輔助命令寄存器*/ 
} 

/* 初始化接口.  */ 
static void  
el_init(xsc) 
void *xsc; 
{ 
struct el_softc *sc = xsc; 
struct ifnet *ifp; 
int s; 
u_short base; 

ifp = &sc->;arpcom.ac_if;/*定位ifnet結(jié)構(gòu)*/ 
base = sc->;el_base;/*網(wǎng)卡基本I/O地址*/ 

/* 如果地址不知道,什么也不做. */ 
if(TAILQ_EMPTY(&ifp->;if_addrhead)) /* 在if.c中的if_attach例程 
中已經(jīng)填充,由el_attach調(diào)用 
ether_attach時再調(diào)用if_attach */ 
return; 

s = splimp();/*關(guān)網(wǎng)絡(luò)中斷*/ 

/* 重設(shè)板卡. */ 
dprintf(("Resetting board...\n")); 
el_hardreset(sc);/*該函數(shù)在上面,重設(shè)硬件*/ 

/* 設(shè)置接收寄存器 rx */ 
dprintf(("Configuring rx...\n")); 
if(ifp->;if_flags & IFF_PROMISC)    /*是混雜模式?EL_RXC是0X6接收命令寄存器*/ 
outb(base+EL_RXC,(EL_RXC_PROMISC|EL_RXC_AGF|EL_RXC_DSHORT|EL_RXC_DDRIB|EL_RXC_DOFLOW)); 
else 
outb(base+EL_RXC,(EL_RXC_ABROAD|EL_RXC_AGF|EL_RXC_DSHORT|EL_RXC_DDRIB|EL_RXC_DOFLOW)); 
outb(base+EL_RBC,0);/*接收緩沖寄存器清0*/ 

/* 設(shè)置傳輸寄存器 TX */ 
dprintf(("Configuring tx...\n")); 
outb(base+EL_TXC,0); 

/* 開始接收 */ 
dprintf(("Starting reception...\n")); 
outb(base+EL_AC,(EL_AC_IRQE|EL_AC_RX));/*EL_AC_IRQE是IRQ enable(可用) EL_AC_RX為接收寄存器*/ 

/* 設(shè)置一些開始使用的標志 */ 
ifp->;if_flags |= IFF_RUNNING;/*加上正在運行標志*/ 
ifp->;if_flags &= ~IFF_OACTIVE;/*去掉正在傳輸標志*/ 

/* 調(diào)用輸出. */ 
el_start(ifp); 

splx(s);/*開網(wǎng)絡(luò)中斷*/ 
} 

/* 開始在接口上輸出.從隊列中得到包并輸出他們,在輸出中,留出接收用一 
部分時間,即打開中斷再關(guān)閉中斷,這樣使接口接到的一些數(shù)據(jù)包不會丟失. 
  
 */ 
static void 
el_start(struct ifnet *ifp) 
{ 
struct el_softc *sc; 
u_short base; 
struct mbuf *m, *m0; 
int s, i, len, retries, done; 

/*  定位softc結(jié)構(gòu)的指針*/ 
sc = ifp->;if_softc; 
base = sc->;el_base;/*基地址在輸入輸出指令時常要用到*/ 

dprintf(("el_start()...\n")); 
s = splimp();/*因為下面涉及到if_flags的操作,所以要關(guān)閉網(wǎng)絡(luò)中斷*/ 

/* 如果輸出正在進行,則退出 */ 
if(sc->;arpcom.ac_if.if_flags & IFF_OACTIVE) 
return; 
sc->;arpcom.ac_if.if_flags |= IFF_OACTIVE;/*加上輸出正在進行傳輸標志*/ 

/* 主循環(huán) 
 */ 
while(1) {/*唯一出口是準備傳輸?shù)臄?shù)據(jù)為空,即m0==NULL時*/ 
/* 從隊列中移出下一數(shù)據(jù)包到m0中,請看頭文件if_var.h 
#define IF_DEQUEUE(ifq, m) { \ 
(m) = (ifq)->;ifq_head; \           ifq是一mbuf指針隊列,把第一個mbuf指針放到m中 
if (m) { \ 
if (((ifq)->;ifq_head = (m)->;m_nextpkt) == 0) \重排隊列         
(ifq)->;ifq_tail = 0; \ 
(m)->;m_nextpkt = 0; \ 
(ifq)->;ifq_len--; \ 
} \ 
} 


*/ 
IF_DEQUEUE(&sc->;arpcom.ac_if.if_snd,m0);/*    &sc->;arpcom.ac_if.if_snd指向發(fā)送隊列, 
該宏取出第一個mubf的指針放到m0中,看上面的說明. 
這是數(shù)據(jù)結(jié)構(gòu)的好教材*/ 

/* 如果發(fā)送緩沖區(qū)指針為空,即已經(jīng)發(fā)送完,則退出,此是該無窮循環(huán)的唯一出口. */ 
if(m0 == NULL) { 
sc->;arpcom.ac_if.if_flags &= ~IFF_OACTIVE;/*出去前當然要去掉輸出正在進行標志*/ 
splx(s); 
return; 
} 

/* 關(guān)閉接收 */ 
outb(base+EL_AC,EL_AC_HOST);/*EL_AC_HOST為系統(tǒng)總線可訪問緩沖,即系統(tǒng)總線網(wǎng)卡要用 */ 
outb(base+EL_RBC,0);/*接收緩沖寄存器清0*/ 

/* 拷貝mbuf中的數(shù)據(jù)到softc結(jié)構(gòu)定義的成員el_pktbuf中,緩沖大小是EL_BUFSIZ即2048. */ 
len = 0; 
for(m = m0; m != NULL; m = m->;m_next) {   /* m0是一mbuf指針,也是一mbuf鏈的第一個,此 
次要發(fā)送的是一mbuf鏈,不是一單個mbuf*/ 
if(m->;m_len == 0) 
continue; 
bcopy(mtod(m,caddr_t),sc->;el_pktbuf+len,m->;m_len);/*m->;len是該mbuf鏈的數(shù)據(jù)長度, 
sc->;el_pktbuf是該卡的發(fā)送臨時緩沖,要發(fā) 
送的數(shù)據(jù)在這集中,然后傳送到網(wǎng)卡上,太費 
時間了,應(yīng)該直接放置到網(wǎng)卡的存儲器中.*/ 
len += m->;m_len; /*len是這次要發(fā)送的總數(shù)*/ 
} 
m_freem(m0);                                /*釋放該mbuf鏈*/ 

len = max(len,ETHER_MIN_LEN);  /*ETHER_MIN_LEN是發(fā)送的最小長度*/ 

/* 如果有BPF,就交給BPF驗證 */ 
if(sc->;arpcom.ac_if.if_bpf) 
bpf_tap(&sc->;arpcom.ac_if, sc->;el_pktbuf, len);/*你當然可以在這寫一點自己的驗證過程*/ 

/* 傳送數(shù)據(jù)包到板卡 */ 
dprintf(("el: xfr pkt length=%d...\n",len)); 
i = EL_BUFSIZ - len;/*EL_BUFSIZ=2048字節(jié)*/ 
outb(base+EL_GPBL,(i & 0xff));       /*告訴發(fā)送的長度*/ 
outb(base+EL_GPBH,((i>;>;8)&0xff)); 
outsb(base+EL_BUF,sc->;el_pktbuf,len);/*傳輸數(shù)據(jù)到板卡*/ 

/* 開始發(fā)送數(shù)據(jù)包 */ 
retries=0;/*下面做循環(huán)用的,在發(fā)不出去時,循環(huán)15次*/ 
done=0;   /*done=1時發(fā)送成功了*/ 
while(!done) { 
if(el_xmit(sc,len)) { /* 調(diào)用發(fā)送例程,其實只要傳送base就可以了 */ 
done = -1; 
break; 
} 
/* 檢查輸出后的狀態(tài),如果你要對watchdog支持,可以在這加上代碼,即在5毫秒沒發(fā)送出去,就調(diào)用el_watchdog() */ 
i = inb(base+EL_TXS); 
dprintf(("tx status=0x%x\n",i)); 
if(!(i & EL_TXS_READY)) {            /* 如果傳輸狀態(tài)寄存器不是準備接受新幀就緒 */ 
dprintf(("el: err txs=%x\n",i));  /*那就是出錯了*/ 
sc->;arpcom.ac_if.if_oerrors++; 
if(i & (EL_TXS_COLL|EL_TXS_COLL16)) {/*網(wǎng)絡(luò)數(shù)據(jù)包碰撞*/ 
if((!(i & EL_TXC_DCOLL16)) && retries < 15) {/*做循環(huán)的目的是為了有錯誤時可重傳15次*/ 
retries++; 
outb(base+EL_AC,EL_AC_HOST);/*EL_AC_HOST為系統(tǒng)總線可訪問緩沖 */ 
} 
} 
else 
done = 1; 
} 
else { 
sc->;arpcom.ac_if.if_opackets++;/*統(tǒng)計用的,說明該卡成功發(fā)送一包*/ 
done = 1; 
} 
} 
if(done == -1)  /* 包沒有傳輸(失敗) */ 
continue; 

/* 現(xiàn)在給板卡一個機會接收.注意:在linux中曾經(jīng)ALEN先生批評此卡好恐怖(他說要進博物館,哈哈),并說在傳輸時 
會丟失進來的數(shù)據(jù)包,我查看了LINUX的驅(qū)動程序,確實是這樣,但在FreeBSD中,給了一個機會,由此可證明他的 
關(guān)于"丟失包的說法不一定成立",但關(guān)于一個緩沖和一次只能發(fā)送一數(shù)據(jù)包的說法確實是真的,還有多播方面也 
不支持,我也希望大家最好不要去買這東西,和NE2000,PCI中的RTL8139芯片的網(wǎng)卡一樣,性能太差了.*/ 
(void)inb(base+EL_AS);/*讀輔助狀態(tài)寄存器*/ 
outb(base+EL_AC,(EL_AC_IRQE|EL_AC_RX));/* 用IRQ(中斷)使能和接收 寫輔助命令寄存器*/ 
splx(s); 
/* 這有可能接收到中斷(包到達) */ 
s = splimp(); 
} 
} 

/* 這是真正的傳輸包,由el_start()調(diào)用 
 */ 
static int 
el_xmit(struct el_softc *sc,int len) 
{ 
int gpl; 
int i; 

gpl = EL_BUFSIZ - len; 
dprintf(("el: xmit...")); 
outb((sc->;el_base)+EL_GPBL,(gpl & 0xff)); 
outb((sc->;el_base)+EL_GPBH,((gpl>;>;8)&0xff)); 
outb((sc->;el_base)+EL_AC,EL_AC_TXFRX);/*真正的傳送指令*/ 
i = 20000; 
while((inb((sc->;el_base)+EL_AS) & EL_AS_TXBUSY) && (i>;0))/*如果傳送還在忙,循環(huán)20000次等待*/ 
i--; 
if(i == 0) {/*這里有一個bug,大家發(fā)現(xiàn)沒有,i到了0時也有可能傳送成功,解決辦法是把(i>;0)這條件放到前面*/ 
/*我稍微講一下C,在編譯C程序時,象while ( (a>;b) && (i>;0) )時,是這個樣子 
top:if a>;b then 
if i>;0 then 
執(zhí)行體 
endif 
endif 
goto top 
也就是說,當i=0時候,inb((sc->;el_base)+EL_AS)這指令還會執(zhí)行,也有可能這時候傳送完成了,而下面有給打出 
一個什么"tx not ready"的東東,而且返回失敗,有得重新傳送一次. 
*/ 
dprintf(("tx not ready\n")); 
sc->;arpcom.ac_if.if_oerrors++; 
return(-1); 
} 
dprintf(("%d cycles.\n",(20000-i))); 
return(0);/*成功*/ 
} 

/* 傳遞包到更高一級協(xié)議處理,即ether_input()例程.由elintr()調(diào)用 */ 
static __inline void 
elread(struct el_softc *sc,caddr_t buf,int len) 
{ 
register struct ether_header *eh; 
struct mbuf *m; 

eh = (struct ether_header *)buf;/*從buf中分出以太網(wǎng)頭部*/ 

/* 
 * elget函數(shù)是把包放入一mbuf緩沖鏈中 
 */ 
m = elget(buf,len,&sc->;arpcom.ac_if); 
if(m == 0)/*出錯了*/ 
return; 

ether_input(&sc->;arpcom.ac_if,eh,m);/*傳輸給上一層的包括ifnet結(jié)構(gòu),以太網(wǎng)頭部,一mbuf*/ 
} 

/* 中斷例程 */ 
static void 
elintr(int unit) 

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
777a∨成人精品桃花网| 一区二区三区四区乱视频| 国产亚洲一区字幕| 亚洲一区二区av在线| 国产成人精品一区二区三区网站观看| 日本精品视频一区二区| 精品福利视频一区二区三区| 夜夜嗨av一区二区三区中文字幕| 国产精品系列在线观看| 欧美一区午夜精品| 亚洲午夜影视影院在线观看| 成人h动漫精品一区二区| 欧美一区二区三区爱爱| 亚洲国产精品人人做人人爽| 成人激情校园春色| 久久精品一区蜜桃臀影院| 奇米精品一区二区三区在线观看 | 91香蕉视频污| 久久免费的精品国产v∧| 日韩中文字幕一区二区三区| 在线亚洲一区二区| 亚洲欧美在线aaa| 国产成人精品午夜视频免费| 欧美大片在线观看一区二区| 日本美女视频一区二区| 欧美日韩dvd在线观看| 亚洲男人天堂av网| 91在线观看免费视频| 国产精品久久久一本精品| 成人精品视频一区| 国产精品国产三级国产普通话99| 成人高清视频在线| 国产精品久久久久久久久免费桃花 | 久久精品久久99精品久久| 欧美一区日韩一区| 乱中年女人伦av一区二区| 日韩欧美高清一区| 国产在线观看免费一区| 26uuu精品一区二区在线观看| 久久99久久99| 国产日韩欧美亚洲| 波多野结衣亚洲| 一区二区三区中文字幕精品精品| 在线中文字幕一区| 日本一不卡视频| 久久综合国产精品| 春色校园综合激情亚洲| 亚洲视频在线观看三级| 欧美日韩一区二区在线观看视频| 天天综合日日夜夜精品| 日韩精品资源二区在线| 粉嫩13p一区二区三区| 亚洲精品视频在线观看网站| 欧美日韩国产首页| 免费观看30秒视频久久| 亚洲国产电影在线观看| 欧洲精品中文字幕| 精品在线免费观看| 亚洲色欲色欲www| 欧美精品三级在线观看| 国产乱淫av一区二区三区 | 亚洲永久精品国产| 日韩亚洲欧美高清| eeuss国产一区二区三区| 午夜电影久久久| 国产精品婷婷午夜在线观看| 91成人看片片| 国产精品一区久久久久| 亚洲国产精品麻豆| 久久久久青草大香线综合精品| 色综合天天综合在线视频| 久久99国产精品麻豆| 亚洲蜜桃精久久久久久久| 精品粉嫩aⅴ一区二区三区四区| caoporn国产一区二区| 美腿丝袜亚洲三区| 亚洲午夜精品久久久久久久久| 久久综合久久综合久久| 色老汉一区二区三区| 国内精品在线播放| 亚洲成人午夜影院| 国产精品狼人久久影院观看方式| 欧美一区二区美女| 日本精品一级二级| 国产91清纯白嫩初高中在线观看| 视频一区在线播放| 一区二区三区在线观看动漫| 国产欧美精品日韩区二区麻豆天美| 欧美三级日韩三级国产三级| jizzjizzjizz欧美| 国产尤物一区二区在线| 天天爽夜夜爽夜夜爽精品视频| 成人欧美一区二区三区| 欧美激情一区二区三区四区| 欧美va天堂va视频va在线| 欧美日韩一区成人| 色欧美片视频在线观看在线视频| 成人中文字幕在线| 国产精品综合在线视频| 国内欧美视频一区二区| 日本特黄久久久高潮| 日韩一区欧美二区| 亚洲成人自拍偷拍| 亚洲自拍欧美精品| 亚洲免费观看高清完整版在线观看熊| 国产精品日日摸夜夜摸av| 久久新电视剧免费观看| 欧美不卡视频一区| 日韩午夜激情视频| 日韩一级高清毛片| 日韩视频免费观看高清在线视频| 91精品免费观看| 欧美一级二级在线观看| 欧美一区二区福利在线| 日韩欧美国产午夜精品| 欧美一级黄色录像| 精品国产免费一区二区三区香蕉| 欧美日本精品一区二区三区| 欧美日韩国产小视频在线观看| 欧美亚洲国产bt| 69p69国产精品| 精品毛片乱码1区2区3区| 欧美va亚洲va香蕉在线| 国产婷婷色一区二区三区四区| 国产日韩亚洲欧美综合| 一色屋精品亚洲香蕉网站| 亚洲免费资源在线播放| 亚洲综合999| 麻豆精品在线播放| 国产成人在线视频免费播放| 成人激情视频网站| 色婷婷av一区| 91精品欧美一区二区三区综合在 | 色悠悠久久综合| 欧美日韩免费一区二区三区 | 精品亚洲国内自在自线福利| 国产做a爰片久久毛片| 成人永久免费视频| 色婷婷综合久久久久中文一区二区 | 欧美精品一区二区三区蜜臀| 中文字幕乱码日本亚洲一区二区| 亚洲色图在线播放| 视频一区二区三区在线| 国产成人av福利| 欧美性xxxxxxxx| 欧美美女一区二区三区| 国产欧美精品在线观看| 亚洲国产欧美日韩另类综合| 九色porny丨国产精品| av亚洲精华国产精华| 欧美日韩激情一区| 国产精品久久久久四虎| 日本三级亚洲精品| 99精品欧美一区二区蜜桃免费| 在线不卡a资源高清| 亚洲国产高清在线观看视频| 五月天久久比比资源色| 成人激情图片网| 欧美成人午夜电影| 亚洲成a人片在线观看中文| 国产激情一区二区三区桃花岛亚洲| 在线日韩av片| 国产日韩在线不卡| 久热成人在线视频| 欧美日本国产视频| 国产精品久久久久久久久快鸭 | 欧美大胆人体bbbb| 亚洲人精品一区| 国产精品18久久久久久久久| 欧美日韩国产三级| 一区二区三区久久| 成人精品一区二区三区四区| 精品成人a区在线观看| 日韩经典中文字幕一区| 91麻豆精东视频| 国产精品久久精品日日| 国产一区在线精品| 日韩欧美国产电影| 偷拍亚洲欧洲综合| 欧美亚洲国产一区在线观看网站| 亚洲国产精品二十页| 国产精一品亚洲二区在线视频| 欧美激情艳妇裸体舞| 极品少妇xxxx精品少妇偷拍| 欧美老人xxxx18| 一区二区三区av电影| 成年人国产精品| 国产精品初高中害羞小美女文| 国产激情一区二区三区| 国产亚洲欧美日韩在线一区| 美女一区二区视频| 日韩免费高清av| 麻豆免费精品视频| 精品久久人人做人人爽| 激情欧美一区二区| 26uuu精品一区二区在线观看| 久久精工是国产品牌吗| 精品成人一区二区三区四区| 国产一区二区美女诱惑| 中文字幕高清不卡|