void dhcp_handler (void *unused, int event) { switch (event) { case BDHCPCLIENT_EVENT_UP: { printf("DHCP: up"); uint32_t ip; uint8_t *ipb = (void *)&ip; BDHCPClient_GetClientIP(&dhcp, &ip); printf(" IP=%"PRIu8".%"PRIu8".%"PRIu8".%"PRIu8, ipb[0], ipb[1], ipb[2], ipb[3]); BDHCPClient_GetClientMask(&dhcp, &ip); printf(" Mask=%"PRIu8".%"PRIu8".%"PRIu8".%"PRIu8, ipb[0], ipb[1], ipb[2], ipb[3]); if (BDHCPClient_GetRouter(&dhcp, &ip)) { printf(" Router=%"PRIu8".%"PRIu8".%"PRIu8".%"PRIu8, ipb[0], ipb[1], ipb[2], ipb[3]); } uint32_t dns[BDHCPCLIENT_MAX_DOMAIN_NAME_SERVERS]; int num = BDHCPClient_GetDNS(&dhcp, dns, BDHCPCLIENT_MAX_DOMAIN_NAME_SERVERS); for (int i = 0; i < num; i++) { ip=dns[i]; printf(" DNS=%"PRIu8".%"PRIu8".%"PRIu8".%"PRIu8, ipb[0], ipb[1], ipb[2], ipb[3]); } printf("\n"); } break; case BDHCPCLIENT_EVENT_DOWN: { printf("DHCP: down\n"); } break; case BDHCPCLIENT_EVENT_ERROR: { printf("DHCP: error\n"); // exit reactor BReactor_Quit(&reactor, 0); } break; default: ASSERT(0); } }
static int func_getvar (void *vo, const char *name, NCDValMem *mem, NCDValRef *out) { struct instance *o = vo; ASSERT(o->up) if (!strcmp(name, "addr")) { uint32_t addr; BDHCPClient_GetClientIP(&o->dhcp, &addr); char str[IPADDR_PRINT_MAX]; ipaddr_print_addr(addr, str); *out = NCDVal_NewString(mem, str); return 1; } if (!strcmp(name, "prefix")) { uint32_t addr; BDHCPClient_GetClientIP(&o->dhcp, &addr); uint32_t mask; BDHCPClient_GetClientMask(&o->dhcp, &mask); struct ipv4_ifaddr ifaddr; if (!ipaddr_ipv4_ifaddr_from_addr_mask(addr, mask, &ifaddr)) { ModuleLog(o->i, BLOG_ERROR, "bad netmask"); return 0; } char str[10]; sprintf(str, "%d", ifaddr.prefix); *out = NCDVal_NewString(mem, str); return 1; } if (!strcmp(name, "cidr_addr")) { uint32_t addr; BDHCPClient_GetClientIP(&o->dhcp, &addr); uint32_t mask; BDHCPClient_GetClientMask(&o->dhcp, &mask); struct ipv4_ifaddr ifaddr; if (!ipaddr_ipv4_ifaddr_from_addr_mask(addr, mask, &ifaddr)) { ModuleLog(o->i, BLOG_ERROR, "bad netmask"); return 0; } char str[IPADDR_PRINT_MAX]; ipaddr_print_ifaddr(ifaddr, str); *out = NCDVal_NewString(mem, str); return 1; } if (!strcmp(name, "gateway")) { char str[IPADDR_PRINT_MAX]; uint32_t addr; if (!BDHCPClient_GetRouter(&o->dhcp, &addr)) { strcpy(str, "none"); } else { ipaddr_print_addr(addr, str); } *out = NCDVal_NewString(mem, str); return 1; } if (!strcmp(name, "dns_servers")) { uint32_t servers[BDHCPCLIENT_MAX_DOMAIN_NAME_SERVERS]; int num_servers = BDHCPClient_GetDNS(&o->dhcp, servers, BDHCPCLIENT_MAX_DOMAIN_NAME_SERVERS); *out = NCDVal_NewList(mem, num_servers); if (NCDVal_IsInvalid(*out)) { goto fail; } for (int i = 0; i < num_servers; i++) { char str[IPADDR_PRINT_MAX]; ipaddr_print_addr(servers[i], str); NCDValRef server = NCDVal_NewString(mem, str); if (NCDVal_IsInvalid(server)) { goto fail; } if (!NCDVal_ListAppend(*out, server)) { goto fail; } } return 1; } if (!strcmp(name, "server_mac")) { uint8_t mac[6]; BDHCPClient_GetServerMAC(&o->dhcp, mac); char str[18]; sprintf(str, "%02"PRIX8":%02"PRIX8":%02"PRIX8":%02"PRIX8":%02"PRIX8":%02"PRIX8, mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); *out = NCDVal_NewString(mem, str); return 1; } return 0; fail: *out = NCDVal_NewInvalid(); return 1; }