}\r
return NyLPC_TBool_FALSE;\r
}\r
-static NyLPC_TBool NyLPC_TDhcpHeader_parseDHCPOFFER(const NyLPC_TUInt8* i_buf,NyLPC_TUInt16 i_len,NyLPC_TUInt32 i_xid,NyLPC_TcIPv4Config_t* result)\r
+static NyLPC_TBool NyLPC_TDhcpHeader_parseDHCPOFFER(const NyLPC_TUInt8* i_buf,NyLPC_TUInt16 i_len,NyLPC_TUInt32 i_xid,NyLPC_TcDhcpClient_t* i_inst)\r
{\r
struct NyLPC_TDhcpHeader* p=(struct NyLPC_TDhcpHeader*)i_buf;\r
//XIDのチェック\r
if(p->xid!=NyLPC_HTONL(i_xid)){\r
return NyLPC_TBool_FALSE;\r
}\r
- //サーバ情報をIPへ保存\r
- if(!getUInt32Option(i_buf,i_len,DHCP_OPT_ID_SERVER_ID,&result->ip_addr.v)){\r
+ //OFFERのclient IPアドレスをresultへ保存情報の保存\r
+ i_inst->_result->ip_addr.v=p->yiaddr;\r
+ //SERVER IDを保存\r
+ if(!getUInt32Option(i_buf,i_len,DHCP_OPT_ID_SERVER_ID,&i_inst->_offerserver.v)){\r
return NyLPC_TBool_FALSE;\r
}\r
return NyLPC_TBool_TRUE;\r
p->hlen=6;\r
p->xid=NyLPC_HTONL(i_xid);\r
p->chaddr.emac=*emac;\r
+ p->flags=NyLPC_HTONS(0x8000);\r
memcpy(i_buf+sizeof(struct NyLPC_TDhcpHeader),\r
"\x63\x82\x53\x63" //4\r
"\x35\x01\x01" //3 MESSAGE TYPE\r
"\x37\x03\x01\x03\x06" //5 REQUEST LIST(1,3,6)\r
- "\x3d\x07\x00\x00\x00\x00\x00\x00\x10" //9 CLIENT INDIFIRE\r
+ "\x3d\x07\x01\x00\x00\x00\x00\x00\x00" //9 CLIENT INDIFIRE\r
"\xff",4+3+5+9+1);\r
//emacの上書き\r
- memcpy((i_buf+sizeof(struct NyLPC_TDhcpHeader)+4+3+5+2),emac->addr,6);\r
+ memcpy((i_buf+sizeof(struct NyLPC_TDhcpHeader)+4+3+5+3),emac->addr,6);\r
//送信するパケットの長さ\r
*o_len=sizeof(struct NyLPC_TDhcpHeader)+4+3+5+9+1;\r
return;\r
}\r
-static void NyLPC_TDhcpHeader_setDHCPREQUEST(char* i_buf,NyLPC_TUInt32 i_xid,const struct NyLPC_TIPv4Addr* i_sid,const struct NyLPC_TEthAddr* emac,NyLPC_TUInt16* o_len)\r
+static void NyLPC_TDhcpHeader_setDHCPREQUEST(char* i_buf,NyLPC_TUInt32 i_xid,const struct NyLPC_TIPv4Addr* i_sid,const struct NyLPC_TIPv4Addr* i_reqid,const struct NyLPC_TEthAddr* emac,NyLPC_TUInt16* o_len)\r
{\r
struct NyLPC_TDhcpHeader* p=(struct NyLPC_TDhcpHeader*)i_buf;\r
memset(i_buf,0,sizeof(struct NyLPC_TDhcpHeader));\r
p->hlen=6;\r
p->xid=NyLPC_HTONL(i_xid);\r
p->chaddr.emac=*emac;\r
+ p->flags=NyLPC_HTONS(0x8000);\r
memcpy(i_buf+sizeof(struct NyLPC_TDhcpHeader),\r
"\x63\x82\x53\x63" //4\r
"\x35\x01\x03" //3 MESSAGE TYPE\r
"\x37\x03\x01\x03\x06" //5 REQUEST LIST(1,3,6)\r
- "\x3d\x07\x00\x00\x00\x00\x00\x00\x10" //9 CLIENT INDIFIRE\r
+ "\x3d\x07\x01\x00\x00\x00\x00\x00\x00" //9 CLIENT INDIFIRE\r
"\x36\x04\x00\x00\x00\x00" // 6 SERVER ID\r
- "\xff",4+3+5+9+6+1);\r
+ "\x32\x04\x00\x00\x00\x00" // 6 Reqested IP\r
+ "\xff",4+3+5+9+6+6+1);\r
//emacの上書き\r
- memcpy((i_buf+sizeof(struct NyLPC_TDhcpHeader)+4+3+5+2),emac->addr,6);\r
+ memcpy((i_buf+sizeof(struct NyLPC_TDhcpHeader)+4+3+5+3),emac->addr,6);\r
//sidの上書き\r
memcpy((i_buf+sizeof(struct NyLPC_TDhcpHeader)+4+3+5+9+2),i_sid,4);\r
+ //reqidの上書き\r
+ memcpy((i_buf+sizeof(struct NyLPC_TDhcpHeader)+4+3+5+9+6+2),i_reqid,4);\r
//送信するパケットの長さ\r
- *o_len=sizeof(struct NyLPC_TDhcpHeader)+4+3+5+9+6+1;\r
+ *o_len=sizeof(struct NyLPC_TDhcpHeader)+4+3+5+9+6+6+1;\r
return;\r
}\r
\r
if(buf==NULL || s<hint){\r
return NyLPC_TBool_FALSE;\r
}\r
- NyLPC_TDhcpHeader_setDHCPREQUEST(buf,i_sock->txid,&(i_sock->_result->ip_addr),&i_sock->_result->eth_mac,&s);\r
+ NyLPC_TDhcpHeader_setDHCPREQUEST(buf,i_sock->txid,&(i_sock->_offerserver),&(i_sock->_result->ip_addr),&i_sock->_result->eth_mac,&s);\r
i_sock->_status=TcDhcpSock_ST_WAIT_ACK;\r
if(!NyLPC_cUdpSocket_psend(&i_sock->super,&NyLPC_TIPv4Addr_BROADCAST,67,buf,s)){\r
NyLPC_cUdpSocket_releaseSendBuf(&i_sock->super,buf);\r
if(mt!=DHCP_OPT_ID_MESSAGETYPE_OFFER){\r
return NyLPC_TBool_FALSE;\r
}\r
- if(!NyLPC_TDhcpHeader_parseDHCPOFFER(i_buf,i_info->size,inst->txid,inst->_result)){\r
+ if(!NyLPC_TDhcpHeader_parseDHCPOFFER(i_buf,i_info->size,inst->txid,inst)){\r
return NyLPC_TBool_FALSE;\r
}\r
inst->_status=TcDhcpSock_ST_WAIT_OFFER_OK;\r