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

Popular posts from this blog

django - How can I change user group without delete record -

java - Need to add SOAP security token -

java - EclipseLink JPA Object is not a known entity type -