networking - DHCP Multiple IP address request -
i trying mimic dhcp client end using c++ code. objective free/unused ip's dhcp server assign different equipments - similar dhcp relay, not technically same. client
running on embedded linux platform , talks dhcp server via our internal network.
as per dhcp protocol there formal procedure (discover
, offer
, request
, ack/nak
, release
) communicate dhcp server.according rfc's(2131), when discover
, receive , offer
unused ip address in yiaddr field. further use ip address in request
message using option 50 mentioned in rfc 2132.
my main router, make- edgewater(which dhcp server) on sending discover
message, sends offer
message unused ip address in yiaddr field (i used unused ip in consequent request
message), requirement. did same experiment few other router's (netgear, dlink, broadcom) , found offer
message sending me same ip address of client
requesting unused ip's. curious know why happening. understand, i'm following steps mentioned in rfc2131/rfc2131/rfc4361 creating dhcp packet format.
is there specific format or specific option other dhcp server/routers expecting give out unused ip's? using unique client identifier in option field mentioned in rfc4361.
this snap shot of section i'm creating dhcp packet.
request_packet.m_operationcode = 0x01; request_packet.m_hwaretype = 0x01; request_packet.m_hwarelen = 0x06; request_packet.m_hops = 0x01; request_packet.m_xid = htonl(xid[m_numberofips]); request_packet.m_secs = htons(0x10); request_packet.m_flags = htons(0x8000); request_packet.m_ciaddr = 0x000000; //client ip request_packet.m_yiaddr = 0x000000; //your ip request_packet.m_siaddr = 0x000000; //server ip request_packet.m_giaddr = 0x000000; request_packet.m_chaddr[0] = macaddress[m_numberofips][0]; request_packet.m_chaddr[1] = macaddress[m_numberofips][1];//[1]; request_packet.m_chaddr[2] = macaddress[m_numberofips][2];//[2]; request_packet.m_chaddr[3] = macaddress[m_numberofips][3];//[3]; request_packet.m_chaddr[4] = macaddress[m_numberofips][4];//[4]; request_packet.m_chaddr[5] = macaddress[m_numberofips][5];//[5]; memset(request_packet.m_chaddr+6, 0, 10); memset(request_packet.m_sname, 0, 64); memset(request_packet.m_file, 0, 128); request_packet.m_poptions[0] = 99; //start of magic cookie request_packet.m_poptions[1] = 130; request_packet.m_poptions[2] = 83; request_packet.m_poptions[3] = 99; //end of magic cookie
options field
discover message
cid , duid random unique numbers create unique client identifier
request_packet.m_poptions[4] = 53; //dhcp message type option code request_packet.m_poptions[5] = 1; //option data len request_packet.m_poptions[6] = 1; //dhcp discover request_packet.m_poptions[7] = 55; //parameter request list request_packet.m_poptions[8] = 7; //length request_packet.m_poptions[9] = 1; //subnet mask request_packet.m_poptions[10] = 3; //router request_packet.m_poptions[11] = 6; //domain name server request_packet.m_poptions[12] = 12; // host name request_packet.m_poptions[13] = 15; //domain name request_packet.m_poptions[14] = 28; //broadcast address request_packet.m_poptions[15] = 42; //ntp servers request_packet.m_poptions[16] = 51; //ip address lease time request_packet.m_poptions[17] = 4; request_packet.m_poptions[18] = 0x00; request_packet.m_poptions[19] = 0x00; request_packet.m_poptions[20] = 0xff; request_packet.m_poptions[21] = 0xff; request_packet.m_poptions[22] = 61;//client identifier code request_packet.m_poptions[23] = 15;//length request_packet.m_poptions[24] = 255;//iaid type printf("the cid generated inside request %x\n", cid[m_numberofips]); request_packet.m_poptions[25] = cid[m_numberofips][0]; request_packet.m_poptions[26] = cid[m_numberofips][1]; request_packet.m_poptions[27] = cid[m_numberofips][2]; request_packet.m_poptions[28] = cid[m_numberofips][3]; request_packet.m_poptions[29] = 0x00;//duid type request_packet.m_poptions[30] = 0x03;//duid type request_packet.m_poptions[31] = 0x00;//hw type code - ethernet request_packet.m_poptions[32] = 0x01;//hw type code - ethernet request_packet.m_poptions[33] = duid[m_numberofips][0]; request_packet.m_poptions[34] = duid[m_numberofips][1]; request_packet.m_poptions[35] = duid[m_numberofips][2]; request_packet.m_poptions[36] = duid[m_numberofips][3]; request_packet.m_poptions[37] = duid[m_numberofips][4]; request_packet.m_poptions[38] = duid[m_numberofips][5]; request_packet.m_poptions[39] = (0xff); // end option
request message
request_packet.m_poptions[4] = 53; //dhcp message type option code request_packet.m_poptions[5] = 1; //option data len request_packet.m_poptions[6] = 3; //dhcp request request_packet.m_poptions[7] = 50; //dhcp requestion option request_packet.m_poptions[8] = 4; //option data len request_packet.m_poptions[9] = (m_yourip & 0xff000000)>>24; //first byte request_packet.m_poptions[10] = (m_yourip & 0xff0000)>>16; //second byte request_packet.m_poptions[11] = (m_yourip & 0xff00)>>8; //third byte request_packet.m_poptions[12] = (m_yourip & 0xff); //fourth byte /*- added ja. refer 3.1.3 section of rfc2131.txt - server identifier option*/ request_packet.m_poptions[13] = 54; request_packet.m_poptions[14] = 4; request_packet.m_poptions[15] = (m_serverip & 0xff000000) >> 24; //first byte request_packet.m_poptions[16] = (m_serverip & 0xff0000)>>16; //second byte request_packet.m_poptions[17] = (m_serverip & 0xff00)>>8; //third byte request_packet.m_poptions[18] = (m_serverip & 0xff); //fourth byte request_packet.m_poptions[19] = 55; //parameter request list request_packet.m_poptions[20] = 7; //length request_packet.m_poptions[21] = 1; //subnet mask request_packet.m_poptions[22] = 3; //router request_packet.m_poptions[23] = 6; //domain name server request_packet.m_poptions[24] = 12; // host name request_packet.m_poptions[25] = 15; //domain name request_packet.m_poptions[26] = 28; //broadcast address request_packet.m_poptions[27] = 42; //ntp servers request_packet.m_poptions[28] = 51; //ip address lease time request_packet.m_poptions[29] = 4; request_packet.m_poptions[30] = 0x00; request_packet.m_poptions[31] = 0x00; request_packet.m_poptions[32] = 0xff; request_packet.m_poptions[33] = 0xff; /*- added ja. refer 6.1 section of rfc4361.txt - client identifier option*/ request_packet.m_poptions[34] = 61;//client identifier code request_packet.m_poptions[35] = 15;//length request_packet.m_poptions[36] = 255;//iaid type printf("the cid generated inside request %x\n", cid[m_numberofips]); request_packet.m_poptions[37] = cid[m_numberofips][0]; request_packet.m_poptions[38] = cid[m_numberofips][1]; request_packet.m_poptions[39] = cid[m_numberofips][2]; request_packet.m_poptions[40] = cid[m_numberofips][3]; request_packet.m_poptions[41] = 0x00;//duid type request_packet.m_poptions[42] = 0x03;//duid type request_packet.m_poptions[43] = 0x00;//hw type code - ethernet request_packet.m_poptions[44] = 0x01;//hw type code - ethernet request_packet.m_poptions[45] = duid[m_numberofips][0]; request_packet.m_poptions[46] = duid[m_numberofips][1]; request_packet.m_poptions[47] = duid[m_numberofips][2]; request_packet.m_poptions[48] = duid[m_numberofips][3]; request_packet.m_poptions[49] = duid[m_numberofips][4]; request_packet.m_poptions[50] = duid[m_numberofips][5]; request_packet.m_poptions[51] = (0xff); // end option
using router dhcp relay , server assign unique ip based dhcp subnetwork configured on 10.1.2.0/24 pool defined on router dhcp requests assign first non-allocated ip against mac , assignment random can not reserve mac on router.after dora triggers lease timer mac-ip .
if use dhcp server microsoft/unix they have extended functionality reserving ip particular mac permanently.
Comments
Post a Comment