udhcp原始碼詳解(四)

2021-07-22 18:01:40 字數 3613 閱讀 9470

udhcp原始碼詳解(四)             之租賃ip的管理

author : hui <[email protected]>

from :

created : 2010-10-4

server端對於租賃出去的ip的管理是基於結構體dhcpofferedaddr的,該結構體的定義是在leases.c檔案裡:(結構體的成員介紹說明見詳解之資料結構)

[cpp]view plain

copy

struct dhcpofferedaddr ;  

在dhcpd.c檔案裡用該結構體定義指向該結構陣列的指標leases;

/* dhcpd.c */

#include

struct dhcpofferedaddr *leases;

在讀取完配置資訊server_config後,就可以依據配置資訊的記憶體為該結構陣列申請記憶體空間了:

[cpp]view plain

copy

/* * strut dhcpofferedaddr ;

** 該結構陣列leases是記錄租賃出去的ip,   yiaddr

* 租賃ip客戶機的mac, charddr

* 租賃的到期時間,expires(從2023年1月1日00:00:00到租賃到期的總共的秒數)

** dhcp server啟動後(可能是異常重啟)

* 所以要充server_config.file裡讀取上次為哪些客戶機分配了ip

* 並把讀取到的內容新增到leases陣列裡

*/leases = xzalloc(server_config.max_leases * sizeof(

struct dhcpofferedaddr));  

read_leases(server_config.lease_file);   

//server_config.lease_file = "/var/lib/misc/udhcpd.leases"

2).  查詢租賃最早到期的租約:

[cpp]view plain

copy

/* * add a lease into the table, clearing out any old ones

* add_lease是把mac:chaddr, ip : yiaddr, expires: lease

* 租賃資訊新增到leases陣列裡

* 函式首先呼叫clear_lease把陣列裡舊的刪除掉(與chaddr or yiaddr相同的)

* 從leases陣列裡找到最早到期的,再新增

** 返回oldest (null 表示未新增成功) 

*/struct dhcpofferedaddr *add_lease(uint8_t *chaddr, uint32_t yiaddr, unsigned 

long lease)  

return oldest;  

}  

3).  通過mac或ip查詢租約:

[cpp]view plain

copy

/* find the first lease that matches chaddr, null if no match */

struct dhcpofferedaddr *find_lease_by_chaddr(uint8_t *chaddr)  

/* find the first lease that matches yiaddr, null is no match */

struct dhcpofferedaddr *find_lease_by_yiaddr(uint32_t yiaddr)    

4).  檢查ip addr是否被網路中主機所使用,若被使用的話新增到leases陣列裡:

[cpp]view plain

copy

/** check is an ip is taken, if it is, add it to the lease table

** 檢查addr is a free ip(網路中是否有主機使用addr)

* if addr is a used ip, 把addr新增到租賃陣列裡

**  1. 返回0 表示addr 是a free ip

*  2. 返回1表示addr已被網路中的某台主機使用了

*      並且把使用addr的主機新增到leases陣列裡

*      其中mac: blank_chaddr, ip: addr, expires: server_config.confict_time(def: 3600sec)**/

static

int check_ip(uint32_t addr)  

else

return 0;  

}  

5)  從可用ip位址池裡找到乙個可用的ip(a free ip)

uint32_t    find_address(int check_expire);

a)server

首先利用

client

的mac

位址在leases

陣列裡查詢該

client

以前是否在這裡租賃過

ip,租賃過的話,把以前的

ip提供給

client b)

第一種情況不滿足的話,

server

會檢查dhcpdiscover

報文的選項字段,

client

是否有請求的

ip(該選項資訊的

code 

:dhcp_requested_ip

),有的話檢查該

ip是否為

free

,可以的話把

request ip

提供給client。

c)上面兩種情況都不滿足的話,就呼叫

find_address

這個函式了。

[cpp]view plain

copy

/** find an assignable address, it check_expired is true,

* we check all the expired leases as well.

* maybe this should try expired leases by age...

** 找到乙個可分配的ip,如果check_expired is true,

* 會檢查所有到期租約

* find_address()函式找到free ip 返回ip的值(network order)

* 未找到返回0

* */

uint32_t find_address(int check_expired)  

}  }  return 0;  

}  

udhcp詳解原始碼(序)

udhcp原始碼詳解 序 author hui 632254504 qq.com from created 2010 10 1 這篇udhcp詳解是基於busybox 1.02裡的 busybox 1.02 networking udhcp 目錄下的原始碼進行講解與分析,主要是對udhcp serv...

udhcp原始碼詳解(一)

udhcp 原始碼詳解 一 之檔案組織結構 dhcp server author hui 632254504 qq.com from created 2010 10 2 udhcp 目錄下有十幾個原始檔,乙個原始檔相對應乙個模組,完成一系列相關的功能,例如在 static leases.c 主要針對...

udhcp原始碼詳解(三) 下

udhcp原始碼詳解 三 下 之配置資訊的讀取 author hui 632254504 qq.com from created 2010 10 3 上節講解了read config函式,讀取配置資訊到server config的相應成員變數裡,但read config函式只負責把配置資訊重檔案裡讀...