mirror of
				https://github.com/Telecominfraproject/wlan-ap.git
				synced 2025-10-31 10:28:06 +00:00 
			
		
		
		
	opensync: DHCP synthetic client support added
- synthetic dhcp client checks if the dhcp server is responsive and reports back to cloud Fixes: WIFI-441 Signed-off-by: Ammad Rehmat <ammad.rehmat@connectus.ai>
This commit is contained in:
		 Ammad Rehmat
					Ammad Rehmat
				
			
				
					committed by
					
						 John Crispin
						John Crispin
					
				
			
			
				
	
			
			
			 John Crispin
						John Crispin
					
				
			
						parent
						
							ff9357ae43
						
					
				
				
					commit
					5d9ea412e5
				
			
							
								
								
									
										54
									
								
								feeds/wlan-ap/opensync/patches/16-dhcp-client.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								feeds/wlan-ap/opensync/patches/16-dhcp-client.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,54 @@ | |||||||
|  | Index: opensync-2.0.5.0/src/lib/datapipeline/inc/dpp_network_probe.h | ||||||
|  | =================================================================== | ||||||
|  | --- opensync-2.0.5.0.orig/src/lib/datapipeline/inc/dpp_network_probe.h | ||||||
|  | +++ opensync-2.0.5.0/src/lib/datapipeline/inc/dpp_network_probe.h | ||||||
|  | @@ -7,7 +7,7 @@ | ||||||
|  |  #include "dpp_types.h" | ||||||
|  |   | ||||||
|  |  #define MAX_IP_ADDR_SIZE 16 | ||||||
|  | - | ||||||
|  | +#define MAX_IF_NAME_SIZE 16 | ||||||
|  |  typedef enum | ||||||
|  |  { | ||||||
|  |      SUD_down = 0, | ||||||
|  | @@ -26,7 +26,7 @@ typedef struct | ||||||
|  |  /* VLAN probe metrics */ | ||||||
|  |  typedef struct | ||||||
|  |  { | ||||||
|  | -    char*	          vlanIF; | ||||||
|  | +    char	          vlanIF[MAX_IF_NAME_SIZE]; | ||||||
|  |      StateUpDown_t           dhcpState; | ||||||
|  |      uint32_t              dhcpLatency; | ||||||
|  |      StateUpDown_t           dnsState; | ||||||
|  | Index: opensync-2.0.5.0/src/lib/datapipeline/src/dppline.c | ||||||
|  | =================================================================== | ||||||
|  | --- opensync-2.0.5.0.orig/src/lib/datapipeline/src/dppline.c | ||||||
|  | +++ opensync-2.0.5.0/src/lib/datapipeline/src/dppline.c | ||||||
|  | @@ -647,7 +647,8 @@ static bool dppline_copysts(dppline_stat | ||||||
|  |             { | ||||||
|  |                  dpp_network_probe_report_data_t *report_data = sts; | ||||||
|  |                  memcpy(&dst->u.network_probe.record.dns_probe, &report_data->record.dns_probe, sizeof(dpp_dns_metrics_t)); | ||||||
|  | -                dst->u.network_probe.timestamp_ms = report_data->timestamp_ms; | ||||||
|  | +                memcpy(&dst->u.network_probe.record.vlan_probe, &report_data->record.vlan_probe, sizeof(dpp_vlan_metrics_t)); | ||||||
|  | +		dst->u.network_probe.timestamp_ms = report_data->timestamp_ms; | ||||||
|  |             } | ||||||
|  |             break; | ||||||
|  |          default: | ||||||
|  | @@ -1619,6 +1620,17 @@ static void dppline_add_stat_network_pro | ||||||
|  |      sr->dns_probe->latency = network_probe->record.dns_probe.latency; | ||||||
|  |      sr->dns_probe->has_latency = true; | ||||||
|  |   | ||||||
|  | +    sr->vlan_probe = malloc(sizeof(*sr->vlan_probe)); | ||||||
|  | +    size += sizeof(*sr->vlan_probe); | ||||||
|  | +    assert(sr->vlan_probe); | ||||||
|  | +    sts__vlanmetrics__init(sr->vlan_probe); | ||||||
|  | +    sr->vlan_probe->vlanif = strdup(network_probe->record.vlan_probe.vlanIF); | ||||||
|  | +    size += strlen(network_probe->record.vlan_probe.vlanIF) + 1; | ||||||
|  | +    sr->vlan_probe->dhcpstate = network_probe->record.vlan_probe.dhcpState; | ||||||
|  | +    sr->vlan_probe->has_dhcpstate = true; | ||||||
|  | +    sr->vlan_probe->dhcplatency = network_probe->record.vlan_probe.dhcpLatency; | ||||||
|  | +    sr->vlan_probe->has_dhcplatency = true; | ||||||
|  | + | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  static void dppline_add_stat_bs_client(Sts__Report * r, dppline_stats_t * s) | ||||||
| @@ -0,0 +1,272 @@ | |||||||
|  | /* SPDX-License-Identifier: BSD-3-Clause */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | char *dhcp_opt[]={ | ||||||
|  | 	"", | ||||||
|  | /*   1 */	"Subnet mask", | ||||||
|  | /*   2 */	"", | ||||||
|  | /*   3 */	"Router", | ||||||
|  | /*   4 */	"", | ||||||
|  | /*   5 */	"", | ||||||
|  | /*   6 */	"DNS server", | ||||||
|  | /*   7 */	"", | ||||||
|  | /*   8 */	"", | ||||||
|  | /*   9 */	"", | ||||||
|  | /*  10 */	"", | ||||||
|  | /*  11 */	"", | ||||||
|  | /*  12 */	"", | ||||||
|  | /*  13 */	"", | ||||||
|  | /*  14 */	"", | ||||||
|  | /*  15 */	"Domainname", | ||||||
|  | /*  16 */	"", | ||||||
|  | /*  17 */	"", | ||||||
|  | /*  18 */	"", | ||||||
|  | /*  19 */	"", | ||||||
|  | /*  20 */	"", | ||||||
|  | /*  21 */	"", | ||||||
|  | /*  22 */	"", | ||||||
|  | /*  23 */	"", | ||||||
|  | /*  24 */	"", | ||||||
|  | /*  25 */	"", | ||||||
|  | /*  26 */	"", | ||||||
|  | /*  27 */	"", | ||||||
|  | /*  28 */	"", | ||||||
|  | /*  29 */	"", | ||||||
|  | /*  30 */	"", | ||||||
|  | /*  31 */	"", | ||||||
|  | /*  32 */	"", | ||||||
|  | /*  33 */	"", | ||||||
|  | /*  34 */	"", | ||||||
|  | /*  35 */	"", | ||||||
|  | /*  36 */	"", | ||||||
|  | /*  37 */	"", | ||||||
|  | /*  38 */	"", | ||||||
|  | /*  39 */	"", | ||||||
|  | /*  40 */	"", | ||||||
|  | /*  41 */	"", | ||||||
|  | /*  42 */	"", | ||||||
|  | /*  43 */	"", | ||||||
|  | /*  44 */	"", | ||||||
|  | /*  45 */	"", | ||||||
|  | /*  46 */	"", | ||||||
|  | /*  47 */	"", | ||||||
|  | /*  48 */	"", | ||||||
|  | /*  49 */	"", | ||||||
|  | /*  50 */	"Request IP address", | ||||||
|  | /*  51 */	"IP address leasetime", | ||||||
|  | /*  52 */	"", | ||||||
|  | /*  53 */	"DHCP message type", | ||||||
|  | /*  54 */	"Server identifier", | ||||||
|  | /*  55 */	"", | ||||||
|  | /*  56 */	"Message", | ||||||
|  | /*  57 */	"", | ||||||
|  | /*  58 */	"T1", | ||||||
|  | /*  59 */	"T2", | ||||||
|  | /*  60 */	"", | ||||||
|  | /*  61 */	"Client-identifier", | ||||||
|  | /*  62 */	"", | ||||||
|  | /*  63 */	"", | ||||||
|  | /*  64 */	"", | ||||||
|  | /*  65 */	"", | ||||||
|  | /*  66 */	"", | ||||||
|  | /*  67 */	"", | ||||||
|  | /*  68 */	"", | ||||||
|  | /*  69 */	"", | ||||||
|  | /*  70 */	"", | ||||||
|  | /*  71 */	"", | ||||||
|  | /*  72 */	"", | ||||||
|  | /*  73 */	"", | ||||||
|  | /*  74 */	"", | ||||||
|  | /*  75 */	"", | ||||||
|  | /*  76 */	"", | ||||||
|  | /*  77 */	"", | ||||||
|  | /*  78 */	"", | ||||||
|  | /*  79 */	"", | ||||||
|  | /*  80 */	"", | ||||||
|  | /*  81 */	"", | ||||||
|  | /*  82 */	"", | ||||||
|  | /*  83 */	"", | ||||||
|  | /*  84 */	"", | ||||||
|  | /*  85 */	"", | ||||||
|  | /*  86 */	"", | ||||||
|  | /*  87 */	"", | ||||||
|  | /*  88 */	"", | ||||||
|  | /*  89 */	"", | ||||||
|  | /*  90 */	"", | ||||||
|  | /*  91 */	"", | ||||||
|  | /*  92 */	"", | ||||||
|  | /*  93 */	"", | ||||||
|  | /*  94 */	"", | ||||||
|  | /*  95 */	"", | ||||||
|  | /*  96 */	"", | ||||||
|  | /*  97 */	"", | ||||||
|  | /*  98 */	"", | ||||||
|  | /*  99 */	"", | ||||||
|  | /* 100 */	"", | ||||||
|  | /* 101 */	"", | ||||||
|  | /* 102 */	"", | ||||||
|  | /* 103 */	"", | ||||||
|  | /* 104 */	"", | ||||||
|  | /* 105 */	"", | ||||||
|  | /* 106 */	"", | ||||||
|  | /* 107 */	"", | ||||||
|  | /* 108 */	"", | ||||||
|  | /* 109 */	"", | ||||||
|  | /* 110 */	"", | ||||||
|  | /* 111 */	"", | ||||||
|  | /* 112 */	"", | ||||||
|  | /* 113 */	"", | ||||||
|  | /* 114 */	"", | ||||||
|  | /* 115 */	"", | ||||||
|  | /* 116 */	"", | ||||||
|  | /* 117 */	"", | ||||||
|  | /* 118 */	"", | ||||||
|  | /* 119 */	"", | ||||||
|  | /* 120 */	"", | ||||||
|  | /* 121 */	"", | ||||||
|  | /* 122 */	"", | ||||||
|  | /* 123 */	"", | ||||||
|  | /* 124 */	"", | ||||||
|  | /* 125 */	"", | ||||||
|  | /* 126 */	"", | ||||||
|  | /* 127 */	"", | ||||||
|  | /* 128 */	"", | ||||||
|  | /* 129 */	"", | ||||||
|  | /* 130 */	"", | ||||||
|  | /* 131 */	"", | ||||||
|  | /* 132 */	"", | ||||||
|  | /* 133 */	"", | ||||||
|  | /* 134 */	"", | ||||||
|  | /* 135 */	"", | ||||||
|  | /* 136 */	"", | ||||||
|  | /* 137 */	"", | ||||||
|  | /* 138 */	"", | ||||||
|  | /* 139 */	"", | ||||||
|  | /* 140 */	"", | ||||||
|  | /* 141 */	"", | ||||||
|  | /* 142 */	"", | ||||||
|  | /* 143 */	"", | ||||||
|  | /* 144 */	"", | ||||||
|  | /* 145 */	"", | ||||||
|  | /* 146 */	"", | ||||||
|  | /* 147 */	"", | ||||||
|  | /* 148 */	"", | ||||||
|  | /* 149 */	"", | ||||||
|  | /* 150 */	"", | ||||||
|  | /* 151 */	"", | ||||||
|  | /* 152 */	"", | ||||||
|  | /* 153 */	"", | ||||||
|  | /* 154 */	"", | ||||||
|  | /* 155 */	"", | ||||||
|  | /* 156 */	"", | ||||||
|  | /* 157 */	"", | ||||||
|  | /* 158 */	"", | ||||||
|  | /* 159 */	"", | ||||||
|  | /* 160 */	"", | ||||||
|  | /* 161 */	"", | ||||||
|  | /* 162 */	"", | ||||||
|  | /* 163 */	"", | ||||||
|  | /* 164 */	"", | ||||||
|  | /* 165 */	"", | ||||||
|  | /* 166 */	"", | ||||||
|  | /* 167 */	"", | ||||||
|  | /* 168 */	"", | ||||||
|  | /* 169 */	"", | ||||||
|  | /* 170 */	"", | ||||||
|  | /* 171 */	"", | ||||||
|  | /* 172 */	"", | ||||||
|  | /* 173 */	"", | ||||||
|  | /* 174 */	"", | ||||||
|  | /* 175 */	"", | ||||||
|  | /* 176 */	"", | ||||||
|  | /* 177 */	"", | ||||||
|  | /* 178 */	"", | ||||||
|  | /* 179 */	"", | ||||||
|  | /* 180 */	"", | ||||||
|  | /* 181 */	"", | ||||||
|  | /* 182 */	"", | ||||||
|  | /* 183 */	"", | ||||||
|  | /* 184 */	"", | ||||||
|  | /* 185 */	"", | ||||||
|  | /* 186 */	"", | ||||||
|  | /* 187 */	"", | ||||||
|  | /* 188 */	"", | ||||||
|  | /* 189 */	"", | ||||||
|  | /* 190 */	"", | ||||||
|  | /* 191 */	"", | ||||||
|  | /* 192 */	"", | ||||||
|  | /* 193 */	"", | ||||||
|  | /* 194 */	"", | ||||||
|  | /* 195 */	"", | ||||||
|  | /* 196 */	"", | ||||||
|  | /* 197 */	"", | ||||||
|  | /* 198 */	"", | ||||||
|  | /* 199 */	"", | ||||||
|  | /* 200 */	"", | ||||||
|  | /* 201 */	"", | ||||||
|  | /* 202 */	"", | ||||||
|  | /* 203 */	"", | ||||||
|  | /* 204 */	"", | ||||||
|  | /* 205 */	"", | ||||||
|  | /* 206 */	"", | ||||||
|  | /* 207 */	"", | ||||||
|  | /* 208 */	"", | ||||||
|  | /* 209 */	"", | ||||||
|  | /* 210 */	"", | ||||||
|  | /* 211 */	"", | ||||||
|  | /* 212 */	"", | ||||||
|  | /* 213 */	"", | ||||||
|  | /* 214 */	"", | ||||||
|  | /* 215 */	"", | ||||||
|  | /* 216 */	"", | ||||||
|  | /* 217 */	"", | ||||||
|  | /* 218 */	"", | ||||||
|  | /* 219 */	"", | ||||||
|  | /* 220 */	"", | ||||||
|  | /* 221 */	"", | ||||||
|  | /* 222 */	"", | ||||||
|  | /* 223 */	"", | ||||||
|  | /* 224 */	"", | ||||||
|  | /* 225 */	"", | ||||||
|  | /* 226 */	"", | ||||||
|  | /* 227 */	"", | ||||||
|  | /* 228 */	"", | ||||||
|  | /* 229 */	"", | ||||||
|  | /* 230 */	"", | ||||||
|  | /* 231 */	"", | ||||||
|  | /* 232 */	"", | ||||||
|  | /* 233 */	"", | ||||||
|  | /* 234 */	"", | ||||||
|  | /* 235 */	"", | ||||||
|  | /* 236 */	"", | ||||||
|  | /* 237 */	"", | ||||||
|  | /* 238 */	"", | ||||||
|  | /* 239 */	"", | ||||||
|  | /* 240 */	"", | ||||||
|  | /* 241 */	"", | ||||||
|  | /* 242 */	"", | ||||||
|  | /* 243 */	"", | ||||||
|  | /* 244 */	"", | ||||||
|  | /* 245 */	"", | ||||||
|  | /* 246 */	"", | ||||||
|  | /* 247 */	"", | ||||||
|  | /* 248 */	"", | ||||||
|  | /* 249 */	"", | ||||||
|  | /* 250 */	"", | ||||||
|  | /* 251 */	"", | ||||||
|  | /* 252 */	"", | ||||||
|  | /* 253 */	"", | ||||||
|  | /* 254 */	"", | ||||||
|  | /* 255 */	"End"}; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | char *dhcp_message_types[]={ | ||||||
|  | 		"", | ||||||
|  | /*   1 */	"DHCPDISCOVER", | ||||||
|  | /*   2 */	"DHCPOFFER", | ||||||
|  | /*   3 */	"DHCPREQUEST", | ||||||
|  | /*   4 */	"DHCPDECLINE", | ||||||
|  | /*   5 */	"DHCPACK", | ||||||
|  | /*   6 */	"DHCPNAK", | ||||||
|  | /*   7 */	"DHCPRELEASE", | ||||||
|  | /*   8 */	"DHCPINFORM"}; | ||||||
| @@ -0,0 +1,3 @@ | |||||||
|  | /* SPDX-License-Identifier: BSD-3-Clause */ | ||||||
|  |  | ||||||
|  | bool generateQuery(const char *ifname); | ||||||
| @@ -41,6 +41,7 @@ UNIT_SRC_TOP += $(OVERRIDE_DIR)/src/utils.c | |||||||
| UNIT_SRC_TOP += $(OVERRIDE_DIR)/src/iface.c | UNIT_SRC_TOP += $(OVERRIDE_DIR)/src/iface.c | ||||||
| UNIT_SRC_TOP += $(OVERRIDE_DIR)/src/vlan.c | UNIT_SRC_TOP += $(OVERRIDE_DIR)/src/vlan.c | ||||||
| UNIT_SRC_TOP += $(OVERRIDE_DIR)/src/sysupgrade.c | UNIT_SRC_TOP += $(OVERRIDE_DIR)/src/sysupgrade.c | ||||||
|  | UNIT_SRC_TOP += $(OVERRIDE_DIR)/src/dhcpdiscovery.c | ||||||
|  |  | ||||||
| CONFIG_USE_KCONFIG=y | CONFIG_USE_KCONFIG=y | ||||||
| CONFIG_INET_ETH_LINUX=y | CONFIG_INET_ETH_LINUX=y | ||||||
|   | |||||||
							
								
								
									
										482
									
								
								feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/dhcpdiscovery.c
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										482
									
								
								feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/dhcpdiscovery.c
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,482 @@ | |||||||
|  | /* SPDX-License-Identifier: BSD-3-Clause */ | ||||||
|  |  | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <sys/types.h> | ||||||
|  | #include <sys/socket.h> | ||||||
|  | #include <sys/time.h> | ||||||
|  | #include <sys/uio.h> | ||||||
|  | #include <netinet/in.h> | ||||||
|  | #include <net/if.h> | ||||||
|  | #include <unistd.h> | ||||||
|  | #include <netdb.h> | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <string.h> | ||||||
|  | #include <time.h> | ||||||
|  | #include <sys/ioctl.h> | ||||||
|  | #include "target.h" | ||||||
|  | #include "dhcp_opt.h" | ||||||
|  | #include "dhcpdiscovery.h" | ||||||
|  | //#include "wc-dhcpdiscoveryDebug.h" | ||||||
|  |  | ||||||
|  | #define BUF_SIZ 256*256 | ||||||
|  | #define MESSAGE_NOT_RECEIVED -1 | ||||||
|  | #define WAIT_TIMEOUT_SECONDS 30 | ||||||
|  |  | ||||||
|  | #define DISCOVER 0x01 | ||||||
|  | #define OFFER 0x02 | ||||||
|  | #define REQUEST 0x03 | ||||||
|  | #define ACK_REQUEST 0x05 | ||||||
|  | #define NACK_REQUEST 0x06 | ||||||
|  | #define RELEASE 0x07 | ||||||
|  |  | ||||||
|  | #define TRUE 1 | ||||||
|  | #define FALSE 0 | ||||||
|  |  | ||||||
|  | int offset=0; | ||||||
|  | void addpacket(char *pktbuf,char *msgbuf,int size) { | ||||||
|  |    memcpy(pktbuf+offset,msgbuf,size); | ||||||
|  |    offset+=size; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | struct sockaddr_in dhcp_to; | ||||||
|  | int _serveripaddress; | ||||||
|  |  | ||||||
|  | struct Answer_t | ||||||
|  | { | ||||||
|  |    int messageType; | ||||||
|  |    char offeredIP[255]; | ||||||
|  |    char serverIP[255]; | ||||||
|  |    char primaryDNS[255]; | ||||||
|  |    char secondaryDNS[255]; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Use to setup the DHCP client | ||||||
|  |  */ | ||||||
|  | int dhcp_setup(const char * serveripaddress, const char * device) | ||||||
|  | { | ||||||
|  |    struct hostent *hostent; | ||||||
|  |    const int flag = 1; | ||||||
|  |    struct sockaddr_in name; | ||||||
|  |    struct ifreq ifr; | ||||||
|  |    int dhcp_socket; | ||||||
|  |  | ||||||
|  |    /* We populate the interface info */ | ||||||
|  |    memset(&ifr, 0, sizeof(ifr)); | ||||||
|  |    snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s\n", device); | ||||||
|  |  | ||||||
|  |    /* | ||||||
|  |     * setup sending socket | ||||||
|  |     */ | ||||||
|  |    if ((hostent=gethostbyname(serveripaddress))==NULL) { | ||||||
|  |       return 0; | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    dhcp_to.sin_family=AF_INET; | ||||||
|  |    bcopy(hostent->h_addr,&dhcp_to.sin_addr.s_addr,hostent->h_length); | ||||||
|  |  | ||||||
|  |    _serveripaddress=ntohl(dhcp_to.sin_addr.s_addr); | ||||||
|  |  | ||||||
|  |    dhcp_to.sin_port=htons(67); | ||||||
|  |  | ||||||
|  |    if ((dhcp_socket=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP))==-1) | ||||||
|  |    { | ||||||
|  |       return 0; | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    if (setsockopt (dhcp_socket, SOL_SOCKET, SO_REUSEADDR, (char *)&flag, sizeof flag) < 0) { | ||||||
|  |       return 0; | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    if (setsockopt(dhcp_socket,SOL_SOCKET,SO_BROADCAST,(char *)&flag, sizeof flag) < 0) { | ||||||
|  |       return 0; | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    name.sin_family = AF_INET; | ||||||
|  |    name.sin_port = htons(68); | ||||||
|  |    name.sin_addr.s_addr = INADDR_ANY; | ||||||
|  |  | ||||||
|  |    memset (name.sin_zero, 0, sizeof (name.sin_zero)); | ||||||
|  |  | ||||||
|  |    if (bind (dhcp_socket, (struct sockaddr *)&name, sizeof name) < 0) { | ||||||
|  |       return 0; | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    return dhcp_socket; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void parseDhcpMessage(unsigned char *buffer,int size, struct Answer_t * response) | ||||||
|  | { | ||||||
|  |    int j; | ||||||
|  |    unsigned char serveridentifier[4]; | ||||||
|  |  | ||||||
|  |    sprintf(response -> offeredIP, "%d.%d.%d.%d", buffer[16],buffer[17],buffer[18],buffer[19]); | ||||||
|  |  | ||||||
|  |    j=236; | ||||||
|  |    j+=4;	/* cookie */ | ||||||
|  |    while (j<size && buffer[j]!=255 && buffer[j] != 0) | ||||||
|  |    { | ||||||
|  |       switch (buffer[j]) { | ||||||
|  |       case 53: | ||||||
|  |          response -> messageType = buffer[j+2]; | ||||||
|  |          break; | ||||||
|  |  | ||||||
|  |       case 54: | ||||||
|  |          memcpy(serveridentifier,buffer+j+2,4); | ||||||
|  |          sprintf(response -> serverIP, "%d.%d.%d.%d", | ||||||
|  |                serveridentifier[0],serveridentifier[1], | ||||||
|  |                serveridentifier[2],serveridentifier[3]); | ||||||
|  |  | ||||||
|  |          break; | ||||||
|  |       case 6: // DNS server | ||||||
|  |       { | ||||||
|  |          int i=0; | ||||||
|  |  | ||||||
|  |          for(i=0; i<buffer[j+1]; i+=4) | ||||||
|  |          { | ||||||
|  |             char dnsServer[256]; | ||||||
|  |  | ||||||
|  |             /* We keep a string of this */ | ||||||
|  |             sprintf(dnsServer,"%d.%d.%d.%d", buffer[j+2+i],buffer[j+3+i],buffer[j+4+i],buffer[j+5+i]); | ||||||
|  |  | ||||||
|  |             if(i == 0) | ||||||
|  |             { | ||||||
|  |                strcpy(response -> primaryDNS, dnsServer); | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                strcpy(response -> secondaryDNS, dnsServer); | ||||||
|  |             } | ||||||
|  |          } | ||||||
|  |          break; | ||||||
|  |       } // case DNS server | ||||||
|  |  | ||||||
|  |       default: | ||||||
|  |          break; | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       /* | ||||||
|  | 	// This might go wrong if a mallformed packet is received. | ||||||
|  | 	// Maybe from a bogus server which is instructed to reply | ||||||
|  | 	// with invalid data and thus causing an exploit. | ||||||
|  | 	// My head hurts... but I think it's solved by the checking | ||||||
|  | 	// for j<size at the begin of the while-loop. | ||||||
|  |        */ | ||||||
|  |       j+=buffer[j+1]+2; | ||||||
|  |    } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void send_dhcp_packet(int dhcp_socket,int type, const char *ipaddr,const char *opt50,const char *gwaddr, const char *hardware) { | ||||||
|  |    static time_t l=0; | ||||||
|  |    char msgbuf[BUF_SIZ]; | ||||||
|  |    char pktbuf[BUF_SIZ]; | ||||||
|  |    int ip[4],gw[4],hw[16],ip50[4]; | ||||||
|  |    int hwcount; | ||||||
|  |  | ||||||
|  |    sscanf(ipaddr,"%d.%d.%d.%d",&ip[0],&ip[1],&ip[2],&ip[3]); | ||||||
|  |    sscanf(gwaddr,"%d.%d.%d.%d",&gw[0],&gw[1],&gw[2],&gw[3]); | ||||||
|  |    if (opt50) | ||||||
|  |       sscanf(opt50,"%d.%d.%d.%d",&ip50[0],&ip50[1],&ip50[2],&ip50[3]); | ||||||
|  |    memset(&hw,0,sizeof(hw)); | ||||||
|  |    hwcount=sscanf(hardware,"%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x", | ||||||
|  |          &hw[0],&hw[1],&hw[2],&hw[3], | ||||||
|  |          &hw[4],&hw[5],&hw[6],&hw[7], | ||||||
|  |          &hw[8],&hw[9],&hw[10],&hw[11], | ||||||
|  |          &hw[12],&hw[13],&hw[14],&hw[15]); | ||||||
|  |  | ||||||
|  |    memset(msgbuf,0,sizeof(msgbuf)); | ||||||
|  |    sprintf(msgbuf,"\1\1%c%c",hwcount,0); | ||||||
|  |    addpacket(pktbuf,msgbuf,4); | ||||||
|  |  | ||||||
|  |    /* xid */ | ||||||
|  |    if (l>time(NULL)) | ||||||
|  |       l++; | ||||||
|  |    else | ||||||
|  |       l=time(NULL); | ||||||
|  |    memcpy(msgbuf,&l,4); | ||||||
|  |    addpacket(pktbuf,msgbuf,4); | ||||||
|  |  | ||||||
|  |    /* secs */ | ||||||
|  |    memset(msgbuf,0,2); | ||||||
|  |    addpacket(pktbuf,msgbuf,2); | ||||||
|  |  | ||||||
|  |    /* Broacast flag */ | ||||||
|  |    unsigned short int flag = htons(0/*32768*/); | ||||||
|  |    memcpy(msgbuf, &flag, 2); | ||||||
|  |    addpacket(pktbuf,msgbuf,2); | ||||||
|  |  | ||||||
|  |    /*  sprintf(msgbuf,"%c%c",0x80,0x00); */ | ||||||
|  |    /*  sprintf(msgbuf,"%c%c",0x00,0x00); */ | ||||||
|  |    /*  addpacket(pktbuf,msgbuf,2); */ | ||||||
|  |  | ||||||
|  |    /* ciaddr. We don't assume we're the client's ip until it's confirmed */ | ||||||
|  |    memset(msgbuf,0,4); | ||||||
|  |    if(type != REQUEST) | ||||||
|  |    { | ||||||
|  |       sprintf(msgbuf,"%c%c%c%c",ip[0],ip[1],ip[2],ip[3]); | ||||||
|  |    } | ||||||
|  |    addpacket(pktbuf,msgbuf,4); | ||||||
|  |  | ||||||
|  |    /* yiaddr */ | ||||||
|  |    memset(msgbuf,0,4); | ||||||
|  |    addpacket(pktbuf,msgbuf,4); | ||||||
|  |  | ||||||
|  |    /* siaddr */ | ||||||
|  |    memset(msgbuf,0,4); | ||||||
|  |    addpacket(pktbuf,msgbuf,4); | ||||||
|  |  | ||||||
|  |    /* giaddr */ | ||||||
|  |    sprintf(msgbuf,"%c%c%c%c",gw[0],gw[1],gw[2],gw[3]); | ||||||
|  |    addpacket(pktbuf,msgbuf,4); | ||||||
|  |  | ||||||
|  |    /* chaddr */ | ||||||
|  |    sprintf(msgbuf,"%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c", | ||||||
|  |          hw[0],hw[1],hw[2],hw[3],hw[4],hw[5],hw[6],hw[7], | ||||||
|  |          hw[8],hw[9],hw[10],hw[11],hw[12],hw[13],hw[14],hw[15]); | ||||||
|  |    addpacket(pktbuf,msgbuf,16); | ||||||
|  |  | ||||||
|  |    /* sname */ | ||||||
|  |    memset(msgbuf,0,64); | ||||||
|  |    addpacket(pktbuf,msgbuf,64); | ||||||
|  |  | ||||||
|  |    /* file */ | ||||||
|  |    memset(msgbuf,0,128); | ||||||
|  |    addpacket(pktbuf,msgbuf,128); | ||||||
|  |  | ||||||
|  |    /* options */ | ||||||
|  |    { | ||||||
|  |       /* cookie */ | ||||||
|  |       sprintf(msgbuf,"%c%c%c%c",99,130,83,99); | ||||||
|  |       addpacket(pktbuf,msgbuf,4); | ||||||
|  |  | ||||||
|  |       /* dhcp-type */ | ||||||
|  |       sprintf(msgbuf,"%c%c%c",53,1,type); | ||||||
|  |       addpacket(pktbuf,msgbuf,3); | ||||||
|  |  | ||||||
|  |       /* Not for inform */ | ||||||
|  |       if (type!=8) | ||||||
|  |       { | ||||||
|  |          if(type == REQUEST) | ||||||
|  |          { | ||||||
|  |             // We need to put the server we're requesting from | ||||||
|  |             sprintf(msgbuf,"%c%c%c%c%c%c",54,4,ip[0],ip[1],ip[2],ip[3]); | ||||||
|  |             addpacket(pktbuf,msgbuf,6); | ||||||
|  |          } | ||||||
|  |  | ||||||
|  |          /* requested IP address */ | ||||||
|  |          if (opt50) | ||||||
|  |          { | ||||||
|  |             sprintf(msgbuf,"%c%c%c%c%c%c",50,4,ip50[0],ip50[1],ip50[2],ip50[3]); | ||||||
|  |             addpacket(pktbuf,msgbuf,6); | ||||||
|  |          } | ||||||
|  |  | ||||||
|  |          //			/* server-identifier */ | ||||||
|  |          //			if (serveridentifier[0]) | ||||||
|  |          //			{ | ||||||
|  |          //				sprintf(msgbuf,"%c%c%c%c%c%c",54,4, | ||||||
|  |          //						serveridentifier[0],serveridentifier[1], | ||||||
|  |          //						serveridentifier[2],serveridentifier[3]); | ||||||
|  |          //				addpacket(pktbuf,msgbuf,6); | ||||||
|  |          //			} | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       /* client-identifier */ | ||||||
|  |       //	sprintf(msgbuf,"%c%c%c%c%c%c%c%c",61,6, | ||||||
|  |       //		hw[0],hw[1],hw[2],hw[3],hw[4],hw[5]); | ||||||
|  |       //	addpacket(pktbuf,msgbuf,8); | ||||||
|  |  | ||||||
|  |       /* parameter request list */ | ||||||
|  |       if (type==8 || type == 1 || type == REQUEST) | ||||||
|  |       { | ||||||
|  |          sprintf(msgbuf,"%c%c%c%c",55,2,0x01,0x06); | ||||||
|  |          addpacket(pktbuf,msgbuf,4); | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       /* If we're discovering */ | ||||||
|  |       if(type == 1) | ||||||
|  |       { | ||||||
|  |  | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       /* end of options */ | ||||||
|  |       sprintf(msgbuf,"%c",255); | ||||||
|  |       addpacket(pktbuf,msgbuf,1); | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    //dhcp_dump(pktbuf,offset); | ||||||
|  |  | ||||||
|  |    sendto(dhcp_socket,pktbuf,offset,0,(struct sockaddr *)&dhcp_to,sizeof(dhcp_to)); | ||||||
|  |  | ||||||
|  |    offset=0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | int dhcp_read(int dhcp_socket, int serverIP, struct Answer_t * response) | ||||||
|  | { | ||||||
|  |    unsigned char msgbuf[BUF_SIZ]; | ||||||
|  |    struct sockaddr_in fromsock; | ||||||
|  |    socklen_t fromlen=sizeof(fromsock); | ||||||
|  |    int addr; | ||||||
|  |    int i; | ||||||
|  |  | ||||||
|  |    i=recvfrom(dhcp_socket,msgbuf,BUF_SIZ,0,(struct sockaddr *)&fromsock,&fromlen); | ||||||
|  |    addr=ntohl(fromsock.sin_addr.s_addr); | ||||||
|  |  | ||||||
|  |    if (serverIP!=addr) | ||||||
|  |    { | ||||||
|  |       fprintf(stderr,"received from %d.%d.%d.%d, expected from %d.%d.%d.%d\n", | ||||||
|  |             ( addr >> 24 ) & 0xFF, ( addr >> 16 ) & 0xFF, | ||||||
|  |             ( addr >>  8 ) & 0xFF, ( addr       ) & 0xFF, | ||||||
|  |             ( serverIP >> 24 )&0xFF,(serverIP >> 16 )&0xFF, | ||||||
|  |             ( serverIP >>  8 )&0xFF,(serverIP)&0xFF | ||||||
|  |       ); | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    parseDhcpMessage(msgbuf,i, response); | ||||||
|  |  | ||||||
|  |    return response -> messageType; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Will return the Message Type received | ||||||
|  |  */ | ||||||
|  | int waitForResponse( | ||||||
|  |       int dhcp_socket, | ||||||
|  |       int serverIP, | ||||||
|  |       long maxWaitInSecs, | ||||||
|  |       int expectedResponse, | ||||||
|  |       struct Answer_t * response) | ||||||
|  | { | ||||||
|  |    fd_set read; | ||||||
|  |    struct timeval timeout; | ||||||
|  |    int foundpacket=0; | ||||||
|  |    //const char * returnValue = NULL; | ||||||
|  |  | ||||||
|  |    while (foundpacket != expectedResponse) | ||||||
|  |    { | ||||||
|  |       FD_ZERO(&read); | ||||||
|  |       FD_SET(dhcp_socket,&read); | ||||||
|  |       timeout.tv_sec=maxWaitInSecs; | ||||||
|  |       timeout.tv_usec=0; | ||||||
|  |       if(select(dhcp_socket+1,&read,NULL,NULL,&timeout)<0) { | ||||||
|  |          return 0; | ||||||
|  |       } | ||||||
|  |       if (FD_ISSET(dhcp_socket,&read)) | ||||||
|  |       { | ||||||
|  |          // If a expected packet was found, then also release it. | ||||||
|  |          if ((foundpacket=dhcp_read(dhcp_socket, serverIP, response)) == expectedResponse) | ||||||
|  |          { | ||||||
|  |             return expectedResponse; | ||||||
|  |          } | ||||||
|  |       } | ||||||
|  |       else | ||||||
|  |       { | ||||||
|  |          fprintf(stderr,"no answer\n"); | ||||||
|  |  | ||||||
|  |          return MESSAGE_NOT_RECEIVED; | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    return MESSAGE_NOT_RECEIVED; | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | const char * getMACAddress(const char * interface) { | ||||||
|  |    struct ifreq s; | ||||||
|  |    char * returnValue = NULL; | ||||||
|  |    int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); | ||||||
|  |  | ||||||
|  |    strcpy(s.ifr_name, interface); | ||||||
|  |  | ||||||
|  |    if (0 == ioctl(fd, SIOCGIFHWADDR, &s)) | ||||||
|  |    { | ||||||
|  |       returnValue = malloc(16*3); | ||||||
|  |       memset(returnValue, 0x00, 16*3); | ||||||
|  |  | ||||||
|  |       sprintf(returnValue,"%.2X:%.2X:%.2X:%.2X:%.2X:%.2X", | ||||||
|  |             s.ifr_addr.sa_data[0],s.ifr_addr.sa_data[1],s.ifr_addr.sa_data[2], | ||||||
|  |             s.ifr_addr.sa_data[3],s.ifr_addr.sa_data[4],s.ifr_addr.sa_data[5]); | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    close(fd); | ||||||
|  |  | ||||||
|  |    return returnValue; | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | const char * getDeviceIP(const char * interface) { | ||||||
|  |  | ||||||
|  |    char * returnValue = NULL; | ||||||
|  |    struct ifreq ifr; | ||||||
|  |    int fd = socket(AF_INET, SOCK_DGRAM, 0); | ||||||
|  |  | ||||||
|  |    /* I want to get an IPv4 IP address */ | ||||||
|  |    ifr.ifr_addr.sa_family = AF_INET; | ||||||
|  |  | ||||||
|  |    /* I want IP address attached to the interface */ | ||||||
|  |    strncpy(ifr.ifr_name, interface, IFNAMSIZ-1); | ||||||
|  |  | ||||||
|  |    if(0 == ioctl(fd, SIOCGIFADDR, &ifr)) | ||||||
|  |    { | ||||||
|  |       returnValue = malloc(256); | ||||||
|  |       int addr = ((struct sockaddr_in *)(&ifr.ifr_addr))->sin_addr.s_addr; | ||||||
|  |       sprintf(returnValue, "%d.%d.%d.%d", (addr & 0xFF), (addr >> 8 & 0xFF), (addr >> 16 & 0xFF), (addr >> 24 & 0xFF)); | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    close(fd); | ||||||
|  |  | ||||||
|  |    return returnValue; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | bool generateQuery(const char *ifname) | ||||||
|  | { | ||||||
|  |    bool rc = false; | ||||||
|  |    const char * device = ifname; | ||||||
|  |    const char * serverIP = "255.255.255.255"; | ||||||
|  |    const char * mac_address = getMACAddress(device); | ||||||
|  |    struct Answer_t response; | ||||||
|  |  | ||||||
|  |    int dhcp_socket = dhcp_setup(serverIP, device); | ||||||
|  |  | ||||||
|  |    if( dhcp_socket != 0) | ||||||
|  |    { | ||||||
|  |       // We sent a DISCOVER | ||||||
|  |       send_dhcp_packet(dhcp_socket, DISCOVER,"0.0.0.0",NULL,"0.0.0.0",mac_address); | ||||||
|  |  | ||||||
|  |       if(waitForResponse(dhcp_socket, _serveripaddress, WAIT_TIMEOUT_SECONDS, OFFER, &response) == OFFER /* DHCP TYPE: Offer */) | ||||||
|  |       { | ||||||
|  |          /* We close our initial socket (which is configured for broadcasting) */ | ||||||
|  |          close(dhcp_socket); | ||||||
|  |  | ||||||
|  |          /* We open a direct connection (as opposed to broadcasted one) */ | ||||||
|  |          dhcp_socket = dhcp_setup(response.serverIP, device); | ||||||
|  |  | ||||||
|  |          /* We send a request */ | ||||||
|  |          send_dhcp_packet(dhcp_socket, REQUEST /* Request */, response.serverIP, response.offeredIP, "0.0.0.0", mac_address); | ||||||
|  |  | ||||||
|  |          if(waitForResponse(dhcp_socket, _serveripaddress, WAIT_TIMEOUT_SECONDS, ACK_REQUEST, &response) == ACK_REQUEST /* DHCP TYPE: ACK */) | ||||||
|  |          { | ||||||
|  | 		rc = true; | ||||||
|  |          } | ||||||
|  |       } | ||||||
|  |       else | ||||||
|  |       { | ||||||
|  |                 close(dhcp_socket); | ||||||
|  | 		rc = false; | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    if(mac_address) | ||||||
|  |    { | ||||||
|  |       free( (void*) mac_address); | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    return rc; | ||||||
|  | } | ||||||
| @@ -35,6 +35,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||||||
| #include <sys/types.h> | #include <sys/types.h> | ||||||
| #include <curl/curl.h> | #include <curl/curl.h> | ||||||
| #include <time.h> | #include <time.h> | ||||||
|  | #include "dhcpdiscovery.h" | ||||||
|  |  | ||||||
| #define NUM_MAX_CLIENTS 10 | #define NUM_MAX_CLIENTS 10 | ||||||
|  |  | ||||||
| @@ -307,6 +308,8 @@ bool target_stats_network_probe_get(dpp_network_probe_record_t *network_probe_re | |||||||
| 	int ret = 0; | 	int ret = 0; | ||||||
| 	char server[] = "8.8.8.8"; | 	char server[] = "8.8.8.8"; | ||||||
|  |  | ||||||
|  | 	/* DNS probe */ | ||||||
|  |  | ||||||
| 	CURL *curl = curl_easy_init(); | 	CURL *curl = curl_easy_init(); | ||||||
| 	time_t begin = time(NULL), end; | 	time_t begin = time(NULL), end; | ||||||
|  |  | ||||||
| @@ -330,6 +333,23 @@ bool target_stats_network_probe_get(dpp_network_probe_record_t *network_probe_re | |||||||
| 		network_probe_report->dns_probe.state = 0; | 		network_probe_report->dns_probe.state = 0; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	/* DHCP probe */ | ||||||
|  | 	char ifname[] = "br-wan"; | ||||||
|  |  | ||||||
|  | 	begin = time(NULL); | ||||||
|  |  | ||||||
|  | 	if(generateQuery(ifname)) { | ||||||
|  | 		LOGT("dhcp resolved\n"); | ||||||
|  | 		network_probe_report->vlan_probe.dhcpState = 1; | ||||||
|  | 	} else { | ||||||
|  | 		LOGT("dhcp not resolved\n"); | ||||||
|  | 		network_probe_report->vlan_probe.dhcpState = 0; | ||||||
|  | 	} | ||||||
|  | 	end = time(NULL); | ||||||
|  | 	network_probe_report->vlan_probe.dhcpLatency = (end - begin); | ||||||
|  | 	memcpy(network_probe_report->vlan_probe.vlanIF , ifname, strlen(ifname)); | ||||||
|  | 	LOGT("dhcp latency : %d \n", network_probe_report->vlan_probe.dhcpLatency); | ||||||
|  |  | ||||||
| 	return true; | 	return true; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user