arp rcv函式實現分析

2021-04-12 13:27:18 字數 2364 閱讀 4119

/*

* 函式用於網路層收到乙個arp請求時

*/int arp_rcv(struct sk_buff *skb, /*接收到的包緩衝區指標*/

struct net_device *dev, /*接收到arp包的網絡卡裝置結構*/

struct packet_type *pt /*捕獲的協議包型別,arp應該為arp_packet_type(net/ipv4/arp.c的1147行),不過在arp_rcv函式中未使用*/

)/* 目前arp接收函式只支援arp請求(arpop_reply)和arp響應(arpop_request),否則丟棄 */

if (arp->ar_op != __constant_htons(arpop_reply) &&   /**/

arp->ar_op != __constant_htons(arpop_request))

goto out;

/** 擷取arp包體的各個字段

* arp包頭:硬體型別(2bytes)+上層協議型別(2bytes)+硬體位址長度(1bytes)+協議位址長度(1bytes)+操作型別(2bytes,請求or響應)

* arp包體:源mac位址(6bytes)+源ip位址(4bytes)+目的mac位址(6bytes,arp請求則此處全0)+目的ip位址(4bytes)

*/sha=arp_ptr; /*源mac位址指標*/

arp_ptr += dev->addr_len; /*移動源mac位址長度,使指標到源ip位址處*/

memcpy(&sip, arp_ptr, 4); /*copy源ip位址到sip*/

arp_ptr += 4; /*移動ip位址長度*/

tha=arp_ptr; /*目的mac位址指標*/

arp_ptr += dev->addr_len; /*移動目的mac位址長度,使指標到目的ip位址處*/

memcpy(&tip, arp_ptr, 4); /*copy目的ip位址到sip*/

/* * check錯誤的arp請求,如請求解析環迴位址127.x.x.x 或者多播位址.如果有這種情況則丟棄包

*/if (loopback(tip) || multicast(tip))

goto out;

/**  基本校驗通過後,函式具體的處理入口。這裡的處理思路是:如果是請求本機的包則將回送響應;

*  如果是請求其它機器的資訊,則函式將作為****請求。

*  如果是對本機所發請求的響應或請求本機的mac位址,則需要在系統的快取中加入乙個條目. 

*  (假定情況是有人請求本機mac位址,則對方隨後可能會與本機互動,因此如果本機快取了對方位址,

*  則會很省時.由於本機不在對方的快取中,則對方的位址也可能不在本機的快取中.)

*//* 特殊情況處理:ipv4位址衝突檢測(rfc2131:dhcp協議,它基於arp協議,其傳送的請求包的源位址為0) */

if (sip == 0)

if (arp->ar_op == __constant_htons(arpop_request) && /*處理正常的arp請求*/

ip_route_input(skb, tip, sip, 0, dev) == 0)

goto out;

} else if (in_dev_forward(in_dev)) else

goto out;}}

}/* 處理完arp請求後,不管是請求包還是應答包,都要更新arp_tbl表 */

n = __neigh_lookup(&arp_tbl, &sip, dev, 0); /*在arp_tbl表中查詢源ip(sip)對應的鄰居結構*/

#ifdef config_ip_accept_unsolicited_arp /**/

/* unsolicited arp is not accepted by default.

it is possible, that this option should be enabled for some

devices (strip is candidate)

*/if (n == null &&

arp->ar_op == __constant_htons(arpop_reply) &&

inet_addr_type(sip) == rtn_unicast)

n = __neigh_lookup(&arp_tbl, &sip, dev, -1);

#endif

if (n)

out:

kfree_skb(skb);/*釋放資料報*/

if (in_dev)

in_dev_put(in_dev); /*釋放in_dev*/

out_of_mem:

return 0;

}

strcmp函式實現及分析

最近看c,看到strcmp函式,對它的實現原型不很清楚,於是到網上搜。網上演算法一大堆,看了很多 後自己做了一下總結 str1等於str2,返回0 str1大於str2,返回正值或者1 vc返回1 strcmp函式實際上是對字元的ascii碼進行比較,實現原理如下 首先比較兩個串的第乙個字元,若不相...

Select函式實現原理分析

select 函式實現原理分析 select需要驅動程式的支援,驅動程式實現fops內的poll函式。select通過每個裝置檔案對應的poll函式提供的資訊判斷當前是否有資源可用 如可讀或寫 如果有的話則返回可用資源的檔案描述符個數,沒有的話則睡眠,等待有資源變為可用時再被喚醒繼續執行。下面我們分...

strcmp函式實現及分析

strcmp函式是c c 中基本的函式,它對兩個字串進行比較,然後返回比較結果,函式形式如下 int strcmp const char str1,const char str2 其中str1和str2可以是字串常量或者字串變數,返回值為整形。返回結果如下規定 str1小於str2,返回負值或者 1...