Lines Matching full:client
43 * This client was substantially modified and enhanced by Elliot Poger
214 if (_ifi->client->active != NULL) {
217 _ifi->client->active);
218 if (_ifi->client->alias)
220 _ifi->client->alias);
223 _ifi->client->state = S_INIT;
271 for (l = ifi->client->active; l != NULL; l = l->next)
349 if (ifi->client->alias)
350 script_write_params("alias_", ifi->client->alias);
500 if (ifi->client->alias)
501 priv_script_write_params("alias_", ifi->client->alias);
567 ifi->client->state = S_INIT;
623 if (!ip->client->active || ip->client->active->is_bootp) {
629 ip->client->state = S_REBOOTING;
634 ip->client->xid = arc4random();
638 make_request(ip, ip->client->active);
639 ip->client->destination = iaddr_broadcast;
640 ip->client->first_sending = cur_time;
641 ip->client->interval = ip->client->config->initial_interval;
644 ip->client->medium = NULL;
663 make_discover(ip, ip->client->active);
664 ip->client->xid = ip->client->packet.xid;
665 ip->client->destination = iaddr_broadcast;
666 ip->client->state = S_SELECTING;
667 ip->client->first_sending = cur_time;
668 ip->client->interval = ip->client->config->initial_interval;
696 for (lp = ip->client->offered_leases; lp; lp = next) {
721 ip->client->offered_leases = NULL;
726 ip->client->state = S_INIT;
733 ip->client->new = picked;
737 ip->client->new->expiry = cur_time + 12000;
738 ip->client->new->renewal += cur_time + 8000;
739 ip->client->new->rebind += cur_time + 10000;
741 ip->client->state = S_REQUESTING;
749 ip->client->destination = iaddr_broadcast;
750 ip->client->state = S_REQUESTING;
751 ip->client->first_sending = cur_time;
752 ip->client->interval = ip->client->config->initial_interval;
756 ip->client->xid = ip->client->packet.xid;
776 if (packet->interface->client->xid != packet->raw->xid ||
782 if (ip->client->state != S_REBOOTING &&
783 ip->client->state != S_REQUESTING &&
784 ip->client->state != S_RENEWING &&
785 ip->client->state != S_REBINDING)
796 ip->client->new = lease;
802 if (ip->client->config->default_actions[DHO_DHCP_LEASE_TIME] ==
804 ip->client->new->expiry = getULong(
805 ip->client->config->defaults[DHO_DHCP_LEASE_TIME].data);
806 else if (ip->client->new->options[DHO_DHCP_LEASE_TIME].len >= 4)
807 ip->client->new->expiry = getULong(
808 ip->client->new->options[DHO_DHCP_LEASE_TIME].data);
810 ip->client->new->expiry = default_lease_time;
814 if (ip->client->new->expiry < 0 ||
815 ip->client->new->expiry > TIME_MAX - cur_time)
816 ip->client->new->expiry = TIME_MAX - cur_time;
817 /* XXX should be fixed by resetting the client state */
818 if (ip->client->new->expiry < 60)
819 ip->client->new->expiry = 60;
825 if (ip->client->config->default_actions[DHO_DHCP_RENEWAL_TIME] ==
827 ip->client->new->renewal = getULong(
828 ip->client->config->defaults[DHO_DHCP_RENEWAL_TIME].data);
829 else if (ip->client->new->options[DHO_DHCP_RENEWAL_TIME].len >= 4)
830 ip->client->new->renewal = getULong(
831 ip->client->new->options[DHO_DHCP_RENEWAL_TIME].data);
833 ip->client->new->renewal = ip->client->new->expiry / 2;
834 if (ip->client->new->renewal < 0 ||
835 ip->client->new->renewal > ip->client->new->expiry / 2)
836 ip->client->new->renewal = ip->client->new->expiry / 2;
839 if (ip->client->config->default_actions[DHO_DHCP_REBINDING_TIME] ==
841 ip->client->new->rebind = getULong(
842 ip->client->config->defaults[DHO_DHCP_REBINDING_TIME].data);
843 else if (ip->client->new->options[DHO_DHCP_REBINDING_TIME].len >= 4)
844 ip->client->new->rebind = getULong(
845 ip->client->new->options[DHO_DHCP_REBINDING_TIME].data);
847 ip->client->new->rebind = ip->client->new->renewal / 4 * 7;
848 if (ip->client->new->rebind < 0 ||
849 ip->client->new->rebind > ip->client->new->renewal / 4 * 7)
850 ip->client->new->rebind = ip->client->new->renewal / 4 * 7;
853 ip->client->new->expiry += cur_time;
854 ip->client->new->renewal += cur_time;
855 ip->client->new->rebind += cur_time;
866 ip->client->new->medium = ip->client->medium;
868 opt = &ip->client->new->options[DHO_INTERFACE_MTU];
872 bool supersede = (ip->client->config->default_actions[DHO_INTERFACE_MTU] ==
876 mtu = getUShort(ip->client->config->defaults[DHO_INTERFACE_MTU].data);
880 if (ip->client->active) {
881 opt = &ip->client->active->options[DHO_INTERFACE_MTU];
892 } else if (ip->client->state != S_RENEWING || mtu != old_mtu) {
898 write_client_lease(ip, ip->client->new, 0);
900 /* Run the client script with the new parameters. */
901 script_init((ip->client->state == S_REQUESTING ? "BOUND" :
902 (ip->client->state == S_RENEWING ? "RENEW" :
903 (ip->client->state == S_REBOOTING ? "REBOOT" : "REBIND"))),
904 ip->client->new->medium);
905 if (ip->client->active && ip->client->state != S_REBOOTING)
906 script_write_params("old_", ip->client->active);
907 script_write_params("new_", ip->client->new);
908 if (ip->client->alias)
909 script_write_params("alias_", ip->client->alias);
913 if (ip->client->active)
914 free_client_lease(ip->client->active);
915 ip->client->active = ip->client->new;
916 ip->client->new = NULL;
919 add_timeout(ip->client->active->renewal, state_bound, ip);
922 piaddr(ip->client->active->address),
923 (int)(ip->client->active->renewal - cur_time));
924 ip->client->state = S_BOUND;
945 make_request(ip, ip->client->active);
946 ip->client->xid = ip->client->packet.xid;
948 if (ip->client->config->default_actions[DHO_DHCP_SERVER_IDENTIFIER] ==
950 dp = ip->client->config->defaults[DHO_DHCP_SERVER_IDENTIFIER].data;
951 len = ip->client->config->defaults[DHO_DHCP_SERVER_IDENTIFIER].len;
953 dp = ip->client->active->options[DHO_DHCP_SERVER_IDENTIFIER].data;
954 len = ip->client->active->options[DHO_DHCP_SERVER_IDENTIFIER].len;
957 memcpy(ip->client->destination.iabuf, dp, len);
958 ip->client->destination.len = len;
960 ip->client->destination = iaddr_broadcast;
962 ip->client->first_sending = cur_time;
963 ip->client->interval = ip->client->config->initial_interval;
964 ip->client->state = S_RENEWING;
980 for (ap = packet->interface->client->config->reject_list;
1016 for (ap = packet->interface->client->config->reject_list;
1042 if (ip->client->state != S_SELECTING ||
1043 packet->interface->client->xid != packet->raw->xid ||
1053 for (i = 0; ip->client->config->required_options[i]; i++) {
1054 if (!packet->options[ip->client->config->
1062 for (lease = ip->client->offered_leases;
1084 lease->medium = ip->client->medium;
1099 ip->client->first_sending + ip->client->config->select_interval;
1103 if (lease->address.len == ip->client->requested_address.len &&
1105 ip->client->requested_address.iabuf,
1106 ip->client->requested_address.len)) {
1107 lease->next = ip->client->offered_leases;
1108 ip->client->offered_leases = lease;
1118 if (ip->client->offered_leases &&
1124 if (!ip->client->offered_leases)
1125 ip->client->offered_leases = lease;
1127 for (lp = ip->client->offered_leases; lp->next;
1180 for (j = 0; ip->client->config->ignored_options[j]; j++)
1182 ip->client->config->ignored_options[j]) {
1222 the ISC client and server allow arbitrary characters, we do
1261 if (packet->interface->client->xid != packet->raw->xid ||
1267 if (ip->client->state != S_REBOOTING &&
1268 ip->client->state != S_REQUESTING &&
1269 ip->client->state != S_RENEWING &&
1270 ip->client->state != S_REBINDING)
1275 if (!ip->client->active) {
1280 free_client_lease(ip->client->active);
1281 ip->client->active = NULL;
1286 ip->client->state = S_INIT;
1301 interval = cur_time - ip->client->first_sending;
1305 if (interval > ip->client->config->timeout) {
1313 if (!ip->client->offered_leases &&
1314 ip->client->config->media) {
1317 if (ip->client->medium) {
1318 ip->client->medium = ip->client->medium->next;
1321 if (!ip->client->medium) {
1324 ip->client->medium = ip->client->config->media;
1328 note("Trying medium \"%s\" %d", ip->client->medium->string,
1330 script_init("MEDIUM", ip->client->medium);
1343 if (!ip->client->interval)
1344 ip->client->interval =
1345 ip->client->config->initial_interval;
1347 ip->client->interval += (arc4random() >> 2) %
1348 (2 * ip->client->interval);
1352 if (ip->client->interval >
1353 ip->client->config->backoff_cutoff)
1354 ip->client->interval =
1355 ((ip->client->config->backoff_cutoff / 2)
1357 ip->client->config->backoff_cutoff));
1358 } else if (!ip->client->interval)
1359 ip->client->interval =
1360 ip->client->config->initial_interval;
1364 if (cur_time + ip->client->interval >
1365 ip->client->first_sending + ip->client->config->timeout)
1366 ip->client->interval =
1367 (ip->client->first_sending +
1368 ip->client->config->timeout) - cur_time + 1;
1372 ip->client->packet.secs = htons(interval);
1374 ip->client->packet.secs = htons(65535);
1375 ip->client->secs = ip->client->packet.secs;
1379 (int)ip->client->interval);
1382 send_packet_unpriv(privfd, &ip->client->packet,
1383 ip->client->packet_length, inaddr_any, inaddr_broadcast);
1385 add_timeout(cur_time + ip->client->interval, send_discover, ip);
1391 * that haven't yet expired, and failing that, we call the client script
1398 struct client_lease *loop = ip->client->active;
1405 if (!ip->client->active && ip->client->leases)
1409 while (ip->client->active) {
1410 if (ip->client->active->expiry > cur_time) {
1412 piaddr(ip->client->active->address));
1413 /* Run the client script with the existing
1416 ip->client->active->medium);
1417 script_write_params("new_", ip->client->active);
1418 if (ip->client->alias)
1420 ip->client->alias);
1427 ip->client->active->renewal) {
1428 ip->client->state = S_BOUND;
1430 (int)(ip->client->active->renewal -
1433 ip->client->active->renewal,
1436 ip->client->state = S_BOUND;
1447 if (!ip->client->leases) {
1448 ip->client->leases = ip->client->active;
1449 ip->client->active = NULL;
1456 for (lp = ip->client->leases; lp->next; lp = lp->next)
1458 lp->next = ip->client->active;
1461 ip->client->active = ip->client->leases;
1462 ip->client->leases = ip->client->leases->next;
1467 if (ip->client->active == loop)
1470 loop = ip->client->active;
1478 if (ip->client->alias)
1479 script_write_params("alias_", ip->client->alias);
1481 ip->client->state = S_INIT;
1482 add_timeout(cur_time + ip->client->config->retry_interval, state_init,
1495 interval = cur_time - ip->client->first_sending;
1507 if ((ip->client->state == S_REBOOTING ||
1508 ip->client->state == S_REQUESTING) &&
1509 interval > ip->client->config->reboot_timeout) {
1511 ip->client->state = S_INIT;
1519 if (ip->client->state == S_REBOOTING &&
1520 !ip->client->medium &&
1521 ip->client->active->medium ) {
1522 script_init("MEDIUM", ip->client->active->medium);
1529 ip->client->medium = ip->client->active->medium;
1534 if (ip->client->state != S_REQUESTING &&
1535 cur_time > ip->client->active->expiry) {
1536 /* Run the client script with the new parameters. */
1538 script_write_params("old_", ip->client->active);
1539 if (ip->client->alias)
1540 script_write_params("alias_", ip->client->alias);
1546 if (ip->client->alias)
1547 script_write_params("alias_", ip->client->alias);
1550 ip->client->state = S_INIT;
1556 if (!ip->client->interval)
1557 ip->client->interval = ip->client->config->initial_interval;
1559 ip->client->interval += ((arc4random() >> 2) %
1560 (2 * ip->client->interval));
1563 if (ip->client->interval >
1564 ip->client->config->backoff_cutoff)
1565 ip->client->interval =
1566 ((ip->client->config->backoff_cutoff / 2) +
1567 ((arc4random() >> 2) % ip->client->interval));
1571 if (ip->client->state != S_REQUESTING &&
1572 cur_time + ip->client->interval >
1573 ip->client->active->expiry)
1574 ip->client->interval =
1575 ip->client->active->expiry - cur_time + 1;
1579 if (ip->client->state == S_REQUESTING ||
1580 ip->client->state == S_REBOOTING ||
1581 cur_time > ip->client->active->rebind)
1584 memcpy(&to.s_addr, ip->client->destination.iabuf,
1587 if (ip->client->state != S_REQUESTING &&
1588 ip->client->state != S_REBOOTING)
1589 memcpy(&from, ip->client->active->address.iabuf,
1595 if (ip->client->state == S_REQUESTING)
1596 ip->client->packet.secs = ip->client->secs;
1599 ip->client->packet.secs = htons(interval);
1601 ip->client->packet.secs = htons(65535);
1608 send_packet_unpriv(privfd, &ip->client->packet,
1609 ip->client->packet_length, from, to);
1611 add_timeout(cur_time + ip->client->interval, send_request, ip);
1623 send_packet_unpriv(privfd, &ip->client->packet,
1624 ip->client->packet_length, inaddr_any, inaddr_broadcast);
1637 memset(&ip->client->packet, 0, sizeof(ip->client->packet));
1650 options[i]->value = ip->client->config->requested_options;
1651 options[i]->len = ip->client->config->requested_option_count;
1653 ip->client->config->requested_option_count;
1658 ip->client->requested_address = lease->address;
1666 ip->client->requested_address.len = 0;
1671 ip->client->config->send_options[i].data) {
1674 ip->client->config->send_options[i].data;
1676 ip->client->config->send_options[i].len;
1678 ip->client->config->send_options[i].len;
1699 /* set unique client identifier */
1714 ip->client->packet_length = cons_options(NULL, &ip->client->packet, 0,
1716 if (ip->client->packet_length < BOOTP_MIN_LEN)
1717 ip->client->packet_length = BOOTP_MIN_LEN;
1719 ip->client->packet.op = BOOTREQUEST;
1720 ip->client->packet.htype = ip->hw_address.htype;
1721 ip->client->packet.hlen = ip->hw_address.hlen;
1722 ip->client->packet.hops = 0;
1723 ip->client->packet.xid = arc4random();
1724 ip->client->packet.secs = 0; /* filled in by send_discover. */
1725 ip->client->packet.flags = 0;
1727 memset(&(ip->client->packet.ciaddr),
1728 0, sizeof(ip->client->packet.ciaddr));
1729 memset(&(ip->client->packet.yiaddr),
1730 0, sizeof(ip->client->packet.yiaddr));
1731 memset(&(ip->client->packet.siaddr),
1732 0, sizeof(ip->client->packet.siaddr));
1733 memset(&(ip->client->packet.giaddr),
1734 0, sizeof(ip->client->packet.giaddr));
1735 memcpy(ip->client->packet.chaddr,
1749 memset(&ip->client->packet, 0, sizeof(ip->client->packet));
1762 options[i]->value = ip->client->config->requested_options;
1763 options[i]->len = ip->client->config->requested_option_count;
1765 ip->client->config->requested_option_count;
1770 if (ip->client->state == S_REQUESTING) {
1779 if (ip->client->state == S_REQUESTING ||
1780 ip->client->state == S_REBOOTING) {
1781 ip->client->requested_address = lease->address;
1789 ip->client->requested_address.len = 0;
1794 ip->client->config->send_options[i].data) {
1797 ip->client->config->send_options[i].data;
1799 ip->client->config->send_options[i].len;
1801 ip->client->config->send_options[i].len;
1822 /* set unique client identifier */
1837 ip->client->packet_length = cons_options(NULL, &ip->client->packet, 0,
1839 if (ip->client->packet_length < BOOTP_MIN_LEN)
1840 ip->client->packet_length = BOOTP_MIN_LEN;
1842 ip->client->packet.op = BOOTREQUEST;
1843 ip->client->packet.htype = ip->hw_address.htype;
1844 ip->client->packet.hlen = ip->hw_address.hlen;
1845 ip->client->packet.hops = 0;
1846 ip->client->packet.xid = ip->client->xid;
1847 ip->client->packet.secs = 0; /* Filled in by send_request. */
1851 if (ip->client->state == S_BOUND ||
1852 ip->client->state == S_RENEWING ||
1853 ip->client->state == S_REBINDING) {
1854 memcpy(&ip->client->packet.ciaddr,
1856 ip->client->packet.flags = 0;
1858 memset(&ip->client->packet.ciaddr, 0,
1859 sizeof(ip->client->packet.ciaddr));
1860 ip->client->packet.flags = 0;
1863 memset(&ip->client->packet.yiaddr, 0,
1864 sizeof(ip->client->packet.yiaddr));
1865 memset(&ip->client->packet.siaddr, 0,
1866 sizeof(ip->client->packet.siaddr));
1867 memset(&ip->client->packet.giaddr, 0,
1868 sizeof(ip->client->packet.giaddr));
1869 memcpy(ip->client->packet.chaddr,
1883 memset(&ip->client->packet, 0, sizeof(ip->client->packet));
1911 if (ip->client->config->send_options[i].len) {
1913 options[i]->value = ip->client->config->send_options[i].data;
1914 options[i]->len = ip->client->config->send_options[i].len;
1915 options[i]->buf_size = ip->client->config->send_options[i].len;
1921 ip->client->packet_length = cons_options(NULL, &ip->client->packet, 0,
1923 if (ip->client->packet_length < BOOTP_MIN_LEN)
1924 ip->client->packet_length = BOOTP_MIN_LEN;
1926 ip->client->packet.op = BOOTREQUEST;
1927 ip->client->packet.htype = ip->hw_address.htype;
1928 ip->client->packet.hlen = ip->hw_address.hlen;
1929 ip->client->packet.hops = 0;
1930 ip->client->packet.xid = ip->client->xid;
1931 ip->client->packet.secs = 0; /* Filled in by send_request. */
1932 ip->client->packet.flags = 0;
1935 memset(&ip->client->packet.ciaddr, 0,
1936 sizeof(ip->client->packet.ciaddr));
1937 memset(&ip->client->packet.yiaddr, 0,
1938 sizeof(ip->client->packet.yiaddr));
1939 memset(&ip->client->packet.siaddr, 0,
1940 sizeof(ip->client->packet.siaddr));
1941 memset(&ip->client->packet.giaddr, 0,
1942 sizeof(ip->client->packet.giaddr));
1943 memcpy(ip->client->packet.chaddr,
1988 for (lp = ifi->client->leases; lp; lp = lp->next)
1990 if (ifi->client->active)
1991 write_client_lease(ifi, ifi->client->active, 1);
2105 ip->client->scriptEnvsize = 100;
2106 if (ip->client->scriptEnv == NULL)
2107 ip->client->scriptEnv =
2108 malloc(ip->client->scriptEnvsize * sizeof(char *));
2109 if (ip->client->scriptEnv == NULL)
2112 ip->client->scriptEnv[0] = strdup(CLIENT_PATH);
2113 if (ip->client->scriptEnv[0] == NULL)
2116 ip->client->scriptEnv[1] = NULL;
2118 script_set_env(ip->client, "", "interface", ip->name);
2121 script_set_env(ip->client, "", "medium", medium);
2123 script_set_env(ip->client, "", "reason", reason);
2136 script_set_env(ip->client, prefix, "ip_address",
2139 if (ip->client->config->default_actions[DHO_SUBNET_MASK] ==
2141 dp = ip->client->config->defaults[DHO_SUBNET_MASK].data;
2142 len = ip->client->config->defaults[DHO_SUBNET_MASK].len;
2154 script_set_env(ip->client, prefix, "network_number",
2159 script_set_env(ip->client, prefix,
2167 script_set_env(ip->client, prefix, "filename", lease->filename);
2169 script_set_env(ip->client, prefix, "server_name",
2174 if (ip->client->config->defaults[i].len) {
2177 ip->client->config->default_actions[i]) {
2184 dp = ip->client->
2186 len = ip->client->
2190 len = ip->client->
2201 ip->client->
2203 ip->client->
2205 memcpy(dp + ip->client->
2218 len = ip->client->
2235 ip->client->
2237 ip->client->
2243 dp = ip->client->
2245 len = ip->client->
2259 script_set_env(ip->client, prefix, name,
2264 script_set_env(ip->client, prefix, "expiry", tbuf);
2364 scriptName = ip->client->config->script_name;
2365 envp = ip->client->scriptEnv;
2395 script_flush_env(ip->client);
2402 script_set_env(struct client_state *client, const char *prefix,
2421 for (i = 0; client->scriptEnv[i]; i++)
2422 if (strncmp(client->scriptEnv[i], name, namelen) == 0 &&
2423 client->scriptEnv[i][namelen] == '=')
2426 if (client->scriptEnv[i])
2428 free(client->scriptEnv[i]);
2431 if (i >= client->scriptEnvsize - 1) {
2433 int newscriptEnvsize = client->scriptEnvsize + 50;
2435 newscriptEnv = realloc(client->scriptEnv,
2438 free(client->scriptEnv);
2439 client->scriptEnv = NULL;
2440 client->scriptEnvsize = 0;
2443 client->scriptEnv = newscriptEnv;
2444 client->scriptEnvsize = newscriptEnvsize;
2448 client->scriptEnv[i + 1] = NULL;
2451 client->scriptEnv[i] = malloc(strlen(prefix) + strlen(name) + 1 +
2453 if (client->scriptEnv[i] == NULL)
2455 snprintf(client->scriptEnv[i], strlen(prefix) + strlen(name) +
2460 script_flush_env(struct client_state *client)
2464 for (i = 0; client->scriptEnv[i]; i++) {
2465 free(client->scriptEnv[i]);
2466 client->scriptEnv[i] = NULL;
2468 client->scriptEnvsize = 0;
2703 * from each destination descriptor, the DHCP client