/*
* 函式用於網路層收到乙個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...