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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 網口程序實例.txt

?? 關于數據發送方面和接收差不多,在上層協議放置好數據到mbuf鏈后,調用el_start函數,該函數把mbuf鏈中 的數據放置到本塊網卡的發送隊列緩沖el_pktbuf中,然后再調用el_xmit函
?? TXT
?? 第 1 頁 / 共 3 頁
字號:
{ 
register struct el_softc *sc; 
register int base; 
int stat, rxstat, len, done; 

/* 尋址softc和I/O基地址 */ 
sc = &el_softc[unit]; 
base = sc->;el_base; 

dprintf(("elintr: ")); 

/* 檢查板卡狀態 */ 
stat = inb(base+EL_AS); 
if(stat & EL_AS_RXBUSY) {/*接收忙*/ 
(void)inb(base+EL_RXC);/*讀接收命令寄存器*/ 
outb(base+EL_AC,(EL_AC_IRQE|EL_AC_RX));/* 用IRQ(中斷)使能和接收 寫輔助命令寄存器*/ 
return; 
} 

done = 0; 
while(!done) { 
rxstat = inb(base+EL_RXS); 
if(rxstat & EL_RXS_STALE) {/*EL_RXS_STALE代表接受狀態沒有改變*/ 
(void)inb(base+EL_RXC);/*讀接收命令寄存器*/ 
outb(base+EL_AC,(EL_AC_IRQE|EL_AC_RX));/* 用IRQ(中斷)使能和接收 寫輔助命令寄存器*/ 
return; 
} 

/* 如果這有一個溢出發生,重新初始化板卡. */ 
if(!(rxstat & EL_RXS_NOFLOW)) { 
dprintf(("overflow.\n")); 
el_hardreset(sc); 
/* 使板卡回到接收模式 */ 
if(sc->;arpcom.ac_if.if_flags & IFF_PROMISC) 
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)); 
(void)inb(base+EL_AS);/*讀輔助狀態寄存器*/ 
outb(base+EL_RBC,0);/*清除接收緩沖*/ 
(void)inb(base+EL_RXC);/*讀接收命令寄存器*/ 
outb(base+EL_AC,(EL_AC_IRQE|EL_AC_RX));/* 用IRQ(中斷)使能和接收 寫輔助命令寄存器*/ 
return; 
} 

/* 到這應該是進來了一數據包 */ 
len = inb(base+EL_RBL); 
len |= inb(base+EL_RBH) << 8;/*包長度的高低位組合為該包的長度*/ 
dprintf(("receive len=%d rxstat=%x ",len,rxstat)); 
outb(base+EL_AC,EL_AC_HOST);/*EL_AC_HOST為系統總線可訪問緩沖 */ 

/* 如果包太短或太長,回到接收模式并返回 
 */ 
if((len <= sizeof(struct ether_header)) || (len >; ETHER_MAX_LEN)) {/*如果包小于以太網頭部的長度或大于最大長度*/ 
if(sc->;arpcom.ac_if.if_flags & IFF_PROMISC)/*為重置硬件準備if_flags*/ 
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)); 
(void)inb(base+EL_AS);/*讀輔助狀態寄存器*/ 
outb(base+EL_RBC,0);/*清除接收緩沖*/ 
(void)inb(base+EL_RXC);/*讀接收命令寄存器*/ 
outb(base+EL_AC,(EL_AC_IRQE|EL_AC_RX));/* 用IRQ(中斷)使能和接收 寫輔助命令寄存器*/ 
return; 
} 

sc->;arpcom.ac_if.if_ipackets++;/*統計使用,說明接收包總數*/ 

/* 拷貝數據到我們的緩沖 */ 
outb(base+EL_GPBL,0); 
outb(base+EL_GPBH,0); 
insb(base+EL_BUF,sc->;el_pktbuf,len);/*從端口讀一串數據到指定地址()*/ 
outb(base+EL_RBC,0); 
outb(base+EL_AC,EL_AC_RX); 
dprintf(("%6D-->;",sc->;el_pktbuf+6,":"));/*也放置到el_pktbuf中,發送也放在他中,在發送時有一個開中斷接數據包的過程 
不過那時候el_pktbuf中沒有數據,不會相互影響.*/ 
dprintf(("%6D\n",sc->;el_pktbuf,":")); 

/* 把數據傳遞到上一層 */ 
len -= sizeof(struct ether_header); 
elread(sc,(caddr_t)(sc->;el_pktbuf),len); 

/* 對狀態? */ 
stat = inb(base+EL_AS); 

/* 如果忙不為真則繼續 */ 
if(!(stat & EL_AS_RXBUSY)) 
dprintf(("<rescan>; ")); 
else 
done = 1; /*退出循環*/ 
} 

(void)inb(base+EL_RXC); 
outb(base+EL_AC,(EL_AC_IRQE|EL_AC_RX)); 
return; 
} 

/* 
 * 從網卡上下載數據包,len是數據的長度,本地以太網頭部被分開 
 */ 
static struct mbuf * 
elget(buf, totlen, ifp)/*由elread調用,buf是指向sc->;el_pktbuf緩沖區,并且數據已經存在, 
totlen是整個數據包長度-sizeof(struct ether_header)即以太網頭部的長度*/ 
        caddr_t buf; 
        int totlen; 
        struct ifnet *ifp; 
{ 
        struct mbuf *top, **mp, *m; 
        int len; 
        register caddr_t cp; 
        char *epkt; 

        buf += sizeof(struct ether_header);/*調用前buf指向...請看下圖 
   |--------------------------------整個數據----------------------------------------------|  
   |--ether頭部14字節----|--------IP或ARP或其他協議頭部及數據-----------------------------| 
   ^ 
調用前buf指向這 
                         ^ 
執行之后buf指向這 
        因為在向上傳遞數據的過程是一層一層的剝,在本次要剝掉ether_header即以太網頭部 
*/ 
        cp = buf;/*放入寄存器中*/ 
        epkt = cp + totlen;/*epkt在計算后指向數據的尾部*/ 

        MGETHDR(m, M_DONTWAIT, MT_DATA);/*得到一標記了頭部的mbuf*/ 
/*MGETHDR宏說明 
#define MGETHDR(m, how, type) do { \ 
struct mbuf *_mm; \ 
int _mhow = (how); \ 
int _mtype = (type); \ 
int _ms = splimp(); \屏蔽中斷 
\ 
if (mmbfree == NULL) \mmbfree是內存管理初始化時的全局變量,意思是還有可用的內存塊嗎? 
(void)m_mballoc(1, _mhow); \沒有就分配一個,1代表分配一個MSIZE大小的塊,該函數調用kmem_malloc 
\核心內存分配函數,返回的可用mbuf指針在mmbfree中 
_mm = mmbfree; \ 
if (_mm != NULL) { \ 
mmbfree = _mm->;m_next; \如果上面的m_mballoc函數執行了,_mm->;m_next肯定為NULL 
mbtypes[MT_FREE]--; \ 
_mm->;m_type = _mtype; \看上下文可知,_mtype是MT_DATA 
mbtypes[_mtype]++; \ 
_mm->;m_next = NULL; \從這開始是初始化mbuf一些指針 
_mm->;m_nextpkt = NULL; \ 
_mm->;m_data = _mm->;m_pktdat; \ 
_mm->;m_flags = M_PKTHDR; \加入mbuf鏈首標志,即該鏈的第一個包,該宏和MGET的不同之處 
_mm->;m_pkthdr.rcvif = NULL; \ 
_mm->;m_pkthdr.csum_flags = 0; \ 
_mm->;m_pkthdr.aux = (struct mbuf *)NULL; \ 
(m) = _mm; \ 
splx(_ms); \恢復中斷 
} else { \ 
splx(_ms); \ 
_mm = m_retryhdr(_mhow, _mtype); \再來一次MGETHDR,不過m_retryhdr已經定義為空,防止死循環 
if (_mm == NULL && _mhow == M_WAIT) \還為空 
(m) = m_mballoc_wait(MGETHDR_C, _mtype); \強制用阻塞型 
else \ 
(m) = _mm; \ 
} \ 
} while (0) 

*/ 

        if (m == 0) 
                return (0); 
        m->;m_pkthdr.rcvif = ifp;/*指向接收該包的網絡卡的ifp指針,后面好多協議要用到他*/ 
        m->;m_pkthdr.len = totlen;/*已經把以太網頭部剝離,數據長度沒算他了*/ 
        m->;m_len = MHLEN;/*該出是鏈首,所以該mbuf的長度是MHLEN,而不是MLEN*/ 
/* 這就是MHLEN 
#define MSIZE 256 /*  mbuf的大小 * 
#define MLEN (MSIZE - sizeof(struct m_hdr)) /* 普通數據區的長度* 
#define MHLEN (MLEN - sizeof(struct pkthdr)) /* 鏈首數據區的長度 


*/ 
        top = 0; 
        mp = &amp; 
        while (totlen >; 0) { 
                if (top) {/*如果不是鏈的第一個*/ 
                        MGET(m, M_DONTWAIT, MT_DATA);/*MGET和MGETHDR差不多,只不過少一個m_flags = M_PKTHDR*/ 
                        if (m == 0) { 
                                m_freem(top); 
                                return (0); 
                        } 
                        m->;m_len = MLEN;/*非鏈首mbuf的長度為MLEN,這個if(top)就代表不是鏈首mbuf*/ 
                }/*如果跳過了上面哪個if,那肯定是鏈的第一個mbuf,并且m已經在循環外就分配好了.*/ 
                len = min(totlen, epkt - cp);/*epkt在計算后指向數據的尾部,cp指向首部*/ 
                if (len >;= MINCLSIZE) {/*#define MINCLSIZE (MHLEN + 1)  這意味著只要數據大于MHLEN,就要分配一個簇*/ 
                        MCLGET(m, M_DONTWAIT);/*看到宏展開后好恐怖,有空我再說一說*/ 
                        if (m->;m_flags & M_EXT)/*在mbuf中注明是擴展型mbuf(即帶有簇)*/ 
                                m->;m_len = len = min(len, MCLBYTES);/*如果大于2048則先裝2048吧,裝的語句在下面*/ 
                        else 
                                len = m->;m_len; 
                } else { 
                        /* 
                         * 如果到這了,就意味著要么這個包小于MINCLSIZE,要么是后面一點尾巴且小于MINCLSIZE. 
                         */ 
                        if (len < m->;m_len) { 
                                if (top == 0 && len + max_linkhdr <= m->;m_len) 
                                        m->;m_data += max_linkhdr; 
                                m->;m_len = len; 
                        } else 
                                len = m->;m_len; 
                } 
                bcopy(cp, mtod(m, caddr_t), (unsigned)len);/*第一次數據移動,費時的操作*/ 
                cp += len; 
                *mp = m; 
                mp = &m->;m_next;/*把mbuf鏈接起來*/ 
                totlen -= len; 
                if (cp == epkt) 
                        cp = buf; 
        } 
        return (top);/*返回裝填數據的mbuf鏈首*/ 
}/*總結:在該函數中,所做的事情非常費時,主要是做內存的申請,大批數據的拷貝,如果象NFS傳送數據,會出現大量的簇的申請和大量 
   簇的數據的拷貝,一次循環需要拷貝2048個32位的雙字.如果是發給本機的,那還行,如果是本機做為橋轉發及防活墻,即數據不上傳 
   到IP層處理,那么可以直接改寫mbuf的分配方案,根據不同的網絡流量可初始化一定數量的大容量的緩沖鏈(可以以一個以太網的整 
   頁數來分配,如是100M以太網是1514字節,可分配2048字節,是有一點浪費,但性能可提高,sc->;el_pktbuf可變為一隊列,用來和其他 
   網卡的接收隊列進行數據交換.這意味著光數據進入就少拷貝一次,性能將大大提高,目前我正在研究中.)*/ 

/* 
 * 處理一個IOCTL請求.  
 */ 
static int 
el_ioctl(ifp, command, data) 
register struct ifnet *ifp; 
u_long command;  /*IOCTL的命令*/ 
caddr_t data; 
{ 
int s, error = 0; 

s = splimp();    /*先關閉網絡中斷*/ 

switch (command) { 
        case SIOCSIFADDR: 
case SIOCGIFADDR: 
case SIOCSIFMTU: 
error = ether_ioctl(ifp, command, data); 
break; 

case SIOCSIFFLAGS: 
/* 
 * 如果接口已經DOWN但FLAG還有RUNNING, 那么先停止它 
 */ 
if (((ifp->;if_flags & IFF_UP) == 0) && 
    (ifp->;if_flags & IFF_RUNNING)) { 
el_stop(ifp->;if_softc); 
ifp->;if_flags &= ~IFF_RUNNING;/*在FALG中去掉IFF_RUNNING標志*/ 
} else { 
/* 
 * 如果接口已經DOWN,FLAG沒有RUNNING, 只要調用el_init例程 
 */ 
if ((ifp->;if_flags & IFF_UP) && 
         ((ifp->;if_flags & IFF_RUNNING) == 0)) 
el_init(ifp->;if_softc); 
} 
break; 
default: 
error = EINVAL; 
} 
(void) splx(s); 
return (error); 
} 

/* 一般是數據在規定的時間內沒有發出后被調用的程序,目前該驅動程序不支持 */ 
static void 
el_watchdog(struct ifnet *ifp) 
{ 
log(LOG_ERR,"el%d: device timeout\n", ifp->;if_unit); 
ifp->;if_oerrors++; 
el_reset(ifp->;if_softc); 
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美系列一区二区| 色8久久精品久久久久久蜜| 在线免费观看日韩欧美| 亚洲一二三区不卡| 欧美在线观看视频在线| 成人av影视在线观看| 亚洲欧洲av在线| www.久久久久久久久| 一区二区三区在线观看网站| 欧美在线999| 欧美在线观看18| 欧美日韩在线播放三区| 国产一区视频网站| 国产精品每日更新在线播放网址| 色婷婷国产精品综合在线观看| 蜜桃视频在线观看一区| 国产欧美综合在线观看第十页| 91福利视频网站| 欧美日韩国产免费一区二区| 成人黄色小视频| 色综合天天综合狠狠| 六月丁香婷婷久久| 一区二区三区在线观看网站| 石原莉奈在线亚洲二区| 久久精品人人做| 欧美另类变人与禽xxxxx| 懂色av中文字幕一区二区三区| 五月天激情综合网| 亚洲欧美日韩国产手机在线| 九九视频精品免费| 国产亚洲精品bt天堂精选| 中文字幕欧美三区| 精品国产乱码久久久久久免费 | 色呦呦网站一区| 欧美亚洲禁片免费| 精品少妇一区二区三区在线视频| 一本一道波多野结衣一区二区| 欧美视频一区二区在线观看| 精品捆绑美女sm三区| 国产精品久久久久久久久快鸭 | 国产毛片一区二区| 一本一道久久a久久精品综合蜜臀| 精品视频在线视频| 久久精品在线观看| 亚洲国产一二三| 粉嫩一区二区三区性色av| 欧美日韩一区二区三区在线| 久久久久免费观看| 久久精品人人做| 无码av中文一区二区三区桃花岛| 国产精品一区二区久久不卡| 韩国av一区二区| 九色|91porny| 欧美肥妇free| 中文字幕日韩欧美一区二区三区| 美女任你摸久久| 欧洲中文字幕精品| 亚洲欧美日韩国产综合| 福利91精品一区二区三区| 日韩精品一区二| 精品少妇一区二区三区视频免付费| 亚洲天堂福利av| 午夜精品福利一区二区三区av| 成人一道本在线| 在线观看免费视频综合| 欧美激情一区三区| 国产盗摄精品一区二区三区在线| 成人黄页毛片网站| 欧美国产一区视频在线观看| 激情综合色丁香一区二区| 欧美视频一区二| 亚洲午夜电影在线| 欧美日韩黄色一区二区| 一区二区视频在线| 免费观看日韩电影| 成人av先锋影音| 国产精品国产三级国产普通话99 | 欧美变态凌虐bdsm| 蜜臀国产一区二区三区在线播放 | 2014亚洲片线观看视频免费| 国产精品五月天| 国产成人啪免费观看软件| 久久人人97超碰com| 另类综合日韩欧美亚洲| 精品久久久久久久人人人人传媒| 全部av―极品视觉盛宴亚洲| 日韩欧美一二三四区| 久久精品久久99精品久久| 日韩一级二级三级| 亚洲激情五月婷婷| 欧美在线观看一区二区| 日日欢夜夜爽一区| 日韩一卡二卡三卡四卡| 精品无人区卡一卡二卡三乱码免费卡| 精品久久久久久久久久久久久久久 | 粉嫩在线一区二区三区视频| 国产精品的网站| 欧美亚州韩日在线看免费版国语版| 亚洲在线中文字幕| 福利视频网站一区二区三区| 亚洲欧美福利一区二区| 欧美在线你懂得| 麻豆91精品视频| 国产精品美女久久福利网站| 91精品福利视频| 美日韩一区二区| 国产精品美女久久久久av爽李琼 | 欧美xfplay| 成人午夜激情在线| 亚洲国产精品综合小说图片区| 欧美一区二区视频在线观看2022| 亚洲精品你懂的| 日韩视频在线你懂得| 丁香啪啪综合成人亚洲小说| 亚洲激情图片一区| 精品成人a区在线观看| 色综合色综合色综合| 免费成人在线网站| 亚洲卡通动漫在线| 亚洲精品一线二线三线无人区| 成人av免费网站| 激情小说欧美图片| 亚洲制服丝袜在线| 国产欧美日韩激情| 欧美大黄免费观看| 97久久久精品综合88久久| 国产精品电影院| 亚洲精品在线网站| 欧美日韩大陆一区二区| av欧美精品.com| 国产一区日韩二区欧美三区| 一区二区免费在线| 国产精品美女一区二区| 精品美女一区二区| 在线播放亚洲一区| 在线观看一区日韩| 色婷婷综合激情| 99久久婷婷国产综合精品| 国产麻豆一精品一av一免费| 日韩国产一区二| 久久久噜噜噜久久中文字幕色伊伊| 欧美丝袜自拍制服另类| 色综合久久天天综合网| 成人黄色电影在线| 成人午夜碰碰视频| 国产精品亚洲人在线观看| 久久成人羞羞网站| 久久精品国产第一区二区三区| 婷婷六月综合网| 性欧美疯狂xxxxbbbb| 精品免费日韩av| 日韩一区二区三区在线观看| 91精品国产综合久久国产大片| 欧美日韩久久久| 777午夜精品免费视频| 激情欧美一区二区| 激情综合网av| 国产最新精品免费| 高清在线成人网| av电影在线观看不卡| 北条麻妃国产九九精品视频| av激情亚洲男人天堂| 91免费国产在线观看| 蜜桃一区二区三区在线观看| 久久精品国产亚洲aⅴ| 狠狠色综合日日| 国产成人综合视频| 99久久久久免费精品国产| 在线免费观看视频一区| 欧美精品久久一区| 精品免费日韩av| 亚洲国产精品ⅴa在线观看| 国产精品第四页| 亚洲第一成年网| 国产综合色产在线精品| 国产成人av电影| 色婷婷综合久久久中文一区二区| 欧美精品一二三区| 精品国产乱码久久| 国产精品久久久久久福利一牛影视 | 国产欧美日韩视频一区二区| 国产精品福利av| 亚洲成人黄色影院| 国产剧情一区二区三区| 99久久精品情趣| 日韩欧美中文字幕一区| 欧美经典一区二区三区| 一区二区三区中文字幕精品精品| 日韩av成人高清| 成人夜色视频网站在线观看| 91黄视频在线观看| 久久亚洲精精品中文字幕早川悠里 | 丰满放荡岳乱妇91ww| 欧美色区777第一页| 久久无码av三级| 亚洲韩国精品一区| 国产99久久久国产精品潘金 | 国产精品丝袜91| 久久精品久久综合| 在线观看91精品国产入口|