Преглед на файлове

dhcpclient: expose server MAC address

ambrop7 преди 14 години
родител
ревизия
9d9ee40902
променени са 3 файла, в които са добавени 64 реда и са изтрити 5 реда
  1. 40 1
      dhcpclient/BDHCPClient.c
  2. 16 2
      dhcpclient/BDHCPClientCore.c
  3. 8 2
      dhcpclient/BDHCPClientCore.h

+ 40 - 1
dhcpclient/BDHCPClient.c

@@ -87,6 +87,34 @@ static void dhcp_handler (BDHCPClient *o, int event)
     }
     }
 }
 }
 
 
+static void dhcp_func_getsendermac (BDHCPClient *o, uint8_t *out_mac)
+{
+    DebugObject_Access(&o->d_obj);
+    
+    BAddr remote_addr;
+    BIPAddr local_addr;
+    if (!BDatagram_GetLastReceiveAddrs(&o->dgram, &remote_addr, &local_addr)) {
+        BLog(BLOG_ERROR, "BDatagram_GetLastReceiveAddrs failed");
+        goto fail;
+    }
+    
+    if (remote_addr.type != BADDR_TYPE_PACKET) {
+        BLog(BLOG_ERROR, "address type invalid");
+        goto fail;
+    }
+    
+    if (remote_addr.packet.header_type != BADDR_PACKET_HEADER_TYPE_ETHERNET) {
+        BLog(BLOG_ERROR, "address header type invalid");
+        goto fail;
+    }
+    
+    memcpy(out_mac, remote_addr.packet.phys_addr, 6);
+    return;
+    
+fail:
+    memset(out_mac, 0, 6);
+}
+
 static int get_iface_info (const char *ifname, uint8_t *out_mac, int *out_mtu, int *out_ifindex)
 static int get_iface_info (const char *ifname, uint8_t *out_mac, int *out_mtu, int *out_ifindex)
 {
 {
     struct ifreq ifr;
     struct ifreq ifr;
@@ -232,7 +260,10 @@ int BDHCPClient_Init (BDHCPClient *o, const char *ifname, BReactor *reactor, BDH
     }
     }
     
     
     // init dhcp
     // init dhcp
-    if (!BDHCPClientCore_Init(&o->dhcp, PacketCopier_GetInput(&o->send_copier), PacketCopier_GetOutput(&o->recv_copier), if_mac, o->reactor, (BDHCPClientCore_handler)dhcp_handler, o)) {
+    if (!BDHCPClientCore_Init(&o->dhcp, PacketCopier_GetInput(&o->send_copier), PacketCopier_GetOutput(&o->recv_copier), if_mac, o->reactor, o,
+                              (BDHCPClientCore_func_getsendermac)dhcp_func_getsendermac,
+                              (BDHCPClientCore_handler)dhcp_handler
+    )) {
         BLog(BLOG_ERROR, "BDHCPClientCore_Init failed");
         BLog(BLOG_ERROR, "BDHCPClientCore_Init failed");
         goto fail4;
         goto fail4;
     }
     }
@@ -325,3 +356,11 @@ int BDHCPClient_GetDNS (BDHCPClient *o, uint32_t *out_dns_servers, size_t max_dn
     
     
     return BDHCPClientCore_GetDNS(&o->dhcp, out_dns_servers, max_dns_servers);
     return BDHCPClientCore_GetDNS(&o->dhcp, out_dns_servers, max_dns_servers);
 }
 }
+
+void BDHCPClient_GetServerMAC (BDHCPClient *o, uint8_t *out_mac)
+{
+    DebugObject_Access(&o->d_obj);
+    ASSERT(o->up)
+    
+    BDHCPClientCore_GetServerMAC(&o->dhcp, out_mac);
+}

+ 16 - 2
dhcpclient/BDHCPClientCore.c

@@ -446,6 +446,7 @@ static void recv_handler_done (BDHCPClientCore *o, int data_len)
         }
         }
         o->acked.domain_name_servers_count = domain_name_servers_count;
         o->acked.domain_name_servers_count = domain_name_servers_count;
         memcpy(o->acked.domain_name_servers, domain_name_servers, domain_name_servers_count * sizeof(uint32_t));
         memcpy(o->acked.domain_name_servers, domain_name_servers, domain_name_servers_count * sizeof(uint32_t));
+        o->func_getsendermac(o->user, o->acked.server_mac);
         
         
         // stop request timer
         // stop request timer
         BReactor_RemoveTimer(o->reactor, &o->request_timer);
         BReactor_RemoveTimer(o->reactor, &o->request_timer);
@@ -602,18 +603,23 @@ static void lease_timer_handler (BDHCPClientCore *o)
     return;
     return;
 }
 }
 
 
-int BDHCPClientCore_Init (BDHCPClientCore *o, PacketPassInterface *send_if, PacketRecvInterface *recv_if, uint8_t *client_mac_addr, BReactor *reactor, BDHCPClientCore_handler handler, void *user)
+int BDHCPClientCore_Init (BDHCPClientCore *o, PacketPassInterface *send_if, PacketRecvInterface *recv_if, uint8_t *client_mac_addr, BReactor *reactor, void *user,
+                          BDHCPClientCore_func_getsendermac func_getsendermac,
+                          BDHCPClientCore_handler handler)
 {
 {
     ASSERT(PacketPassInterface_GetMTU(send_if) == PacketRecvInterface_GetMTU(recv_if))
     ASSERT(PacketPassInterface_GetMTU(send_if) == PacketRecvInterface_GetMTU(recv_if))
     ASSERT(PacketPassInterface_GetMTU(send_if) >= 576 - IP_UDP_HEADERS_SIZE)
     ASSERT(PacketPassInterface_GetMTU(send_if) >= 576 - IP_UDP_HEADERS_SIZE)
+    ASSERT(func_getsendermac)
+    ASSERT(handler)
     
     
     // init arguments
     // init arguments
     o->send_if = send_if;
     o->send_if = send_if;
     o->recv_if = recv_if;
     o->recv_if = recv_if;
     memcpy(o->client_mac_addr, client_mac_addr, sizeof(o->client_mac_addr));
     memcpy(o->client_mac_addr, client_mac_addr, sizeof(o->client_mac_addr));
     o->reactor = reactor;
     o->reactor = reactor;
-    o->handler = handler;
     o->user = user;
     o->user = user;
+    o->func_getsendermac = func_getsendermac;
+    o->handler = handler;
     
     
     // allocate buffers
     // allocate buffers
     if (!(o->send_buf = BAlloc(PacketPassInterface_GetMTU(send_if)))) {
     if (!(o->send_buf = BAlloc(PacketPassInterface_GetMTU(send_if)))) {
@@ -712,3 +718,11 @@ int BDHCPClientCore_GetDNS (BDHCPClientCore *o, uint32_t *out_dns_servers, size_
     memcpy(out_dns_servers, o->acked.domain_name_servers, num_return * sizeof(uint32_t));
     memcpy(out_dns_servers, o->acked.domain_name_servers, num_return * sizeof(uint32_t));
     return num_return;
     return num_return;
 }
 }
+
+void BDHCPClientCore_GetServerMAC (BDHCPClientCore *o, uint8_t *out_mac)
+{
+    DebugObject_Access(&o->d_obj);
+    ASSERT(o->state == STATE_FINISHED || o->state == STATE_RENEWING)
+    
+    memcpy(out_mac, o->acked.server_mac, 6);
+}

+ 8 - 2
dhcpclient/BDHCPClientCore.h

@@ -41,6 +41,7 @@
 
 
 #define BDHCPCLIENTCORE_MAX_DOMAIN_NAME_SERVERS 16
 #define BDHCPCLIENTCORE_MAX_DOMAIN_NAME_SERVERS 16
 
 
+typedef void (*BDHCPClientCore_func_getsendermac) (void *user, uint8_t *out_mac);
 typedef void (*BDHCPClientCore_handler) (void *user, int event);
 typedef void (*BDHCPClientCore_handler) (void *user, int event);
 
 
 typedef struct {
 typedef struct {
@@ -48,8 +49,9 @@ typedef struct {
     PacketRecvInterface *recv_if;
     PacketRecvInterface *recv_if;
     uint8_t client_mac_addr[6];
     uint8_t client_mac_addr[6];
     BReactor *reactor;
     BReactor *reactor;
-    BDHCPClientCore_handler handler;
     void *user;
     void *user;
+    BDHCPClientCore_func_getsendermac func_getsendermac;
+    BDHCPClientCore_handler handler;
     struct dhcp_header *send_buf;
     struct dhcp_header *send_buf;
     struct dhcp_header *recv_buf;
     struct dhcp_header *recv_buf;
     int sending;
     int sending;
@@ -73,15 +75,19 @@ typedef struct {
         uint32_t router;
         uint32_t router;
         int domain_name_servers_count;
         int domain_name_servers_count;
         uint32_t domain_name_servers[BDHCPCLIENTCORE_MAX_DOMAIN_NAME_SERVERS];
         uint32_t domain_name_servers[BDHCPCLIENTCORE_MAX_DOMAIN_NAME_SERVERS];
+        uint8_t server_mac[6];
     } acked;
     } acked;
     DebugObject d_obj;
     DebugObject d_obj;
 } BDHCPClientCore;
 } BDHCPClientCore;
 
 
-int BDHCPClientCore_Init (BDHCPClientCore *o, PacketPassInterface *send_if, PacketRecvInterface *recv_if, uint8_t *client_mac_addr, BReactor *reactor, BDHCPClientCore_handler handler, void *user);
+int BDHCPClientCore_Init (BDHCPClientCore *o, PacketPassInterface *send_if, PacketRecvInterface *recv_if, uint8_t *client_mac_addr, BReactor *reactor, void *user,
+                          BDHCPClientCore_func_getsendermac func_getsendermac,
+                          BDHCPClientCore_handler handler);
 void BDHCPClientCore_Free (BDHCPClientCore *o);
 void BDHCPClientCore_Free (BDHCPClientCore *o);
 void BDHCPClientCore_GetClientIP (BDHCPClientCore *o, uint32_t *out_ip);
 void BDHCPClientCore_GetClientIP (BDHCPClientCore *o, uint32_t *out_ip);
 void BDHCPClientCore_GetClientMask (BDHCPClientCore *o, uint32_t *out_mask);
 void BDHCPClientCore_GetClientMask (BDHCPClientCore *o, uint32_t *out_mask);
 int BDHCPClientCore_GetRouter (BDHCPClientCore *o, uint32_t *out_router);
 int BDHCPClientCore_GetRouter (BDHCPClientCore *o, uint32_t *out_router);
 int BDHCPClientCore_GetDNS (BDHCPClientCore *o, uint32_t *out_dns_servers, size_t max_dns_servers);
 int BDHCPClientCore_GetDNS (BDHCPClientCore *o, uint32_t *out_dns_servers, size_t max_dns_servers);
+void BDHCPClientCore_GetServerMAC (BDHCPClientCore *o, uint8_t *out_mac);
 
 
 #endif
 #endif