Lines Matching full:ip
609 * destination: IP address to send sendpacket to
620 struct interface_info *ip = ipp;
623 if (!ip->client->active || ip->client->active->is_bootp) {
624 state_init(ip);
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;
647 send_request(ip);
657 struct interface_info *ip = ipp;
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;
672 send_discover(ip);
682 struct interface_info *ip = ipp;
689 cancel_timeout(state_selecting, ip);
690 cancel_timeout(send_discover, ip);
696 for (lp = ip->client->offered_leases; lp; lp = next) {
710 make_decline(ip, lp);
711 send_decline(ip);
721 ip->client->offered_leases = NULL;
726 ip->client->state = S_INIT;
727 state_init(ip);
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;
744 bind_lease(ip);
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;
755 make_request(ip, picked);
756 ip->client->xid = ip->client->packet.xid;
762 send_request(ip);
771 struct interface_info *ip = packet->interface;
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;
799 cancel_timeout(send_request, ip);
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;
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;
857 bind_lease(ip);
861 bind_lease(struct interface_info *ip)
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);
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;
938 struct interface_info *ip = ipp;
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;
967 send_request(ip);
1029 struct interface_info *ip = packet->interface;
1042 if (ip->client->state != S_SELECTING ||
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;
1086 /* Send out an ARP Request for the offered IP address. */
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;
1150 state_selecting(ip);
1152 add_timeout_timespec(stop_selecting, state_selecting, ip);
1153 cancel_timeout(send_discover, ip);
1163 struct interface_info *ip = packet->interface;
1180 for (j = 0; ip->client->config->ignored_options[j]; j++)
1182 ip->client->config->ignored_options[j]) {
1257 struct interface_info *ip = packet->interface;
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;
1284 cancel_timeout(send_request, ip);
1286 ip->client->state = S_INIT;
1287 state_init(ip);
1297 struct interface_info *ip = ipp;
1301 interval = cur_time - ip->client->first_sending;
1305 if (interval > ip->client->config->timeout) {
1306 state_panic(ip);
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) {
1323 error("No valid media types for %s!", ip->name);
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;
1378 ip->name, inet_ntoa(inaddr_broadcast), REMOTE_PORT,
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);
1397 struct interface_info *ip = ipp;
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));
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,
1434 state_bound, ip);
1436 ip->client->state = S_BOUND;
1438 state_bound(ip);
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,
1483 ip);
1490 struct interface_info *ip = ipp;
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;
1512 cancel_timeout(send_request, ip);
1513 state_init(ip);
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) {
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;
1551 state_init(ip);
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);
1604 note("DHCPREQUEST on %s to %s port %d", ip->name, inet_ntoa(to),
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);
1617 struct interface_info *ip = ipp;
1619 note("DHCPDECLINE on %s to %s port %d", ip->name,
1623 send_packet_unpriv(privfd, &ip->client->packet,
1624 ip->client->packet_length, inaddr_any, inaddr_broadcast);
1628 make_discover(struct interface_info *ip, struct client_lease *lease)
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;
1700 char client_ident[sizeof(ip->hw_address.haddr) + 1];
1702 int hwlen = (ip->hw_address.hlen < sizeof(client_ident)-1) ?
1703 ip->hw_address.hlen : sizeof(client_ident)-1;
1704 client_ident[0] = ip->hw_address.htype;
1705 memcpy(&client_ident[1], ip->hw_address.haddr, hwlen);
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,
1736 ip->hw_address.haddr, ip->hw_address.hlen);
1741 make_request(struct interface_info *ip, struct client_lease * lease)
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;
1823 char client_ident[sizeof(ip->hw_address.haddr) + 1];
1825 int hwlen = (ip->hw_address.hlen < sizeof(client_ident)-1) ?
1826 ip->hw_address.hlen : sizeof(client_ident)-1;
1827 client_ident[0] = ip->hw_address.htype;
1828 memcpy(&client_ident[1], ip->hw_address.haddr, hwlen);
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,
1870 ip->hw_address.haddr, ip->hw_address.hlen);
1874 make_decline(struct interface_info *ip, struct client_lease *lease)
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,
1944 ip->hw_address.haddr, ip->hw_address.hlen);
1999 write_client_lease(struct interface_info *ip, struct client_lease *lease,
2027 fprintf(leaseFile, " interface \"%s\";\n", ip->name);
2102 struct interface_info *ip = ifi;
2104 if (ip) {
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);
2130 struct interface_info *ip = ifi;
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);
2358 struct interface_info *ip = ifi;
2363 if (ip) {
2364 scriptName = ip->client->config->script_name;
2365 envp = ip->client->scriptEnv;
2394 if (ip)
2395 script_flush_env(ip->client);
2573 warning("Invalid IP address in option: %s", opbuf);