嵌入式LwIP ARP協(xié)議1

一采驻、ARP協(xié)議簡(jiǎn)介  

ARP,全稱 Address Resolution Protocol视事,譯作地址解析協(xié)議胆萧,ARP 協(xié)議與底層網(wǎng)絡(luò)接口密切相關(guān)。TCP/IP 標(biāo)準(zhǔn)分層結(jié)構(gòu)中郑口,把 ARP 劃分為了網(wǎng)絡(luò)層的重要組成部分鸳碧。?當(dāng)一個(gè)主機(jī)上的應(yīng)用程序要向目標(biāo)主機(jī)發(fā)送數(shù)據(jù)時(shí)盾鳞,它只知道目標(biāo)主機(jī)的 IP 地址犬性,而在協(xié)議棧底層接口發(fā)送數(shù)據(jù)包時(shí)瞻离,需要將該 IP 地址轉(zhuǎn)換為目標(biāo)主機(jī)對(duì)應(yīng)的 MAC 地址,這樣才能在數(shù)據(jù)鏈路上選擇正確的通道將數(shù)據(jù)包傳送出去乒裆,在整個(gè)轉(zhuǎn)換過(guò)程中發(fā)揮關(guān)鍵作用的就是 ARP 協(xié)議了套利。?本次的學(xué)習(xí)內(nèi)容有:

ARP?協(xié)議的原理;

ARP?緩存表及其創(chuàng)建鹤耍、維護(hù)肉迫、查詢;

ARP?報(bào)文結(jié)構(gòu)稿黄。

1.1喊衫、物理地址與網(wǎng)絡(luò)地址

  網(wǎng)卡的 48 位 MAC 地址都保存在網(wǎng)卡的內(nèi)部存儲(chǔ)器中,TCP/IP 協(xié)議有32bit 的 IP 地址(網(wǎng)絡(luò)地址)杆怕,網(wǎng)絡(luò)層發(fā)送數(shù)據(jù)包時(shí)只知道目的主機(jī)的 IP 地址族购,而底層接口(如以太網(wǎng)驅(qū)動(dòng)程序)必須知道對(duì)方的硬件地址才能將數(shù)據(jù)發(fā)送出去。

  為了解決地址映射的問(wèn)題陵珍,ARP 協(xié)議提供了一種地址動(dòng)態(tài)解析的機(jī)制寝杖,在32 bit的 IP 地址和采用不同網(wǎng)絡(luò)技術(shù)的硬件地址之間提供動(dòng)態(tài)映射,為上層將底層的物理地址差異屏蔽起來(lái)互纯,這樣上層的因特網(wǎng)協(xié)議便可以靈活的使用 IP 地址進(jìn)行通信瑟幕。

1.2、ARP協(xié)議的本質(zhì)

  ARP?協(xié)議使用目標(biāo)主機(jī)的?IP?地址留潦,查詢其對(duì)應(yīng)的?MAC?地址只盹,保證底層鏈路上數(shù)據(jù)包通信的進(jìn)行。

  假如我們的主機(jī)(192.168.1.78)需要向開(kāi)發(fā)板(192.168.1.37)發(fā)送一個(gè) IP 數(shù)據(jù)包兔院,當(dāng)發(fā)送數(shù)據(jù)時(shí)殖卑,主機(jī)會(huì)在自己的 ARP 緩存表中尋找是否有目標(biāo)IP地址。如果找到了秆乳,也就知道了目標(biāo) MAC 地址為(00-80-48-12-34-56)懦鼠,此時(shí)主機(jī)直接把目標(biāo) MAC 地址寫(xiě)入以太網(wǎng)幀首部發(fā)送就可以了;如果在 ARP 緩存表中沒(méi)有找到相對(duì)應(yīng)的 IP 地址屹堰,此時(shí)比較不幸肛冶,我們的數(shù)據(jù)需要被延遲發(fā)送,隨后主機(jī)會(huì)先在網(wǎng)絡(luò)上發(fā)送一個(gè)廣播(ARP 請(qǐng)求扯键,以太網(wǎng)目的地址為 FF-FF-FF-FF-FF-FF)睦袖,廣播的 ARP 請(qǐng)求表示同一網(wǎng)段內(nèi)的所有主機(jī)將會(huì)收到這樣一條信息:“192.168.1.37 的 MAC 地址是什么?請(qǐng)回答”荣刑。網(wǎng)絡(luò) IP 地址為 192.168.1.37(開(kāi)發(fā)板)的主機(jī)接收到這個(gè)幀后馅笙,它有義務(wù)做出這樣的回答(ARP 應(yīng)答):“192.168.1.37 的 MAC 地址是(00-80-48-12-34-56)”伦乔。 這樣,主機(jī)就知道了開(kāi)發(fā)板的 MAC 地址董习,先前被延遲的數(shù)據(jù)包就可以發(fā)送了烈和,此外,主機(jī)會(huì)將這個(gè)地址對(duì)保存在緩存表中以便后續(xù)數(shù)據(jù)包發(fā)送時(shí)使用皿淋。?ARP?的實(shí)質(zhì)就是對(duì)緩存表的建立招刹、更新、查詢等操作窝趣。

二疯暑、數(shù)據(jù)結(jié)構(gòu)

  頭文件etharp.h 文件實(shí)現(xiàn)了以太網(wǎng)中 ARP 協(xié)議的全部數(shù)據(jù)結(jié)構(gòu),ARP 協(xié)議實(shí)現(xiàn)過(guò)程中有兩個(gè)重要的數(shù)據(jù)結(jié)構(gòu)哑舒,即 ARP 緩存表和 ARP 報(bào)文妇拯。

2.1、ARP表

  ARP協(xié)議的實(shí)質(zhì)就是對(duì)緩存表的建立洗鸵、更新越锈、查詢等操作。ARP 緩存表由緩存表項(xiàng)(entry)組成预麸,每個(gè)表項(xiàng)記錄了一組 IP 地址和 MAC 地址綁定信息瞪浸,還包含了與數(shù)據(jù)包發(fā)送控制、緩存表項(xiàng)管理相關(guān)的狀態(tài)吏祸、控制信息对蒲。LwIP中描述緩存表項(xiàng)的數(shù)據(jù)結(jié)構(gòu)叫 etharp_entry,如下所示:

structetharp_entry

{

  struct etharp_q_entry *q?????????????? //數(shù)據(jù)包緩沖隊(duì)列指針

  struct ip_addr ipaddr????????????????? //目標(biāo) IP 地址

  struct eth_addr ethaddr??????????????? //MAC 地址

  enum etharp_state state?? ????????????? //描述該 entry 的狀態(tài)

u8_t

ctime??????????????????? ???????? //描述該 entry 的時(shí)間信息

  struct netif *netif?????????? ???????? //對(duì)應(yīng)網(wǎng)絡(luò)接口信息

}?

  描述緩沖隊(duì)列的數(shù)據(jù)結(jié)構(gòu)叫做 etharp_q_entry贡翘,該結(jié)構(gòu)的定義如下:

structetharp_q_entry

{

  structetharp_q_entry *next????? //指向下一個(gè)緩沖數(shù)據(jù)包

  struct pbuf

*p?????????????????? //指向數(shù)據(jù)包 pbuf

}?

用一個(gè)圖來(lái)看看 etharp_q_entry 結(jié)構(gòu)在緩存表數(shù)據(jù)隊(duì)列中的作用蹈矮,如圖所示:

        [if !vml]

[endif]

  state 是個(gè)枚舉類型,它描述該緩存表項(xiàng)的狀態(tài)鸣驱,LwIP 中定義一個(gè)緩存表項(xiàng)可能有三種不同的狀態(tài)泛鸟,用枚舉型 etharp_state 進(jìn)行描述。

enumetharp_state

{

ETHARP_STATE_EMPTY

= 0,?????? //empty 狀態(tài)

ETHARP_STATE_PENDING,????????????????? //pending 狀態(tài)

ETHARP_STATE_STABLE?????????? //stable 狀態(tài)

}?

  編譯器為ARP表預(yù)先定義了ARP_TABLE_SIZE(10)個(gè)表項(xiàng)空間踊东,因此ARP緩存表內(nèi)部最多只能存放ARP_TABLE_SIZE條IP 地址與MAC地址配對(duì)信息北滥。

static struct etharp_entry

arp_table[ARP_TABLE_SIZE]? //定義 ARP 緩存表

  ETHARP_STATE_EMPTY?狀態(tài):初始化的時(shí)候?yàn)閑mpty狀態(tài)。

  ETHARP_STATE_PENDING狀態(tài):表示該表項(xiàng)處于不穩(wěn)定狀態(tài)闸翅,此時(shí)該表項(xiàng)只記錄到了IP 地址再芋,但是還未記錄到對(duì)應(yīng)的MAC地址。?很可能的情況是坚冀,LwIP 內(nèi)核已經(jīng)發(fā)出一個(gè)關(guān)于該 IP地址的 ARP 請(qǐng)求到數(shù)據(jù)鏈路上济赎,但是還未收到 ARP應(yīng)答。

  ETHARP_STATE_STABLE 狀態(tài):當(dāng) ARP表項(xiàng)被更新后,它就記錄了一對(duì)完整的IP 地址和MAC地址司训。

  在ETHARP_STATE_PENDING 狀態(tài)下會(huì)設(shè)定超時(shí)時(shí)間(10秒)珊蟀,當(dāng)計(jì)數(shù)超時(shí)后过咬,對(duì)應(yīng)的表項(xiàng)將被刪除球切;在ETHARP_STATE_STABLE狀態(tài)下也會(huì)設(shè)定超時(shí)時(shí)間(20分鐘)氓癌,當(dāng)計(jì)數(shù)超時(shí)后,對(duì)應(yīng)的表項(xiàng)將被刪除蓖谢。

  網(wǎng)絡(luò)接口結(jié)構(gòu)指針 netif捂蕴,該結(jié)構(gòu)中包含了網(wǎng)絡(luò)接口的 MAC地址和IP地址等信息譬涡,在發(fā)送數(shù)據(jù)包的時(shí)候闪幽,這些信息都起著至關(guān)重要的作用。?

  ctime為每個(gè)表項(xiàng)的計(jì)數(shù)器涡匀,周期性的去調(diào)用一個(gè)etharp_tmr函數(shù)盯腌,這個(gè)函數(shù)以5秒為周期被調(diào)用,在這個(gè)函數(shù)中陨瘩,它會(huì)將每個(gè)ARP 緩存表項(xiàng)的 ctime 字段值加 1腕够,當(dāng)相應(yīng)表項(xiàng)的生存時(shí)間計(jì)數(shù)值 ctime 大于系統(tǒng)規(guī)定的某個(gè)值時(shí),系統(tǒng)將刪除對(duì)應(yīng)的表項(xiàng)舌劳。


//穩(wěn)定狀態(tài)表項(xiàng)的最大生存時(shí)間計(jì)數(shù)值:240*5s=20min

#defineARP_MAXAGE?????? 240

//PENDING狀態(tài)表項(xiàng)的最大生存時(shí)間計(jì)數(shù)值:2*5s=10s

#defineARP_MAXPENDING?? 2

void etharp_tmr(void)

{

u8_t

i;

  for (i = 0? i

< ARP_TABLE_SIZE? ++i) //對(duì)每個(gè)表項(xiàng)操作帚湘,包括空閑狀態(tài)的表項(xiàng){

arp_table[i].ctime++? //先將表項(xiàng) ctime 值加1

//如果表項(xiàng)是 stable 狀態(tài),且生存值大于 ARP_MAXAGE甚淡,

//或者是 pending 狀態(tài)且其生存值大于 ARP_MAXPENDING大诸,則刪除表項(xiàng)

    if(((arp_table[i].state == ETHARP_STATE_STABLE) && //stable 狀態(tài)

(arp_table[i].ctime >= ARP_MAXAGE))||

((arp_table[i].state == ETHARP_STATE_PENDING) && //pending 狀態(tài)

(arp_table[i].ctime >= ARP_MAXPENDING)) )

{

      if(arp_table[i].q != NULL)?? //如果表項(xiàng)上的數(shù)據(jù)隊(duì)列中有數(shù)據(jù){

free_etharp_q(arp_table[i].q)????? //則釋放隊(duì)列中的所有數(shù)據(jù)

arp_table[i].q = NULL????????????? //隊(duì)列設(shè)置為空

}

arp_table[i].state = ETHARP_STATE_EMPTY? //將表項(xiàng)狀態(tài)改為未用

}//if

}//for

}

2.2、ARP報(bào)文

  ?ARP?請(qǐng)求和?ARP?應(yīng)答贯卦,它們都是被組裝在一個(gè)?ARP?數(shù)據(jù)包中發(fā)送的资柔,一個(gè)典型的?ARP?包的組成結(jié)構(gòu)如圖所示:

[if !vml]

[endif]

  以太網(wǎng)目的地址和以太網(wǎng)源地址:分別表示以太網(wǎng)目的MAC地址和源MAC地址,目的地址全1時(shí)是特殊地址以太網(wǎng)廣播地址撵割。在 ARP 表項(xiàng)建立前贿堰,源主機(jī)只知道目的主機(jī)的 IP 地址,并不知道其 MAC 地址啡彬,所以在數(shù)據(jù)鏈路上羹与,源主機(jī)只有通過(guò)廣播的方式將 ARP請(qǐng)求數(shù)據(jù)包發(fā)送出去,同一網(wǎng)段上的所有以太網(wǎng)接口都會(huì)接收到廣播的數(shù)據(jù)包庶灿。

  楨類型:ARP-0x0806纵搁、IP-0x0800、PPPoE-0x8864跳仿。

  硬件類型:表示發(fā)送方想要知道的硬件類型诡渴。

  協(xié)議類型:表示要映射的協(xié)議地址類型,0x0800-表示要映射為IP地址 。

  硬件地址長(zhǎng)度和協(xié)議地址長(zhǎng)度:以太網(wǎng)ARP請(qǐng)求和應(yīng)答分別為6和4妄辩,代表MAC地址長(zhǎng)度和IP地址長(zhǎng)度惑灵。

  op:指出ARP數(shù)據(jù)包的類型,ARP請(qǐng)求(1)眼耀,ARP應(yīng)答(2)英支。

  在以太網(wǎng)的數(shù)據(jù)幀頭部中和 ARP 數(shù)據(jù)包中都有發(fā)送端的以太網(wǎng)MAC 地址。對(duì)于一個(gè) ARP 請(qǐng)求包來(lái)說(shuō)哮伟,除接收方以太網(wǎng)地址外的所有字段都應(yīng)該被填充相應(yīng)的值干花。當(dāng)接收方主機(jī)收到一份給自己的 ARP 請(qǐng)求報(bào)文后,它就把自己的硬件地址填進(jìn)去楞黄,然后將該請(qǐng)求數(shù)據(jù)包的源主機(jī)信息和目的主機(jī)信息交換位置池凄,并把操作字段 op 置為 2,最后把該新構(gòu)建的數(shù)據(jù)包發(fā)送回去鬼廓,這就是 ARP 應(yīng)答肿仑。

  在?ARP?中用了一大堆的數(shù)據(jù)結(jié)構(gòu)和宏來(lái)描述上圖的結(jié)構(gòu)。

#ifndefETHARP_HWADDR_LEN

#define ETHARP_HWADDR_LEN 6 //以太網(wǎng)物理地址長(zhǎng)度

#endif

PACK_STRUCT_BEGIN//我們移植時(shí)實(shí)現(xiàn)的結(jié)構(gòu)體封裝宏

structeth_addr

{

//定義以太網(wǎng) MAC 地址結(jié)構(gòu)體 eth_addr碎税,禁止編譯器自對(duì)齊

PACK_STRUCT_FIELD(u8_t

addr[ETHARP_HWADDR_LEN])?

}

PACK_STRUCT_STRUCT?

PACK_STRUCT_END

PACK_STRUCT_BEGIN//定義以太網(wǎng)數(shù)據(jù)幀首部結(jié)構(gòu)體 eth_hdr尤慰,禁止編譯器自對(duì)齊

structeth_hdr

{

PACK_STRUCT_FIELD(struct eth_addr dest)? //以太網(wǎng)目的地址(6 字節(jié))

PACK_STRUCT_FIELD(struct eth_addr src)? //以太網(wǎng)源地址(6 字節(jié))

PACK_STRUCT_FIELD(u16_t

type)? //幀類型(2 字節(jié))

}

PACK_STRUCT_STRUCT?

PACK_STRUCT_END

//定義以太網(wǎng)幀頭部長(zhǎng)度宏,其中 ETH_PAD_SIZE 已定義為 0

#defineSIZEOF_ETH_HDR (14 + ETH_PAD_SIZE)

PACK_STRUCT_BEGIN//定義 ARP 數(shù)據(jù)包結(jié)構(gòu)體 etharp_hdr雷蹂,禁止編譯器自對(duì)齊

structetharp_hdr

{

PACK_STRUCT_FIELD(u16_t

hwtype)? //硬件類型(2 字節(jié))

PACK_STRUCT_FIELD(u16_t

proto)? //協(xié)議類型(2 字節(jié))

PACK_STRUCT_FIELD(u16_t

_hwlen_protolen)? //硬件+協(xié)議地址長(zhǎng)度(2 字節(jié))

PACK_STRUCT_FIELD(u16_t

opcode)? //操作字段 op(2 字節(jié))

PACK_STRUCT_FIELD(struct eth_addr shwaddr)? //發(fā)送方 MAC 地址(6 字節(jié))

PACK_STRUCT_FIELD(struct ip_addr2 sipaddr)? //發(fā)送方 IP 地址(4 字節(jié))

PACK_STRUCT_FIELD(struct eth_addr dhwaddr)? //接收方 MAC 地址(6 字節(jié))

PACK_STRUCT_FIELD(struct ip_addr2 dipaddr)? //接收方 IP 地址(4 字節(jié))

}

PACK_STRUCT_STRUCT?

PACK_STRUCT_END

#define SIZEOF_ETHARP_HDR 28 //宏伟端,ARP 數(shù)據(jù)包長(zhǎng)度

//宏,包含 ARP 數(shù)據(jù)包的以太網(wǎng)幀長(zhǎng)度

#defineSIZEOF_ETHARP_PACKET (SIZEOF_ETH_HDR +SIZEOF_ETHARP_HDR)

#define ARP_TMR_INTERVAL 5000 //定義 ARP 定時(shí)器周期為 5 秒匪煌,不同幀類型的宏定義

#defineETHTYPE_ARP 0x0806

#defineETHTYPE_IP 0x0800

//ARP 數(shù)據(jù)包中 OP 字段取值宏定義

#define ARP_REQUEST 1 //ARP 請(qǐng)求

#defineARP_REPLY 2?//ARP 應(yīng)答

  發(fā)送 ARP 請(qǐng)求數(shù)據(jù)包的函數(shù)叫 etharp_request责蝠,它通過(guò)調(diào)用 etharp_raw 函數(shù)來(lái)實(shí)現(xiàn),調(diào)用后者時(shí)虐杯,需要為它提供 ARP數(shù)據(jù)包中各個(gè)字段的值玛歌,后者直接將各個(gè)字段的值填寫(xiě)到在一個(gè) ARP 包中發(fā)送(該函數(shù)并不知道發(fā)送的是 ARP 請(qǐng)求還是 ARP 響應(yīng),它只管組裝并發(fā)送擎椰,所以稱之為 raw)

//函數(shù)功能:根據(jù)各個(gè)參數(shù)字段組織一個(gè) ARP 數(shù)據(jù)包并發(fā)送

//參數(shù) netif:發(fā)送 ARP 包的網(wǎng)絡(luò)接口結(jié)構(gòu)

//參數(shù) ethsrc_addr:以太網(wǎng)幀首部中的以太網(wǎng)源地址值

//參數(shù) ethdst_addr:以太網(wǎng)幀首部中的以太網(wǎng)目的地址值

//參數(shù)hwsrc_addr:ARP 數(shù)據(jù)包中的發(fā)送方 MAC 地址

//參數(shù) ipsrc_addr:ARP 數(shù)據(jù)包中的發(fā)送方 IP 地址

//參數(shù) hwdst_addr:ARP 數(shù)據(jù)包中的接收方 MAC 地址

//參數(shù) ipdst_addr:ARP 數(shù)據(jù)包中的接收方 IP 地址

//參數(shù) opcode:ARP 數(shù)據(jù)包中的 OP 字段值支子,請(qǐng)求ARP為1,應(yīng)答ARP為2

//注:ARP 數(shù)據(jù)包中其他字段使用預(yù)定義值达舒,例如硬件地址長(zhǎng)度為 6值朋,協(xié)議地址長(zhǎng)度為 4

err_t

etharp_raw(struct netif *netif, const structeth_addr *ethsrc_addr,

const struct eth_addr *ethdst_addr, const structeth_addr *hwsrc_addr,

const struct ip_addr *ipsrc_addr, const structeth_addr *hwdst_addr,

const struct ip_addr *ipdst_addr, constu16_t opcode)

{

  struct pbuf *p? //數(shù)據(jù)包指針

err_t

result = ERR_OK? //返回結(jié)果

u8_t

k?

  struct eth_hdr *ethhdr? //以太網(wǎng)數(shù)據(jù)幀首部結(jié)構(gòu)體指針

  struct etharp_hdr *hdr? // ARP 數(shù)據(jù)包結(jié)構(gòu)體指針

//先在內(nèi)存堆中為 ARP 包分配空間,大小為包含 ARP 數(shù)據(jù)包的以太網(wǎng)幀總大小

p

= pbuf_alloc(PBUF_RAW, SIZEOF_ETHARP_PACKET, PBUF_RAM)?

  if(p == NULL)??//若分配失敗則返回內(nèi)存錯(cuò)誤{

    return ERR_MEM?

}

  //到這里巩搏,內(nèi)存分配成功

ethhdr

= p->payload? // ethhdr 指向以太網(wǎng)幀首部區(qū)域

hdr

= (struct etharp_hdr *)((u8_t*)ethhdr +

SIZEOF_ETH_HDR)?// hdr 指向 ARP 首部

hdr->opcode

= htons(opcode)? //填寫(xiě) ARP 包的 OP 字段昨登,注意大小端轉(zhuǎn)換

k

= ETHARP_HWADDR_LEN??????//循環(huán)填寫(xiě)數(shù)據(jù)包中各個(gè) MAC 地址字段

  while(k > 0)

{

k----?

hdr->shwaddr.addr[k]

= hwsrc_addr->addr[k]? //ARP 頭部的發(fā)送方 MAC 地址

hdr->dhwaddr.addr[k]

= hwdst_addr->addr[k]? //ARP 頭部的接收方 MAC 地址

ethhdr->dest.addr[k]

= ethdst_addr->addr[k]? //以太網(wǎng)幀首部中的目的地址

ethhdr->src.addr[k]

= ethsrc_addr->addr[k]? //以太網(wǎng)幀首部中的以太網(wǎng)源地址

}

hdr->sipaddr

= *(struct ip_addr2 *)ipsrc_addr? //填寫(xiě) ARP 頭部發(fā)送方 IP 地址

hdr->dipaddr

= *(struct ip_addr2 *)ipdst_addr? //填寫(xiě) ARP 頭部接收方 IP 地址

//下面填充一些固定字段的值

hdr->hwtype

= htons(HWTYPE_ETHERNET)? //ARP 頭部的硬件類型為 1,即以太網(wǎng)

hdr->proto

= htons(ETHTYPE_IP)? //ARP 頭部的協(xié)議類型為0x0800

//設(shè)置兩個(gè)長(zhǎng)度字段

hdr->_hwlen_protolen=htons((ETHARP_HWADDR_LEN<<8)| sizeof(struct ip_addr));

ethhdr->type

= htons(ETHTYPE_ARP)? //以太網(wǎng)幀首部中的幀類型字段贯底,ARP 包

result

= netif->linkoutput(netif, p)? //調(diào)用底層數(shù)據(jù)包發(fā)送函數(shù)

pbuf_free(p)? //釋放數(shù)據(jù)包

p

= NULL?

  return result? //返回發(fā)送結(jié)果

}

//特殊 MAC 地址的定義丰辣,以太網(wǎng)廣播地址

const struct eth_addr ethbroadcast = {{0xff,0xff,0xff,0xff,0xff,0xff}}?

//該值用于填充 ARP 請(qǐng)求包的接收方MAC 字段,無(wú)實(shí)際意義

const struct eth_addr ethzero = {{0,0,0,0,0,0}}?

//函數(shù)功能:發(fā)送 ARP 請(qǐng)求

//參數(shù) netif:發(fā)送 ARP 請(qǐng)求包的接口結(jié)構(gòu)

//參數(shù) ipaddr:請(qǐng)求具有該 IP 地址主機(jī)的 MAC

err_t

etharp_request(struct netif *netif, structip_addr *ipaddr)

{

 //該函數(shù)只是簡(jiǎn)單的調(diào)用函數(shù)etharp_raw,為函數(shù)提供所有相關(guān)參數(shù)

 return etharp_raw(netif, (structeth_addr *)netif->hwaddr,ebroadcast,

(struct eth_addr *)netif->hwaddr,&netif->ip_addr,&ethzero,ipaddr,ARP_REQUEST)?

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末笙什,一起剝皮案震驚了整個(gè)濱河市飘哨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌琐凭,老刑警劉巖芽隆,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異统屈,居然都是意外死亡胚吁,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門愁憔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)腕扶,“玉大人,你說(shuō)我怎么就攤上這事惩淳〗短海” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵思犁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我进肯,道長(zhǎng)激蹲,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任江掩,我火速辦了婚禮学辱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘环形。我一直安慰自己策泣,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布抬吟。 她就那樣靜靜地躺著萨咕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪火本。 梳的紋絲不亂的頭發(fā)上危队,一...
    開(kāi)封第一講書(shū)人閱讀 49,046評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音钙畔,去河邊找鬼茫陆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛擎析,可吹牛的內(nèi)容都是我干的簿盅。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼桨醋!你這毒婦竟也來(lái)了见秽?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤讨盒,失蹤者是張志新(化名)和其女友劉穎解取,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體返顺,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡禀苦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了遂鹊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片振乏。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖秉扑,靈堂內(nèi)的尸體忽然破棺而出慧邮,到底是詐尸還是另有隱情,我是刑警寧澤舟陆,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布误澳,位于F島的核電站,受9級(jí)特大地震影響秦躯,放射性物質(zhì)發(fā)生泄漏忆谓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一踱承、第九天 我趴在偏房一處隱蔽的房頂上張望倡缠。 院中可真熱鬧,春花似錦茎活、人聲如沸昙沦。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)盾饮。三九已至,卻和暖如春身辨,著一層夾襖步出監(jiān)牢的瞬間丐谋,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工煌珊, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留号俐,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓定庵,卻偏偏與公主長(zhǎng)得像吏饿,于是被迫代替她去往敵國(guó)和親踪危。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容