Lines Matching refs:dhcp

60 static int dhcp_tx ( struct dhcp_session *dhcp );
110 dhcp-server ) = {
165 int ( * tx ) ( struct dhcp_session *dhcp, struct dhcp_packet *dhcppkt,
177 void ( * rx ) ( struct dhcp_session *dhcp, struct dhcp_packet *dhcppkt,
185 void ( * expired ) ( struct dhcp_session *dhcp );
253 struct dhcp_session *dhcp = in dhcp_free() local
256 netdev_put ( dhcp->netdev ); in dhcp_free()
257 dhcppkt_put ( dhcp->proxy_offer ); in dhcp_free()
258 free ( dhcp ); in dhcp_free()
267 static void dhcp_finished ( struct dhcp_session *dhcp, int rc ) { in dhcp_finished() argument
270 stop_timer ( &dhcp->timer ); in dhcp_finished()
273 intf_shutdown ( &dhcp->xfer, rc ); in dhcp_finished()
274 intf_shutdown ( &dhcp->job, rc ); in dhcp_finished()
283 static void dhcp_set_state ( struct dhcp_session *dhcp, in dhcp_set_state() argument
286 DBGC ( dhcp, "DHCP %p entering %s state\n", dhcp, state->name ); in dhcp_set_state()
287 dhcp->state = state; in dhcp_set_state()
288 dhcp->start = currticks(); in dhcp_set_state()
289 stop_timer ( &dhcp->timer ); in dhcp_set_state()
290 set_timer_limits ( &dhcp->timer, in dhcp_set_state()
293 start_timer_nodelay ( &dhcp->timer ); in dhcp_set_state()
332 static int dhcp_discovery_tx ( struct dhcp_session *dhcp, in dhcp_discovery_tx() argument
336 DBGC ( dhcp, "DHCP %p DHCPDISCOVER\n", dhcp ); in dhcp_discovery_tx()
355 static void dhcp_discovery_rx ( struct dhcp_session *dhcp, in dhcp_discovery_rx() argument
368 DBGC ( dhcp, "DHCP %p %s from %s:%d", dhcp, in dhcp_discovery_rx()
373 DBGC ( dhcp, " (%s/", inet_ntoa ( server_id ) ); in dhcp_discovery_rx()
374 DBGC ( dhcp, "%s)", inet_ntoa ( pseudo_id ) ); in dhcp_discovery_rx()
380 DBGC ( dhcp, " for %s", inet_ntoa ( ip ) ); in dhcp_discovery_rx()
388 DBGC ( dhcp, "%s", in dhcp_discovery_rx()
396 DBGC ( dhcp, " pri %d", priority ); in dhcp_discovery_rx()
402 DBGC ( dhcp, " nopxe" ); in dhcp_discovery_rx()
403 DBGC ( dhcp, "\n" ); in dhcp_discovery_rx()
408 ( priority >= dhcp->priority ) ) { in dhcp_discovery_rx()
409 dhcp->offer = ip; in dhcp_discovery_rx()
410 dhcp->server = server_id; in dhcp_discovery_rx()
411 dhcp->priority = priority; in dhcp_discovery_rx()
412 dhcp->no_pxedhcp = no_pxedhcp; in dhcp_discovery_rx()
417 ( priority >= dhcp->proxy_priority ) ) { in dhcp_discovery_rx()
418 dhcppkt_put ( dhcp->proxy_offer ); in dhcp_discovery_rx()
419 dhcp->proxy_server = pseudo_id; in dhcp_discovery_rx()
420 dhcp->proxy_offer = dhcppkt_get ( dhcppkt ); in dhcp_discovery_rx()
421 dhcp->proxy_priority = priority; in dhcp_discovery_rx()
433 if ( ! dhcp->offer.s_addr ) in dhcp_discovery_rx()
437 elapsed = ( currticks() - dhcp->start ); in dhcp_discovery_rx()
438 if ( ! ( dhcp->no_pxedhcp || dhcp->proxy_offer || in dhcp_discovery_rx()
443 dhcp_set_state ( dhcp, &dhcp_state_request ); in dhcp_discovery_rx()
451 static void dhcp_discovery_expired ( struct dhcp_session *dhcp ) { in dhcp_discovery_expired() argument
452 unsigned long elapsed = ( currticks() - dhcp->start ); in dhcp_discovery_expired()
455 if ( netdev_link_blocked ( dhcp->netdev ) && in dhcp_discovery_expired()
456 ( dhcp->count <= DHCP_DISC_MAX_DEFERRALS ) ) { in dhcp_discovery_expired()
457 DBGC ( dhcp, "DHCP %p deferring discovery\n", dhcp ); in dhcp_discovery_expired()
458 dhcp->start = currticks(); in dhcp_discovery_expired()
459 start_timer_fixed ( &dhcp->timer, in dhcp_discovery_expired()
466 if ( dhcp->offer.s_addr && in dhcp_discovery_expired()
468 dhcp_set_state ( dhcp, &dhcp_state_request ); in dhcp_discovery_expired()
473 dhcp_tx ( dhcp ); in dhcp_discovery_expired()
494 static int dhcp_request_tx ( struct dhcp_session *dhcp, in dhcp_request_tx() argument
499 DBGC ( dhcp, "DHCP %p DHCPREQUEST to %s:%d", in dhcp_request_tx()
500 dhcp, inet_ntoa ( dhcp->server ), BOOTPS_PORT ); in dhcp_request_tx()
501 DBGC ( dhcp, " for %s\n", inet_ntoa ( dhcp->offer ) ); in dhcp_request_tx()
505 &dhcp->server, in dhcp_request_tx()
506 sizeof ( dhcp->server ) ) ) != 0 ) in dhcp_request_tx()
511 &dhcp->offer, in dhcp_request_tx()
512 sizeof ( dhcp->offer ) ) ) != 0 ) in dhcp_request_tx()
532 static void dhcp_request_rx ( struct dhcp_session *dhcp, in dhcp_request_rx() argument
542 DBGC ( dhcp, "DHCP %p %s from %s:%d", dhcp, in dhcp_request_rx()
547 DBGC ( dhcp, " (%s/", inet_ntoa ( server_id ) ); in dhcp_request_rx()
548 DBGC ( dhcp, "%s)", inet_ntoa ( pseudo_id ) ); in dhcp_request_rx()
554 DBGC ( dhcp, " for %s", inet_ntoa ( ip ) ); in dhcp_request_rx()
555 DBGC ( dhcp, "\n" ); in dhcp_request_rx()
562 if ( server_id.s_addr != dhcp->server.s_addr ) in dhcp_request_rx()
564 if ( ip.s_addr != dhcp->offer.s_addr ) in dhcp_request_rx()
568 dhcp->local.sin_addr = ip; in dhcp_request_rx()
571 parent = netdev_settings ( dhcp->netdev ); in dhcp_request_rx()
575 DBGC ( dhcp, "DHCP %p could not register settings: %s\n", in dhcp_request_rx()
576 dhcp, strerror ( rc ) ); in dhcp_request_rx()
577 dhcp_finished ( dhcp, rc ); in dhcp_request_rx()
582 if ( dhcp->proxy_offer /* Have ProxyDHCP offer */ && in dhcp_request_rx()
583 ( ! dhcp->no_pxedhcp ) /* ProxyDHCP not disabled */ ) { in dhcp_request_rx()
584 if ( dhcp_has_pxeopts ( dhcp->proxy_offer ) ) { in dhcp_request_rx()
588 settings = &dhcp->proxy_offer->settings; in dhcp_request_rx()
591 DBGC ( dhcp, "DHCP %p could not register " in dhcp_request_rx()
593 dhcp, strerror ( rc ) ); in dhcp_request_rx()
594 dhcp_finished ( dhcp, rc ); in dhcp_request_rx()
599 dhcp_set_state ( dhcp, &dhcp_state_proxy ); in dhcp_request_rx()
605 dhcp_finished ( dhcp, 0 ); in dhcp_request_rx()
613 static void dhcp_request_expired ( struct dhcp_session *dhcp ) { in dhcp_request_expired() argument
616 dhcp_tx ( dhcp ); in dhcp_request_expired()
637 static int dhcp_proxy_tx ( struct dhcp_session *dhcp, in dhcp_proxy_tx() argument
642 DBGC ( dhcp, "DHCP %p ProxyDHCP REQUEST to %s\n", dhcp, in dhcp_proxy_tx()
643 inet_ntoa ( dhcp->proxy_server ) ); in dhcp_proxy_tx()
647 &dhcp->proxy_server, in dhcp_proxy_tx()
648 sizeof ( dhcp->proxy_server ) ) ) != 0 ) in dhcp_proxy_tx()
652 peer->sin_addr = dhcp->proxy_server; in dhcp_proxy_tx()
668 static void dhcp_proxy_rx ( struct dhcp_session *dhcp, in dhcp_proxy_rx() argument
676 DBGC ( dhcp, "DHCP %p %s from %s:%d", dhcp, in dhcp_proxy_rx()
681 DBGC ( dhcp, " (%s/", inet_ntoa ( server_id ) ); in dhcp_proxy_rx()
682 DBGC ( dhcp, "%s)", inet_ntoa ( pseudo_id ) ); in dhcp_proxy_rx()
685 DBGC ( dhcp, " pxe" ); in dhcp_proxy_rx()
686 DBGC ( dhcp, "\n" ); in dhcp_proxy_rx()
693 if ( ( pseudo_id.s_addr != dhcp->proxy_server.s_addr ) ) in dhcp_proxy_rx()
701 DBGC ( dhcp, "DHCP %p could not register proxy settings: %s\n", in dhcp_proxy_rx()
702 dhcp, strerror ( rc ) ); in dhcp_proxy_rx()
703 dhcp_finished ( dhcp, rc ); in dhcp_proxy_rx()
708 dhcp_finished ( dhcp, 0 ); in dhcp_proxy_rx()
716 static void dhcp_proxy_expired ( struct dhcp_session *dhcp ) { in dhcp_proxy_expired() argument
717 unsigned long elapsed = ( currticks() - dhcp->start ); in dhcp_proxy_expired()
721 dhcp_finished ( dhcp, 0 ); in dhcp_proxy_expired()
726 dhcp_tx ( dhcp ); in dhcp_proxy_expired()
747 static int dhcp_pxebs_tx ( struct dhcp_session *dhcp, in dhcp_pxebs_tx() argument
754 peer->sin_addr = *(dhcp->pxe_attempt); in dhcp_pxebs_tx()
758 DBGC ( dhcp, "DHCP %p PXEBS REQUEST to %s:%d for type %d\n", in dhcp_pxebs_tx()
759 dhcp, inet_ntoa ( peer->sin_addr ), ntohs ( peer->sin_port ), in dhcp_pxebs_tx()
760 le16_to_cpu ( dhcp->pxe_type ) ); in dhcp_pxebs_tx()
763 menu_item.type = dhcp->pxe_type; in dhcp_pxebs_tx()
778 static int dhcp_pxebs_accept ( struct dhcp_session *dhcp, in dhcp_pxebs_accept() argument
783 if ( ! dhcp->pxe_accept ) in dhcp_pxebs_accept()
787 for ( accept = dhcp->pxe_accept ; accept->s_addr ; accept++ ) { in dhcp_pxebs_accept()
792 DBGC ( dhcp, "DHCP %p rejecting server %s\n", in dhcp_pxebs_accept()
793 dhcp, inet_ntoa ( bs ) ); in dhcp_pxebs_accept()
807 static void dhcp_pxebs_rx ( struct dhcp_session *dhcp, in dhcp_pxebs_rx() argument
815 DBGC ( dhcp, "DHCP %p %s from %s:%d", dhcp, in dhcp_pxebs_rx()
820 DBGC ( dhcp, " (%s/", inet_ntoa ( server_id ) ); in dhcp_pxebs_rx()
821 DBGC ( dhcp, "%s)", inet_ntoa ( pseudo_id ) ); in dhcp_pxebs_rx()
828 DBGC ( dhcp, " for type %d", ntohs ( menu_item.type ) ); in dhcp_pxebs_rx()
829 DBGC ( dhcp, "\n" ); in dhcp_pxebs_rx()
837 if ( menu_item.type != dhcp->pxe_type ) in dhcp_pxebs_rx()
839 if ( ! dhcp_pxebs_accept ( dhcp, pseudo_id ) ) in dhcp_pxebs_rx()
845 DBGC ( dhcp, "DHCP %p could not register settings: %s\n", in dhcp_pxebs_rx()
846 dhcp, strerror ( rc ) ); in dhcp_pxebs_rx()
847 dhcp_finished ( dhcp, rc ); in dhcp_pxebs_rx()
852 dhcp_finished ( dhcp, 0 ); in dhcp_pxebs_rx()
860 static void dhcp_pxebs_expired ( struct dhcp_session *dhcp ) { in dhcp_pxebs_expired() argument
861 unsigned long elapsed = ( currticks() - dhcp->start ); in dhcp_pxebs_expired()
867 dhcp->pxe_attempt++; in dhcp_pxebs_expired()
868 if ( dhcp->pxe_attempt->s_addr ) { in dhcp_pxebs_expired()
869 dhcp_set_state ( dhcp, &dhcp_state_pxebs ); in dhcp_pxebs_expired()
872 dhcp_finished ( dhcp, -ETIMEDOUT ); in dhcp_pxebs_expired()
878 dhcp_tx ( dhcp ); in dhcp_pxebs_expired()
1095 static int dhcp_tx ( struct dhcp_session *dhcp ) { in dhcp_tx() argument
1100 .netdev = dhcp->netdev, in dhcp_tx()
1101 .src = ( struct sockaddr * ) &dhcp->local, in dhcp_tx()
1105 uint8_t msgtype = dhcp->state->tx_msgtype; in dhcp_tx()
1112 start_timer ( &dhcp->timer ); in dhcp_tx()
1115 iobuf = xfer_alloc_iob ( &dhcp->xfer, DHCP_MIN_LEN ); in dhcp_tx()
1120 if ( ( rc = dhcp_create_request ( &dhcppkt, dhcp->netdev, msgtype, in dhcp_tx()
1121 dhcp->xid, dhcp->local.sin_addr, in dhcp_tx()
1124 DBGC ( dhcp, "DHCP %p could not construct DHCP request: %s\n", in dhcp_tx()
1125 dhcp, strerror ( rc ) ); in dhcp_tx()
1133 dhcppkt.dhcphdr->secs = htons ( ( dhcp->count << 2 ) | in dhcp_tx()
1134 ( dhcp->offer.s_addr ? 0x02 : 0 ) | in dhcp_tx()
1135 ( dhcp->proxy_offer ? 0x01 : 0 ) ); in dhcp_tx()
1138 if ( ( rc = dhcp->state->tx ( dhcp, &dhcppkt, &peer ) ) != 0 ) { in dhcp_tx()
1139 DBGC ( dhcp, "DHCP %p could not fill DHCP request: %s\n", in dhcp_tx()
1140 dhcp, strerror ( rc ) ); in dhcp_tx()
1146 if ( ( rc = xfer_deliver ( &dhcp->xfer, iob_disown ( iobuf ), in dhcp_tx()
1148 DBGC ( dhcp, "DHCP %p could not transmit UDP packet: %s\n", in dhcp_tx()
1149 dhcp, strerror ( rc ) ); in dhcp_tx()
1166 static int dhcp_deliver ( struct dhcp_session *dhcp, in dhcp_deliver() argument
1169 struct net_device *netdev = dhcp->netdev; in dhcp_deliver()
1182 DBGC ( dhcp, "DHCP %p received packet without source port\n", in dhcp_deliver()
1183 dhcp ); in dhcp_deliver()
1220 if ( dhcphdr->xid != dhcp->xid ) { in dhcp_deliver()
1221 DBGC ( dhcp, "DHCP %p %s from %s:%d has bad transaction " in dhcp_deliver()
1222 "ID\n", dhcp, dhcp_msgtype_name ( msgtype ), in dhcp_deliver()
1232 DBGC ( dhcp, "DHCP %p %s from %s:%d has bad chaddr %s\n", in dhcp_deliver()
1233 dhcp, dhcp_msgtype_name ( msgtype ), in dhcp_deliver()
1241 dhcp->state->rx ( dhcp, dhcppkt, peer, msgtype, server_id, pseudo_id ); in dhcp_deliver()
1268 struct dhcp_session *dhcp = in dhcp_timer_expired() local
1273 dhcp_finished ( dhcp, -ETIMEDOUT ); in dhcp_timer_expired()
1278 dhcp->count++; in dhcp_timer_expired()
1281 dhcp->state->expired ( dhcp ); in dhcp_timer_expired()
1328 struct dhcp_session *dhcp; in start_dhcp() local
1332 dhcp = zalloc ( sizeof ( *dhcp ) ); in start_dhcp()
1333 if ( ! dhcp ) in start_dhcp()
1335 ref_init ( &dhcp->refcnt, dhcp_free ); in start_dhcp()
1336 intf_init ( &dhcp->job, &dhcp_job_desc, &dhcp->refcnt ); in start_dhcp()
1337 intf_init ( &dhcp->xfer, &dhcp_xfer_desc, &dhcp->refcnt ); in start_dhcp()
1338 timer_init ( &dhcp->timer, dhcp_timer_expired, &dhcp->refcnt ); in start_dhcp()
1339 dhcp->netdev = netdev_get ( netdev ); in start_dhcp()
1340 dhcp->local.sin_family = AF_INET; in start_dhcp()
1341 dhcp->local.sin_port = htons ( BOOTPC_PORT ); in start_dhcp()
1342 dhcp->xid = random(); in start_dhcp()
1345 dhcp_last_xid = dhcp->xid; in start_dhcp()
1348 if ( ( rc = xfer_open_socket ( &dhcp->xfer, SOCK_DGRAM, &dhcp_peer, in start_dhcp()
1349 ( struct sockaddr * ) &dhcp->local ) ) != 0 ) in start_dhcp()
1353 dhcp_set_state ( dhcp, &dhcp_state_discover ); in start_dhcp()
1356 intf_plug_plug ( &dhcp->job, job ); in start_dhcp()
1357 ref_put ( &dhcp->refcnt ); in start_dhcp()
1361 dhcp_finished ( dhcp, rc ); in start_dhcp()
1362 ref_put ( &dhcp->refcnt ); in start_dhcp()
1377 static void pxebs_list ( struct dhcp_session *dhcp, void *raw, in pxebs_list() argument
1385 DBGC ( dhcp, "DHCP %p malformed PXE server list\n", in pxebs_list()
1386 dhcp ); in pxebs_list()
1392 DBGC ( dhcp, "DHCP %p malformed PXE server list\n", in pxebs_list()
1393 dhcp ); in pxebs_list()
1396 if ( server->type == dhcp->pxe_type ) { in pxebs_list()
1426 struct dhcp_session *dhcp; in start_pxebs() local
1438 dhcp = zalloc ( sizeof ( *dhcp ) + sizeof ( *ip ) /* mcast */ + in start_pxebs()
1441 if ( ! dhcp ) in start_pxebs()
1443 ref_init ( &dhcp->refcnt, dhcp_free ); in start_pxebs()
1444 intf_init ( &dhcp->job, &dhcp_job_desc, &dhcp->refcnt ); in start_pxebs()
1445 intf_init ( &dhcp->xfer, &dhcp_xfer_desc, &dhcp->refcnt ); in start_pxebs()
1446 timer_init ( &dhcp->timer, dhcp_timer_expired, &dhcp->refcnt ); in start_pxebs()
1447 dhcp->netdev = netdev_get ( netdev ); in start_pxebs()
1448 dhcp->local.sin_family = AF_INET; in start_pxebs()
1450 &dhcp->local.sin_addr ); in start_pxebs()
1451 dhcp->local.sin_port = htons ( BOOTPC_PORT ); in start_pxebs()
1452 dhcp->pxe_type = cpu_to_le16 ( pxe_type ); in start_pxebs()
1457 ip = ( ( ( void * ) dhcp ) + sizeof ( *dhcp ) ); in start_pxebs()
1458 dhcp->pxe_attempt = ip; in start_pxebs()
1467 dhcp->pxe_accept = ip; in start_pxebs()
1473 pxebs_list ( dhcp, buf, sizeof ( buf ), ip ); in start_pxebs()
1475 if ( ! dhcp->pxe_attempt->s_addr ) { in start_pxebs()
1476 DBGC ( dhcp, "DHCP %p has no PXE boot servers for type %04x\n", in start_pxebs()
1477 dhcp, pxe_type ); in start_pxebs()
1483 DBGC ( dhcp, "DHCP %p attempting", dhcp ); in start_pxebs()
1484 for ( ip = dhcp->pxe_attempt ; ip->s_addr ; ip++ ) in start_pxebs()
1485 DBGC ( dhcp, " %s", inet_ntoa ( *ip ) ); in start_pxebs()
1486 DBGC ( dhcp, "\n" ); in start_pxebs()
1487 if ( dhcp->pxe_accept ) { in start_pxebs()
1488 DBGC ( dhcp, "DHCP %p accepting", dhcp ); in start_pxebs()
1489 for ( ip = dhcp->pxe_accept ; ip->s_addr ; ip++ ) in start_pxebs()
1490 DBGC ( dhcp, " %s", inet_ntoa ( *ip ) ); in start_pxebs()
1491 DBGC ( dhcp, "\n" ); in start_pxebs()
1495 if ( ( rc = xfer_open_socket ( &dhcp->xfer, SOCK_DGRAM, &dhcp_peer, in start_pxebs()
1496 ( struct sockaddr * ) &dhcp->local ) ) != 0 ) in start_pxebs()
1500 dhcp_set_state ( dhcp, &dhcp_state_pxebs ); in start_pxebs()
1503 intf_plug_plug ( &dhcp->job, job ); in start_pxebs()
1504 ref_put ( &dhcp->refcnt ); in start_pxebs()
1508 dhcp_finished ( dhcp, rc ); in start_pxebs()
1509 ref_put ( &dhcp->refcnt ); in start_pxebs()