2 * Copyright 2013-2014 Intel Corporation - All Rights Reserved
5 #include <syslinux/firmware.h>
6 #include <syslinux/pxe_api.h>
9 #include "fs/pxe/pxe.h"
11 const struct url_scheme url_schemes
[] = {
12 { "tftp", tftp_open
, 0 },
13 { "http", http_open
, O_DIRECTORY
},
14 { "ftp", ftp_open
, O_DIRECTORY
},
19 * Network stack-specific initialization
21 void net_core_init(void)
26 void pxe_init_isr(void) {}
27 void gpxe_init(void) {}
28 void pxe_idle_init(void) {}
35 #define DNS_MAX_SERVERS 4 /* Max no of DNS servers */
36 uint32_t dns_server
[DNS_MAX_SERVERS
] = {0, };
38 __export
uint32_t dns_resolv(const char *name
)
41 * Return failure on an empty input... this can happen during
42 * some types of URL parsing, and this is the easiest place to
51 int pxe_init(bool quiet
)
57 status
= LibLocateHandle(ByProtocol
, &PxeBaseCodeProtocol
,
58 NULL
, &nr_handles
, &handles
);
59 if (status
!= EFI_SUCCESS
) {
61 Print(L
"No PXE Base Code Protocol\n");
68 void net_parse_dhcp(void)
70 EFI_PXE_BASE_CODE_MODE
*mode
;
71 EFI_PXE_BASE_CODE
*bc
;
72 unsigned int pkt_len
= sizeof(EFI_PXE_BASE_CODE_PACKET
);
74 EFI_HANDLE
*handles
= NULL
;
80 status
= LibLocateHandle(ByProtocol
, &PxeBaseCodeProtocol
,
81 NULL
, &nr_handles
, &handles
);
82 if (status
!= EFI_SUCCESS
)
85 /* Probably want to use IPv4 protocol to decide which handle to use */
86 status
= uefi_call_wrapper(BS
->HandleProtocol
, 3, handles
[0],
87 &PxeBaseCodeProtocol
, (void **)&bc
);
88 if (status
!= EFI_SUCCESS
) {
89 Print(L
"Failed to lookup PxeBaseCodeProtocol\n");
95 * Get the DHCP client identifiers (query info 1)
97 Print(L
"Getting cached packet ");
98 parse_dhcp(&mode
->DhcpDiscover
.Dhcpv4
, pkt_len
);
100 * We don't use flags from the request packet, so
101 * this is a good time to initialize DHCPMagic...
102 * Initialize it to 1 meaning we will accept options found;
103 * in earlier versions of PXELINUX bit 0 was used to indicate
104 * we have found option 208 with the appropriate magic number;
105 * we no longer require that, but MAY want to re-introduce
106 * it in the future for vendor encapsulated options.
108 *(char *)&DHCPMagic
= 1;
111 * Get the BOOTP/DHCP packet that brought us file (and an IP
112 * address). This lives in the DHCPACK packet (query info 2)
114 parse_dhcp(&mode
->DhcpAck
.Dhcpv4
, pkt_len
);
116 * Save away MAC address (assume this is in query info 2. If this
117 * turns out to be problematic it might be better getting it from
118 * the query info 1 packet
120 hardlen
= mode
->DhcpAck
.Dhcpv4
.BootpHwAddrLen
;
121 MAC_len
= hardlen
> 16 ? 0 : hardlen
;
122 MAC_type
= mode
->DhcpAck
.Dhcpv4
.BootpHwType
;
123 memcpy(MAC
, mode
->DhcpAck
.Dhcpv4
.BootpHwAddr
, MAC_len
);
126 * Get the boot file and other info. This lives in the CACHED_REPLY
127 * packet (query info 3)
129 parse_dhcp(&mode
->PxeReply
.Dhcpv4
, pkt_len
);
133 sprintf(dst
, "%u.%u.%u.%u",
134 ((const uint8_t *)&ip
)[0],
135 ((const uint8_t *)&ip
)[1],
136 ((const uint8_t *)&ip
)[2],
137 ((const uint8_t *)&ip
)[3]);
139 Print(L
"My IP is %a\n", dst
);