Lines Matching defs:dhcp
2 * dhcpcd - DHCP client daemon
56 #include "dhcp.h"
58 #include "dhcp-common.h"
116 struct dhcp_message dhcp;
150 #define get_option_raw(ctx, dhcp, opt) get_option(ctx, dhcp, opt, NULL)
153 const struct dhcp_message *dhcp, unsigned int opt, size_t *len)
155 const uint8_t *p = dhcp->options;
156 const uint8_t *e = p + sizeof(dhcp->options);
165 if (dhcp->cookie != htonl(MAGIC_COOKIE)) {
170 /* DHCP options are in TLV format with T and L each being a single
205 p = dhcp->bootfile;
206 e = p + sizeof(dhcp->bootfile);
210 p = dhcp->servername;
211 e = p + sizeof(dhcp->servername);
243 struct in_addr *a, const struct dhcp_message *dhcp,
249 p = get_option(ctx, dhcp, option, &len);
258 uint32_t *i, const struct dhcp_message *dhcp, uint8_t option)
264 p = get_option(ctx, dhcp, option, &len);
275 uint8_t *i, const struct dhcp_message *dhcp, uint8_t option)
280 p = get_option(ctx, dhcp, option, &len);
531 const struct dhcp_message *dhcp, uint8_t option)
537 p = get_option(ctx, dhcp, option, &len);
582 get_option_routes(struct interface *ifp, const struct dhcp_message *dhcp)
594 p = get_option(ifp->ctx, dhcp, DHO_CSR, &len);
599 p = get_option(ifp->ctx, dhcp, DHO_MSCSR, &len);
629 p = get_option(ifp->ctx, dhcp, DHO_STATICROUTE, &len);
659 p = get_option(ifp->ctx, dhcp, DHO_ROUTER, &len);
688 dhcp_message_add_addr(struct dhcp_message *dhcp,
694 p = dhcp->options;
700 len = (size_t)(p - (uint8_t *)dhcp);
701 if (len + 6 > sizeof(*dhcp)) {
716 struct dhcp_message *dhcp;
731 dhcp = calloc(1, sizeof (*dhcp));
732 if (dhcp == NULL)
734 m = (uint8_t *)dhcp;
735 dhcp->options;
743 dhcp->ciaddr = state->addr.s_addr;
746 dhcp->ciaddr = lease->addr.s_addr;
749 dhcp->op = DHCP_BOOTREQUEST;
750 dhcp->hwtype = (uint8_t)ifp->family;
754 dhcp->hwlen = (uint8_t)ifp->hwlen;
755 memcpy(&dhcp->chaddr, &ifp->hwaddr, ifp->hwlen);
760 dhcp->ciaddr == 0 &&
763 dhcp->flags = htons(BROADCAST_FLAG);
767 dhcp->secs = htons((uint16_t)UINT16_MAX);
769 dhcp->secs = htons((uint16_t)up);
771 dhcp->xid = htonl(state->xid);
772 dhcp->cookie = htonl(MAGIC_COOKIE);
845 * handle DHCP packets any bigger. */
887 * also seems to break some DHCP server implemetations such as
953 if (len > sizeof(*dhcp))
959 free(dhcp);
970 if (len > sizeof(*dhcp))
989 if (len > sizeof(*dhcp))
1013 if (len > sizeof(*dhcp))
1038 if (len > sizeof(*dhcp))
1050 * Some DHCP servers incorrectly require this. */
1059 *message = dhcp;
1063 logger(ifp->ctx, LOG_ERR, "%s: DHCP messge too big", ifp->name);
1064 free(dhcp);
1069 write_lease(const struct interface *ifp, const struct dhcp_message *dhcp)
1078 uint8_t write_buffer[sizeof(*dhcp) + sizeof(state->server_info) + 1];
1082 if (IS_BOOTP(ifp, dhcp)) {
1095 p = dhcp->options;
1096 e = p + sizeof(dhcp->options);
1097 len = sizeof(*dhcp);
1101 len = (size_t)(p - (const uint8_t *)dhcp);
1111 memcpy(write_buffer, dhcp, len);
1130 struct dhcp_message *dhcp;
1132 uint8_t read_buffer[sizeof(*dhcp) + sizeof(state->server_info) + 1];
1135 const uint8_t *options_endp = options_startp + sizeof(dhcp->options);
1160 dhcp = calloc(1, sizeof(*dhcp));
1161 if (dhcp == NULL) {
1177 memcpy(dhcp, read_buffer, options_startp - read_buffer);
1180 if (get_option_uint8(ifp->ctx, &type, dhcp, DHO_MESSAGETYPE) == -1)
1184 auth = get_option(ifp->ctx, dhcp, DHO_AUTHENTICATION, &auth_len);
1187 (uint8_t *)dhcp, sizeof(*dhcp), 4, type,
1192 free(dhcp);
1205 * DHCP server information is stored after the DHO_END character
1212 return dhcp;
1225 return dhcp;
1278 dhcp_env(char **env, const char *prefix, const struct dhcp_message *dhcp,
1295 get_option_uint8(ifp->ctx, &overl, dhcp, DHO_OPTIONSOVERLOADED);
1298 if (dhcp->yiaddr || dhcp->ciaddr)
1300 if (*dhcp->bootfile && !(overl & 1))
1302 if (*dhcp->servername && !(overl & 2))
1312 p = get_option(ifp->ctx, dhcp, opt->option, &pl);
1324 p = get_option(ifp->ctx, dhcp, opt->option, &pl);
1334 if (dhcp->yiaddr || dhcp->ciaddr) {
1335 /* Set some useful variables that we derive from the DHCP
1337 addr.s_addr = dhcp->yiaddr ? dhcp->yiaddr : dhcp->ciaddr;
1340 dhcp, DHO_SUBNETMASK) == -1) {
1348 dhcp, DHO_BROADCAST) == -1) {
1353 addr.s_addr = dhcp->yiaddr & net.s_addr;
1358 if (*dhcp->bootfile && !(overl & 1)) {
1360 dhcp->bootfile, sizeof(dhcp->bootfile));
1363 if (*dhcp->servername && !(overl & 2)) {
1365 dhcp->servername, sizeof(dhcp->servername));
1393 if ((p = get_option(ifp->ctx, dhcp, opt->option, &pl))) {
1420 if ((p = get_option(ifp->ctx, dhcp, opt->option, &pl)))
1430 struct dhcp_lease *lease, const struct dhcp_message *dhcp)
1433 lease->cookie = dhcp->cookie;
1435 if (dhcp->yiaddr)
1436 lease->addr.s_addr = dhcp->yiaddr;
1438 lease->addr.s_addr = dhcp->ciaddr;
1439 if (get_option_addr(ctx, &lease->net, dhcp, DHO_SUBNETMASK) == -1)
1441 if (get_option_addr(ctx, &lease->brd, dhcp, DHO_BROADCAST) == -1)
1443 if (get_option_uint32(ctx, &lease->leasetime, dhcp, DHO_LEASETIME) != 0)
1446 dhcp, DHO_RENEWALTIME) != 0)
1449 dhcp, DHO_REBINDTIME) != 0)
1451 if (get_option_addr(ctx, &lease->server, dhcp, DHO_SERVERID) != 0)
1613 memcpy(&udpp->dhcp, data, length);
1645 struct dhcp_message *dhcp;
1713 r = make_message(&dhcp, ifp, type);
1719 from.s_addr = dhcp->ciaddr;
1731 r = sendto(s, (uint8_t *)dhcp, len, 0,
1740 udp = dhcp_makeudppacket(&ulen, (uint8_t *)dhcp, len, from, to);
1771 free(dhcp);
1840 "%s: soliciting a DHCP lease (requesting %s)",
1845 ifp->name, ifo->options & DHCPCD_BOOTP ? "BOOTP" : "DHCP");
1870 logger(ifp->ctx, LOG_ERR, "%s: DHCP lease expired", ifp->name);
1923 "%s: failed to renew DHCP, rebinding", ifp->name);
2166 /* Some DHCP servers respond to REQUEST with a subset
2241 struct dhcp_message *dhcp;
2244 dhcp = calloc(1, sizeof(*dhcp));
2245 if (dhcp == NULL)
2247 dhcp->yiaddr = addr->s_addr;
2248 p = dhcp->options;
2256 return dhcp;
2425 /* Don't reset DHCP state if we have an IPv4LL address and link is up,
2470 const struct interface *ifp, const struct dhcp_message *dhcp,
2474 char *a, sname[sizeof(dhcp->servername) * 4];
2479 a = get_option_string(ifp->ctx, dhcp, DHO_MESSAGE);
2496 } else if (ad && dhcp->yiaddr != 0) {
2497 addr.s_addr = dhcp->yiaddr;
2507 r = get_option_addr(ifp->ctx, &addr, dhcp, DHO_SERVERID);
2508 if (dhcp->servername[0] && r == 0) {
2510 dhcp->servername, strlen((const char *)dhcp->servername));
2534 const struct interface *ifp, const struct dhcp_message *dhcp,
2538 log_dhcp1(lvl, msg, ifp, dhcp, from, 1);
2829 struct dhcp_message *dhcp = *dhcpp;
2841 if (get_option_uint8(ifp->ctx, &type, dhcp, DHO_MESSAGETYPE) == -1)
2845 "%s: ignoring DHCP reply (excpecting BOOTP)",
2854 auth = get_option(ifp->ctx, dhcp, DHO_AUTHENTICATION, &auth_len);
2863 ifp, dhcp, from, 0);
2874 log_dhcp1(LOG_ERR, "no authentication", ifp, dhcp, from, 0);
2878 ifp, dhcp, from, 0);
2886 ifp, dhcp, from);
2891 ifp, dhcp, from);
2896 ifp, dhcp, from);
2899 log_dhcp(LOG_ERR, "Force Renew from", ifp, dhcp, from);
2918 //log_dhcp(LOG_DEBUG, "bound, ignoring", iface, dhcp, from);
2923 if (state->xid != ntohl(dhcp->xid)) {
2926 ifp->name, ntohl(dhcp->xid), state->xid,
2936 get_option_uint8(ifp->ctx, &tmp, dhcp, (uint8_t)i) == 0)
2938 log_dhcp(LOG_WARNING, "reject DHCP", ifp, dhcp, from);
2944 if ((msg = get_option_string(ifp->ctx, dhcp, DHO_MESSAGE))) {
2952 log_dhcp(LOG_WARNING, "NAK (deferred):", ifp, dhcp, from);
2964 get_option_uint8(ifp->ctx, &tmp, dhcp, (uint8_t)i) != 0)
2969 * DHCP style options as well so the above isn't
2973 log_dhcp(LOG_WARNING, "reject DHCP", ifp, dhcp, from);
2978 /* DHCP Auto-Configure, RFC 2563 */
2979 if (type == DHCP_OFFER && dhcp->yiaddr == 0) {
2980 log_dhcp(LOG_WARNING, "no address given", ifp, dhcp, from);
2981 if ((msg = get_option_string(ifp->ctx, dhcp, DHO_MESSAGE))) {
2988 get_option_uint8(ifp->ctx, &tmp, dhcp,
2994 ifp, dhcp, from);
3005 ifp, dhcp, from);
3026 (dhcp->ciaddr == INADDR_ANY || dhcp->ciaddr == INADDR_BROADCAST) &&
3027 (dhcp->yiaddr == INADDR_ANY || dhcp->yiaddr == INADDR_BROADCAST))
3031 ifp, dhcp, from);
3039 ifp, dhcp, from);
3053 if (dhcp->yiaddr == state->failed.s_addr &&
3057 ifp, dhcp, from);
3063 lease->addr.s_addr = dhcp->yiaddr;
3064 lease->cookie = dhcp->cookie;
3067 &lease->server, dhcp, DHO_SERVERID) != 0)
3069 log_dhcp(LOG_INFO, "offered", ifp, dhcp, from);
3071 state->offer = dhcp;
3090 * It also seems that some MS DHCP servers actually
3101 ifp, dhcp, from);
3109 ifp, dhcp, from);
3115 log_dhcp(LOG_INFO, "acknowledged", ifp, dhcp, from);
3130 state->offer = dhcp;
3151 dhcp->yiaddr == state->failed.s_addr)
3185 *data = udp + offsetof(struct udp_dhcp_packet, dhcp);
3251 struct dhcp_message *dhcp = NULL;
3265 "%s: dhcp if_readrawpacket: %m", ifp->name);
3281 "%s: non whitelisted DHCP packet from %s",
3288 "%s: blacklisted DHCP packet from %s",
3300 if (bytes > sizeof(*dhcp)) {
3302 "%s: packet greater than DHCP size from %s",
3306 if (dhcp == NULL) {
3307 dhcp = calloc(1, sizeof(*dhcp));
3308 if (dhcp == NULL) {
3314 memcpy(dhcp, pp, bytes);
3315 if (dhcp->cookie != htonl(MAGIC_COOKIE)) {
3321 if (ifp->hwlen <= sizeof(dhcp->chaddr) &&
3322 memcmp(dhcp->chaddr, ifp->hwaddr, ifp->hwlen))
3324 char buf[sizeof(dhcp->chaddr) * 3];
3328 ifp->name, ntohl(dhcp->xid),
3329 hwaddr_ntoa(dhcp->chaddr, sizeof(dhcp->chaddr),
3333 dhcp_handledhcp(ifp, &dhcp, &from);
3337 free(dhcp);
3437 /* If we don't have any more DHCP enabled interfaces,
3557 * ICMP port unreachable message back to the DHCP server */
3686 * the DHCP server we'll drop it anyway, as