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

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

?? 網口程序實例.txt

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

CPU將調用elintr中斷例程,并帶有參數unit即該種網卡的第幾塊(因為在計算機中,你有可能 
裝了相同的網卡有幾塊),elintr的作用是把數據從網卡的數據存儲器中讀到我們在該網卡初始化時預先分配好 
的數據緩沖區中,他調用的函數就只有elread,同樣elread也只調用了elget一個函數.elread函數比較簡單,就是 
調用elget,elget則相對比較復雜一點,涉及到核心內存分配mbuf,mbuf是比較恐怖的東西,正如STEVEN所寫的,為 
了節約當時"巨大"的4M內存,犧牲了性能搞出了這個mbuf東東,mbuf是必須要弄懂的,雖然在設備驅動程序中調用 
他的宏和函數不多,但在后面的IP協議,TCP協議中有不少涉及的地方. 
關于數據發送方面和接收差不多,在上層協議放置好數據到mbuf鏈后,調用el_start函數,該函數把mbuf鏈中 
的數據放置到本塊網卡的發送隊列緩沖el_pktbuf中,然后再調用el_xmit函數,此函數把發送隊列緩沖el_pktbuf 
中的數據有傳遞到網卡的數據存儲器中.
*/ 
#include "opt_inet.h" 
#include "opt_ipx.h" 

#include <sys/param.h>; 
#include <sys/systm.h>; 
#include <sys/sockio.h>; 
#include <sys/mbuf.h>; 
#include <sys/socket.h>; 
#include <sys/syslog.h>; 

#include <net/ethernet.h>; 
#include <net/if.h>; 

#include <netinet/in.h>; 
#include <netinet/if_ether.h>; 

#include <net/bpf.h>; 

#include <machine/clock.h>; 

#include <i386/isa/isa_device.h>; 
#include <i386/isa/if_elreg.h>;/*此頭文件是3COM卡的寄存器常量*/ 

/* 為了調試方便 */ 
#ifdef EL_DEBUG 
#define dprintf(x) printf x    /*如果定義了DEBUG調試,則打印到屏幕*/   
#else 
#define dprintf(x) 
#endif 

/* softc結構,每種網卡的該結構是不同的,主要是該第一個成員必須是一以太網的共用結構arpcom*/ 
static struct el_softc { 
struct arpcom arpcom; /* 以太網公共部分 */ 
u_short el_base; /* 基本輸入輸出地址 */ 
char el_pktbuf[EL_BUFSIZ];  /* 幀緩沖大小2048 */ 
} el_softc[NEL];        /*NEL在el.h中定義,即編譯時產生的頭文件,意思為支持的網卡數*/ 
/* 
看看arpcom結構吧 

 * 該結構是以太網設備驅動程序和ARP程序所共享.  
  
struct arpcom { 
/* 
 *  ifnet 結構必須在此結構的第一個位置. 
 / 
struct  ifnet ac_if; 
u_char ac_enaddr[6]; /* 以太網硬件地址/ 
int ac_multicnt; /* 多播地址列表數 / 
void *ac_netgraph; /* netgraph 節點信息,即我們所說的PPPoE,也就是ADSL寬帶所用到的 / 
}; 


*/ 

/* 一些函數申明 */ 
static int el_attach(struct isa_device *);/*第二步:填充相關的數據結構*/ 
static void el_init(void *); /*不用說,是初始化,在probe,attach之后被調用*/ 
static int el_ioctl(struct ifnet *,u_long,caddr_t);/*控制網卡的函樹指針*/ 
static int el_probe(struct isa_device *);/*第一步:探測程序.查看是否卡存在和是否在正確的位置.*/ 
static void el_start(struct ifnet *);/*把數據包從硬件接口輸出去*/ 
static void el_reset(void *);/* 該例程重設接口. 在el_watchdog()中調用*/ 
static void el_watchdog(struct ifnet *);/*一般該函數用于包在一定時間內沒發送出去,就調用他,在 
                               本驅動程序中并不支持該函數,在我的rtl8139說明中有*/ 
static void el_stop(void *);/*停止接口,在el_ioctl()和el_reset()中調用*/ 
static int el_xmit(struct el_softc *,int);/*把數據包放到芯片內,發送到以太網上*/ 
static ointhand2_t elintr;/*中斷例程*/ 
static __inline void elread(struct el_softc *,caddr_t,int);/* 傳遞包到更高一級協議處理,即ether_input()例程.由elintr()調用 */ 
static struct mbuf *elget(caddr_t,int,struct ifnet *); /* 從網卡上下載數據包,len是數據的長度,本地以太網頭部被分開*/ 
static __inline void el_hardreset(void *);/* 這是一個子程序,目的是重設硬件.*/ 

/* isa_driver結構 為 autoconf準備 */ 
/* isa_driver結構說明: 
該結構來之于文件isa_device.h頭文件 
結構成員: 
/* 
 * 通用的設備驅動程序結構. 
 * 
 * 沒一設備驅動程序定義一組例程入口,由設置程序在啟動時使用. 
  
struct isa_driver { 
int (*probe) __P((struct isa_device *idp)); 
/* 測試設備是否存在 
int (*attach) __P((struct isa_device *idp)); 
/* 為設備設置驅動程序  
char *name; /* 設備名稱  
int sensitive_hw; /* 探測發生有沖突時為真,ISA設備的老毛病  
}; 
*/ 
struct isa_driver eldriver = { 
el_probe, el_attach, "el" 
}; 


/* 探測程序.查看是否卡存在和是否在正確的位置. */ 
static int 
el_probe(struct isa_device *idev) 
{ 
/* 
isa_device 是設備的通用結構,該結構說明在isa_device.h頭文件中,說明如下: 
struct isa_device { 
int id_id; /* 設備的 id  
struct isa_driver *id_driver;  指向設備的驅動程序結構 
int id_iobase; /* 基本IO地址  
int id_iosize; /* 基本IO地址的長度  
u_int id_irq; /* 中斷  
int id_drq; /* DMA  
caddr_t id_maddr; /* 在總線中的物理IO內存地址(即便要) 
int id_msize; /* IO內存的大小 
union { 
inthand2_t *id_i; 
ointhand2_t *id_oi;中斷例程指針 
} id_iu; /* 中斷接口例程  
#define id_intr id_iu.id_i 
#define id_ointr id_iu.id_oi 
int id_unit; /* 在該類設備中是第幾個  
int id_flags; /* flags  
int id_enabled; /* 設備激活了嗎 
struct isa_device *id_next; /*  在 userconfig()中用于isa_devlist  
struct device *id_device;   
}; 

*/ 
struct el_softc *sc; 
u_short base; /* 僅僅為了方便 */ 
u_char station_addr[ETHER_ADDR_LEN];/*以太網的硬件地址*/ 
int i; 

/* 搜集一些信息 */ 
sc = &el_softc[idev->;id_unit];/*sc是softc結構,如果你有NEL塊el卡的話就有NEL個softc 
結構,當然也有可能同時還有其他的xx_softc結構*/ 
sc->;el_base = idev->;id_iobase;/*該塊卡的基本I/O地址*/ 
base = sc->;el_base;/*有一點多余,只是為了方便下面的引用*/ 

/* 第一次檢查地址,看看基本地址是否在0X280到0X3F0之內 */ 
if((base < 0x280) || (base >; 0x3f0)) { 
printf("el%d: ioaddr must be between 0x280 and 0x3f0\n", 
idev->;id_unit); 
return(0); 
} 

/* 現在嘗試從PROM中獲取地址,看看是否包含了3COM供應商的標識代碼. 
 */ 
dprintf(("Probing 3c501 at 0x%x...\n",base));/*在調試時會打印出*/ 

/* 重置板卡 */ 
dprintf(("Resetting board...\n")); 
outb(base+EL_AC,EL_AC_RESET);/*我們一般定義基地址為0X300,EL_AC=0E,是輔助命令寄存器*/ 
DELAY(5);/*延遲5毫秒*/ 
outb(base+EL_AC,0); 
dprintf(("Reading station address...\n")); 
/* 讀硬件地址,共六次 */ 
for(i=0;i<ETHER_ADDR_LEN;i++) { 
outb(base+EL_GPBL,i); 
station_addr = inb(base+EL_EAW);/*EL_EAW是該卡的地址口,station_addr是函數內部變量, 
下面判斷了生產廠家后就沒用的*/ 
} 
dprintf(("Address is %6D\n",station_addr, ":")); 

/* 如果廠商標識代碼正確,那么返回1.  
 */ 
if((station_addr[0] != 0x02) || (station_addr[1] != 0x60) 
   || (station_addr[2] != 0x8c)) { 
dprintf(("Bad vendor code.\n"));/*3COM廠商此種卡的代碼為02608C*/ 
return(0); 
} else { 
dprintf(("Vendor code ok.\n")); 
/* 把地址拷貝到arpcom結構中 */ 
bcopy(station_addr,sc->;arpcom.ac_enaddr,ETHER_ADDR_LEN); 
return(1); 
} 
} 

/* 這是一個子程序,目的是重設硬件. 在el_init()中調用,在elintr()中調用,產生中斷,有溢出發生時調用*/ 
static __inline void 
el_hardreset(xsc) 
void *xsc; 
{ 
register struct el_softc *sc = xsc;/*記住在C中,寄存器變量只能有三個,可加快速度*/ 
register int base; 
register int j; 

base = sc->;el_base; 

/* 第一步,重設板卡,和el_probe中的一樣(前面) */ 
outb(base+EL_AC,EL_AC_RESET); 
DELAY(5); 
outb(base+EL_AC,0); 

/* 又把地址填回去,為什么?沒有為什么,就是廠商規定的,一些端口填什么數據時會怎么樣,只有廠商知道,我相信, 
在同一廠商之間的網卡,交換機,路由器進行秘密通訊是非常可能的,他可以不返回到CPU層*/ 
for(j=0;j<ETHER_ADDR_LEN;j++) 
outb(base+j,sc->;arpcom.ac_enaddr[j]); 
} 

/* 連接該接口到核心數據結構.被調用時,我們已經知道該卡已經存在在給定的I/O 
 * 地址,我們還假定中斷號是正確的. 
 */ 
static int 
el_attach(struct isa_device *idev) 
{ 
struct el_softc *sc; 
struct ifnet *ifp;/*該結構是一個巨大的結構,在STEVEN的書中有描述,我也寫了一篇*/ 
u_short base;/*沒用上,可以去掉*/ 

dprintf(("Attaching el%d...\n",idev->;id_unit)); 

/* 放置一些指針. */ 
idev->;id_ointr = elintr;/*放置中斷例程指針,中斷例程在下面*/ 
sc = &el_softc[idev->;id_unit];/*定位本設備的softc結構指針*/ 
ifp = &sc->;arpcom.ac_if;/*定位ifnet結構*/ 
base = sc->;el_base;/*從程序來看,這一句可以去掉,根本沒用,因為在該函數中沒用到base*/ 

/* 重設板卡 */ 
dprintf(("Resetting board...\n")); 
el_hardreset(sc);/*該程序在上面*/ 

/* 初始化ifnet結構,該結構的成員經常用來被ether網子程序,arp,bridge等調用 */ 
ifp->;if_softc = sc;/*該網卡的IFP(通用接口結構)的專用結構指針(softc結構)*/ 
ifp->;if_unit = idev->;id_unit;/*第幾塊網卡*/ 
ifp->;if_name = "el";/*網絡卡的名稱*/ 
ifp->;if_mtu = ETHERMTU;/*1500*/ 
ifp->;if_output = ether_output;/*以太網的輸出子程序指針(不要搞錯了,是向IP層 
輸出,按我們的理解是數據輸入了,再轉送到上一層協議)*/ 
ifp->;if_start = el_start;/*把數據包從硬件接口輸出去*/ 
ifp->;if_ioctl = el_ioctl;/*控制網卡的函樹指針*/ 
ifp->;if_watchdog = el_watchdog;/*一般該函數用于包在一定時間內沒發送出去,就調用他,在 
                               本驅動程序中并不支持該函數,在我的rtl8139說明中有*/ 
ifp->;if_init = el_init;        /*不用說,是初始化,在probe,attach之后被調用*/ 
ifp->;if_flags = (IFF_BROADCAST | IFF_SIMPLEX);/*支持廣播和單播*/ 

/* 調用通用以太網初始化例程 */ 
dprintf(("Attaching interface...\n")); 
ether_ifattach(ifp, ETHER_BPF_SUPPORTED); 
                      /* 
在if_ethersubr.c中的ether_ifattach例程 
void ether_ifattach(ifp, bpf)   調用時,ETHER_BPF_SUPPORTED是BSD的 
包過濾器,如果在編譯時設置文件沒有 
打開包過濾器,那么代表0,否則是1 
register struct ifnet *ifp; 
int bpf; 
{ 
register struct ifaddr *ifa; 
register struct sockaddr_dl *sdl; 

if_attach(ifp);  此例程在if.c 中 
ifp->;if_type = IFT_ETHER;代表以太網 
ifp->;if_addrlen = 6;硬件地址長度是6 
ifp->;if_hdrlen = 14;包的頭長度是6+6+2=14,其中2是協議類型 
ifp->;if_mtu = ETHERMTU;      為1500,多此一舉,在前面你可看到,已 
經填充了. 
ifp->;if_resolvemulti = ether_resolvemulti; 以太網解析多播例程指針 
if (ifp->;if_baudrate == 0)         波特率 
ifp->;if_baudrate = 10000000; 
ifa = ifnet_addrs[ifp->;if_index - 1];在ifnet_addrs[]數組中找到本地址指針 
KASSERT(ifa != NULL, ("%s: no lladdr!\n", __FUNCTION__)); 
sdl = (struct sockaddr_dl *)ifa->;ifa_addr; ifa->;ifa_addr在此時指向的是sockaddr_dl結構. 
sdl->;sdl_type = IFT_ETHER; 
sdl->;sdl_alen = ifp->;if_addrlen; 
bcopy((IFP2AC(ifp))->;ac_enaddr, LLADDR(sdl), ifp->;if_addrlen);把硬件地址拷貝到sdl結構中 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品一区二区在线观看不卡| 一区二区激情小说| 7777精品伊人久久久大香线蕉完整版 | 东方aⅴ免费观看久久av| 日韩成人午夜精品| 亚洲午夜久久久久久久久久久| 国产精品久久久久精k8| 国产精品久久久久久久裸模 | 色激情天天射综合网| 成人黄色综合网站| 97久久精品人人爽人人爽蜜臀| 成人网页在线观看| 色综合网站在线| 91国偷自产一区二区三区成为亚洲经典| 成人久久18免费网站麻豆| 粉嫩aⅴ一区二区三区四区| 国产精品99久久久久久有的能看 | 亚洲一区二区三区三| 亚洲国产美女搞黄色| 日韩精品欧美成人高清一区二区| 日本在线播放一区二区三区| 老汉av免费一区二区三区| 国内精品久久久久影院一蜜桃| 韩日av一区二区| 成人福利在线看| 91电影在线观看| 日韩西西人体444www| 国产欧美日韩不卡| 亚洲综合一区二区| 久久疯狂做爰流白浆xx| 成人开心网精品视频| 欧美日韩国产a| 欧美一三区三区四区免费在线看| 久久网这里都是精品| 中文字幕av一区二区三区高| 亚洲在线观看免费| 国产麻豆一精品一av一免费| 一本在线高清不卡dvd| 日韩欧美国产小视频| 欧美精品一区二区久久久| 最新国产成人在线观看| 久久激五月天综合精品| 色综合中文字幕| 精品福利视频一区二区三区| 亚洲精品国产无套在线观| 激情五月婷婷综合网| 色域天天综合网| 久久久国产精品麻豆| 日韩福利电影在线| 大桥未久av一区二区三区中文| 欧美日韩mp4| 亚洲欧美自拍偷拍色图| 蜜臀av一区二区在线免费观看| jlzzjlzz亚洲日本少妇| 日韩亚洲欧美一区二区三区| 一区二区在线观看视频在线观看| 国产一区二区免费视频| 欧美一区二区在线观看| 亚洲精品日韩综合观看成人91| 国产iv一区二区三区| 欧美电影免费提供在线观看| 亚洲成人av福利| 色婷婷亚洲精品| 成人欧美一区二区三区白人| 国产成人av一区二区三区在线| 欧美大肚乱孕交hd孕妇| 亚洲国产成人va在线观看天堂| 一本大道综合伊人精品热热 | 亚洲国产综合人成综合网站| av高清久久久| 中文子幕无线码一区tr| 成人小视频在线观看| 国产亚洲欧美在线| 国产麻豆午夜三级精品| 欧美videos大乳护士334| 免费在线观看一区二区三区| 91精品国产一区二区三区| 亚洲国产你懂的| 欧美三级在线播放| 丝袜国产日韩另类美女| 欧美一区二区大片| 久久99精品久久久久久动态图 | 亚洲色图制服诱惑 | 精品一区二区免费视频| 亚洲精品一区二区三区影院| 国内一区二区在线| 国产精品―色哟哟| 91看片淫黄大片一级在线观看| 中文字幕一区二区三区在线观看 | 福利一区福利二区| 亚洲视频香蕉人妖| 色综合久久久久久久久久久| 亚洲五码中文字幕| 日韩免费观看2025年上映的电影| 蜜桃在线一区二区三区| 国产亚洲欧美色| 91麻豆国产自产在线观看| 亚洲午夜精品17c| 日韩久久精品一区| 成人黄页毛片网站| 午夜欧美视频在线观看| 精品国产髙清在线看国产毛片| 国产麻豆视频一区二区| 一区二区三区四区av| 日韩欧美亚洲国产另类| caoporn国产一区二区| 亚洲国产wwwccc36天堂| www成人在线观看| 日本电影欧美片| 久久国产尿小便嘘嘘| 亚洲色图欧美在线| 日韩三级免费观看| 色美美综合视频| 国产一区二区三区在线观看精品| 亚洲日本在线a| 欧美成人伊人久久综合网| 在线亚洲欧美专区二区| 麻豆精品视频在线| 亚洲日本成人在线观看| 亚洲精品一区在线观看| 欧美三级电影网站| 高清日韩电视剧大全免费| 无吗不卡中文字幕| 亚洲欧洲日韩在线| 欧美v日韩v国产v| 欧美精品一二三区| 99久久伊人网影院| 国产一区二区三区在线看麻豆| 亚洲高清免费观看高清完整版在线观看| 2019国产精品| 欧美一级日韩免费不卡| 91美女精品福利| 成人激情图片网| 黄色资源网久久资源365| 日韩综合一区二区| 一区二区三区免费在线观看| 久久精品人人做人人爽97| 制服丝袜日韩国产| 欧美午夜影院一区| 波多野结衣91| 丁香天五香天堂综合| 国产老妇另类xxxxx| 美女mm1313爽爽久久久蜜臀| 一区二区欧美国产| 自拍视频在线观看一区二区| 国产精品日韩精品欧美在线| 久久久久久**毛片大全| 欧美精品一区男女天堂| 精品成人佐山爱一区二区| 日韩一级二级三级精品视频| 欧美精品高清视频| 欧美羞羞免费网站| 欧美日韩国产色站一区二区三区| 欧美影院午夜播放| 欧美日本一道本在线视频| 欧美色综合影院| 欧美日韩国产高清一区二区| 56国语精品自产拍在线观看| 欧美高清性hdvideosex| 日韩三级精品电影久久久| 亚洲精品在线一区二区| 国产情人综合久久777777| 中文字幕成人在线观看| 亚洲欧洲精品一区二区三区 | 亚洲卡通动漫在线| 一区二区三区四区高清精品免费观看 | 在线免费观看视频一区| 欧美性xxxxxx少妇| 欧美剧情片在线观看| 欧美理论电影在线| 在线观看亚洲精品视频| 成人午夜激情在线| 在线亚洲+欧美+日本专区| 色综合av在线| 色8久久人人97超碰香蕉987| 欧美一区二区三区四区五区| 色88888久久久久久影院按摩 | 国产精品69久久久久水密桃| 精品亚洲免费视频| 美女视频黄免费的久久 | 日本精品视频一区二区| 欧美亚州韩日在线看免费版国语版| 日本精品免费观看高清观看| 91视频一区二区| 欧美综合天天夜夜久久| 欧美午夜影院一区| 欧美精品一卡二卡| 欧美日韩国产免费| 日韩精品一区二区三区在线观看| 久久一夜天堂av一区二区三区| 国产亚洲精品福利| 国产精品大尺度| 国产精品久久毛片| 麻豆成人91精品二区三区| 韩国v欧美v亚洲v日本v| 9久草视频在线视频精品| 日韩一卡二卡三卡国产欧美| 精品福利一二区| 亚洲色图清纯唯美| 久久99国产精品久久99|