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函式只負責把配置資訊重檔案裡讀...