Kaynağa Gözat

BDHCPClientCore: reuse the xid a certain number of times

ambrop7 15 yıl önce
ebeveyn
işleme
dcfd1e2814
2 değiştirilmiş dosya ile 15 ekleme ve 2 silme
  1. 14 2
      dhcpclient/BDHCPClientCore.c
  2. 1 0
      dhcpclient/BDHCPClientCore.h

+ 14 - 2
dhcpclient/BDHCPClientCore.c

@@ -37,6 +37,7 @@
 #define RENEW_REQUEST_TIMEOUT 20000
 #define MAX_REQUESTS 4
 #define RENEW_TIMEOUT(lease) ((btime_t)500 * (lease))
+#define XID_REUSE_MAX 8
 
 #define LEASE_TIMEOUT(lease) ((btime_t)1000 * (lease) - RENEW_TIMEOUT(lease))
 
@@ -490,8 +491,16 @@ static void recv_handler_done (BDHCPClientCore *o, int data_len)
 
 static void start_process (BDHCPClientCore *o)
 {
-    // generate xid
-    BRandom_randomize((uint8_t *)&o->xid, sizeof(o->xid));
+    if (o->xid_reuse_counter == XID_REUSE_MAX) {
+        // generate xid
+        BRandom_randomize((uint8_t *)&o->xid, sizeof(o->xid));
+        
+        // reset counter
+        o->xid_reuse_counter = 0;
+    }
+    
+    // increment counter
+    o->xid_reuse_counter++;
     
     // send discover
     send_message(o, DHCP_MESSAGE_TYPE_DISCOVER, o->xid, 0, 0, 0, 0);
@@ -634,6 +643,9 @@ int BDHCPClientCore_Init (BDHCPClientCore *o, PacketPassInterface *send_if, Pack
     // start receving
     PacketRecvInterface_Receiver_Recv(o->recv_if, (uint8_t *)o->recv_buf);
     
+    // start with a new xid
+    o->xid_reuse_counter = XID_REUSE_MAX;
+    
     // start
     start_process(o);
     

+ 1 - 0
dhcpclient/BDHCPClientCore.h

@@ -61,6 +61,7 @@ typedef struct {
     int state;
     int request_count;
     uint32_t xid;
+    int xid_reuse_counter;
     struct {
         uint32_t yiaddr;
         uint32_t dhcp_server_identifier;