2 * GRUB -- GRand Unified Bootloader
3 * Copyright (C) 2010,2011 Free Software Foundation, Inc.
5 * GRUB is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * GRUB is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
19 #ifndef GRUB_NET_HEADER
20 #define GRUB_NET_HEADER 1
22 #include <grub/types.h>
24 #include <grub/list.h>
26 #include <grub/file.h>
28 #include <grub/net/netbuff.h>
32 GRUB_NET_MAX_LINK_HEADER_SIZE
= 64,
33 GRUB_NET_UDP_HEADER_SIZE
= 8,
34 GRUB_NET_TCP_HEADER_SIZE
= 20,
35 GRUB_NET_OUR_IPV4_HEADER_SIZE
= 20,
36 GRUB_NET_OUR_IPV6_HEADER_SIZE
= 40,
37 GRUB_NET_OUR_MAX_IP_HEADER_SIZE
= 40,
38 GRUB_NET_TCP_RESERVE_SIZE
= GRUB_NET_TCP_HEADER_SIZE
39 + GRUB_NET_OUR_IPV4_HEADER_SIZE
40 + GRUB_NET_MAX_LINK_HEADER_SIZE
43 typedef enum grub_link_level_protocol_id
45 GRUB_NET_LINK_LEVEL_PROTOCOL_ETHERNET
46 } grub_link_level_protocol_id_t
;
48 typedef struct grub_net_link_level_address
50 grub_link_level_protocol_id_t type
;
55 } grub_net_link_level_address_t
;
57 typedef enum grub_net_interface_flags
59 GRUB_NET_INTERFACE_HWADDRESS_IMMUTABLE
= 1,
60 GRUB_NET_INTERFACE_ADDRESS_IMMUTABLE
= 2,
61 GRUB_NET_INTERFACE_PERMANENT
= 4
62 } grub_net_interface_flags_t
;
64 typedef enum grub_net_card_flags
66 GRUB_NET_CARD_HWADDRESS_IMMUTABLE
= 1,
67 GRUB_NET_CARD_NO_MANUAL_INTERFACES
= 2
68 } grub_net_card_flags_t
;
72 struct grub_net_card_driver
74 struct grub_net_card_driver
*next
;
75 struct grub_net_card_driver
**prev
;
77 grub_err_t (*open
) (struct grub_net_card
*dev
);
78 void (*close
) (struct grub_net_card
*dev
);
79 grub_err_t (*send
) (struct grub_net_card
*dev
,
80 struct grub_net_buff
*buf
);
81 struct grub_net_buff
* (*recv
) (struct grub_net_card
*dev
);
84 typedef struct grub_net_packet
86 struct grub_net_packet
*next
;
87 struct grub_net_packet
*prev
;
88 struct grub_net_packets
*up
;
89 struct grub_net_buff
*nb
;
92 typedef struct grub_net_packets
94 grub_net_packet_t
*first
;
95 grub_net_packet_t
*last
;
99 #ifdef GRUB_MACHINE_EFI
100 #include <grub/efi/api.h>
103 struct grub_net_slaac_mac_list
105 struct grub_net_slaac_mac_list
*next
;
106 struct grub_net_slaac_mac_list
**prev
;
107 grub_net_link_level_address_t address
;
112 struct grub_net_link_layer_entry
;
116 struct grub_net_card
*next
;
117 struct grub_net_card
**prev
;
119 struct grub_net_card_driver
*driver
;
120 grub_net_link_level_address_t default_address
;
121 grub_net_card_flags_t flags
;
124 unsigned idle_poll_delay_ms
;
125 grub_uint64_t last_poll
;
127 struct grub_net_slaac_mac_list
*slaac_list
;
128 grub_ssize_t new_ll_entry
;
129 struct grub_net_link_layer_entry
*link_layer_table
;
132 grub_size_t rcvbufsize
;
133 grub_size_t txbufsize
;
137 #ifdef GRUB_MACHINE_EFI
140 struct grub_efi_simple_network
*efi_net
;
141 grub_efi_handle_t efi_handle
;
142 grub_size_t last_pkt_size
;
150 struct grub_net_network_level_interface
;
152 typedef enum grub_network_level_protocol_id
154 GRUB_NET_NETWORK_LEVEL_PROTOCOL_DHCP_RECV
,
155 GRUB_NET_NETWORK_LEVEL_PROTOCOL_IPV4
,
156 GRUB_NET_NETWORK_LEVEL_PROTOCOL_IPV6
157 } grub_network_level_protocol_id_t
;
163 DNS_OPTION_PREFER_IPV4
,
164 DNS_OPTION_PREFER_IPV6
167 typedef struct grub_net_network_level_address
169 grub_network_level_protocol_id_t type
;
173 grub_uint64_t ipv6
[2];
175 grub_dns_option_t option
;
176 } grub_net_network_level_address_t
;
178 typedef struct grub_net_network_level_netaddress
180 grub_network_level_protocol_id_t type
;
188 grub_uint64_t base
[2];
192 } grub_net_network_level_netaddress_t
;
194 #define FOR_PACKETS(cont,var) for (var = (cont).first; var; var = var->next)
196 static inline grub_err_t
197 grub_net_put_packet (grub_net_packets_t
*pkts
, struct grub_net_buff
*nb
)
199 struct grub_net_packet
*n
;
201 n
= grub_malloc (sizeof (*n
));
211 pkts
->last
->next
= n
;
213 n
->prev
= pkts
->last
;
216 pkts
->first
= pkts
->last
= n
;
220 return GRUB_ERR_NONE
;
224 grub_net_remove_packet (grub_net_packet_t
*pkt
)
229 pkt
->prev
->next
= pkt
->next
;
231 pkt
->up
->first
= pkt
->next
;
233 pkt
->next
->prev
= pkt
->prev
;
235 pkt
->up
->last
= pkt
->prev
;
239 typedef struct grub_net_app_protocol
*grub_net_app_level_t
;
241 typedef struct grub_net_socket
*grub_net_socket_t
;
243 struct grub_net_app_protocol
245 struct grub_net_app_protocol
*next
;
246 struct grub_net_app_protocol
**prev
;
248 grub_err_t (*dir
) (grub_device_t device
, const char *path
,
249 int (*hook
) (const char *filename
,
250 const struct grub_dirhook_info
*info
));
251 grub_err_t (*open
) (struct grub_file
*file
, const char *filename
);
252 grub_err_t (*seek
) (struct grub_file
*file
, grub_off_t off
);
253 grub_err_t (*close
) (struct grub_file
*file
);
254 grub_err_t (*packets_pulled
) (struct grub_file
*file
);
257 typedef struct grub_net
261 grub_net_app_level_t protocol
;
262 grub_net_packets_t packs
;
269 extern grub_net_t (*EXPORT_VAR (grub_net_open
)) (const char *name
);
271 struct grub_net_network_level_interface
273 struct grub_net_network_level_interface
*next
;
274 struct grub_net_network_level_interface
**prev
;
276 struct grub_net_card
*card
;
277 grub_net_network_level_address_t address
;
278 grub_net_link_level_address_t hwaddress
;
279 grub_net_interface_flags_t flags
;
280 struct grub_net_bootp_packet
*dhcp_ack
;
281 grub_size_t dhcp_acklen
;
285 struct grub_net_session
;
287 struct grub_net_session_level_protocol
289 void (*close
) (struct grub_net_session
*session
);
290 grub_ssize_t (*recv
) (struct grub_net_session
*session
, void *buf
,
292 grub_err_t (*send
) (struct grub_net_session
*session
, void *buf
,
296 struct grub_net_session
298 struct grub_net_session_level_protocol
*protocol
;
303 grub_net_session_close (struct grub_net_session
*session
)
305 session
->protocol
->close (session
);
308 static inline grub_err_t
309 grub_net_session_send (struct grub_net_session
*session
, void *buf
,
312 return session
->protocol
->send (session
, buf
, size
);
315 static inline grub_ssize_t
316 grub_net_session_recv (struct grub_net_session
*session
, void *buf
,
319 return session
->protocol
->recv (session
, buf
, size
);
322 struct grub_net_network_level_interface
*
323 grub_net_add_addr (const char *name
,
324 struct grub_net_card
*card
,
325 const grub_net_network_level_address_t
*addr
,
326 const grub_net_link_level_address_t
*hwaddress
,
327 grub_net_interface_flags_t flags
);
329 extern struct grub_net_network_level_interface
*grub_net_network_level_interfaces
;
330 #define FOR_NET_NETWORK_LEVEL_INTERFACES(var) for (var = grub_net_network_level_interfaces; var; var = var->next)
331 #define FOR_NET_NETWORK_LEVEL_INTERFACES_SAFE(var,next) for (var = grub_net_network_level_interfaces, next = (var ? var->next : 0); var; var = next, next = (var ? var->next : 0))
334 extern grub_net_app_level_t grub_net_app_level_list
;
336 #ifndef GRUB_LST_GENERATOR
338 grub_net_app_level_register (grub_net_app_level_t proto
)
340 grub_list_push (GRUB_AS_LIST_P (&grub_net_app_level_list
),
341 GRUB_AS_LIST (proto
));
346 grub_net_app_level_unregister (grub_net_app_level_t proto
)
348 grub_list_remove (GRUB_AS_LIST (proto
));
351 #define FOR_NET_APP_LEVEL(var) FOR_LIST_ELEMENTS((var), \
352 (grub_net_app_level_list))
354 extern struct grub_net_card
*grub_net_cards
;
357 grub_net_card_register (struct grub_net_card
*card
)
359 grub_list_push (GRUB_AS_LIST_P (&grub_net_cards
),
360 GRUB_AS_LIST (card
));
364 grub_net_card_unregister (struct grub_net_card
*card
);
366 #define FOR_NET_CARDS(var) for (var = grub_net_cards; var; var = var->next)
367 #define FOR_NET_CARDS_SAFE(var, next) for (var = grub_net_cards, next = (var ? var->next : 0); var; var = next, next = (var ? var->next : 0))
370 struct grub_net_session
*
371 grub_net_open_tcp (char *address
, grub_uint16_t port
);
374 grub_net_resolve_address (const char *name
,
375 grub_net_network_level_address_t
*addr
);
378 grub_net_resolve_net_address (const char *name
,
379 grub_net_network_level_netaddress_t
*addr
);
382 grub_net_route_address (grub_net_network_level_address_t addr
,
383 grub_net_network_level_address_t
*gateway
,
384 struct grub_net_network_level_interface
**interf
);
388 grub_net_add_route (const char *name
,
389 grub_net_network_level_netaddress_t target
,
390 struct grub_net_network_level_interface
*inter
);
393 grub_net_add_route_gw (const char *name
,
394 grub_net_network_level_netaddress_t target
,
395 grub_net_network_level_address_t gw
);
398 #define GRUB_NET_BOOTP_MAC_ADDR_LEN 16
400 typedef grub_uint8_t grub_net_bootp_mac_addr_t
[GRUB_NET_BOOTP_MAC_ADDR_LEN
];
402 struct grub_net_bootp_packet
405 grub_uint8_t hw_type
; /* hardware type. */
406 grub_uint8_t hw_len
; /* hardware addr len. */
407 grub_uint8_t gate_hops
; /* zero it. */
408 grub_uint32_t ident
; /* random number chosen by client. */
409 grub_uint16_t seconds
; /* seconds since did initial bootstrap. */
411 grub_uint32_t client_ip
;
412 grub_uint32_t your_ip
;
413 grub_uint32_t server_ip
;
414 grub_uint32_t gateway_ip
;
415 grub_net_bootp_mac_addr_t mac_addr
;
416 char server_name
[64];
418 grub_uint8_t vendor
[0];
421 #define GRUB_NET_BOOTP_RFC1048_MAGIC_0 0x63
422 #define GRUB_NET_BOOTP_RFC1048_MAGIC_1 0x82
423 #define GRUB_NET_BOOTP_RFC1048_MAGIC_2 0x53
424 #define GRUB_NET_BOOTP_RFC1048_MAGIC_3 0x63
428 GRUB_NET_BOOTP_PAD
= 0x00,
429 GRUB_NET_BOOTP_NETMASK
= 0x01,
430 GRUB_NET_BOOTP_ROUTER
= 0x03,
431 GRUB_NET_BOOTP_DNS
= 0x06,
432 GRUB_NET_BOOTP_HOSTNAME
= 0x0c,
433 GRUB_NET_BOOTP_DOMAIN
= 0x0f,
434 GRUB_NET_BOOTP_ROOT_PATH
= 0x11,
435 GRUB_NET_BOOTP_EXTENSIONS_PATH
= 0x12,
436 GRUB_NET_BOOTP_END
= 0xff
439 struct grub_net_network_level_interface
*
440 grub_net_configure_by_dhcp_ack (const char *name
,
441 struct grub_net_card
*card
,
442 grub_net_interface_flags_t flags
,
443 const struct grub_net_bootp_packet
*bp
,
445 int is_def
, char **device
, char **path
);
448 grub_net_add_ipv4_local (struct grub_net_network_level_interface
*inf
,
452 grub_net_process_dhcp (struct grub_net_buff
*nb
,
453 struct grub_net_card
*card
);
456 grub_net_hwaddr_cmp (const grub_net_link_level_address_t
*a
,
457 const grub_net_link_level_address_t
*b
);
459 grub_net_addr_cmp (const grub_net_network_level_address_t
*a
,
460 const grub_net_network_level_address_t
*b
);
464 Currently supported adresses:
465 IPv4: XXX.XXX.XXX.XXX
466 IPv6: XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX
468 #define GRUB_NET_MAX_STR_ADDR_LEN sizeof ("XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX")
471 Currently suppoerted adresses:
472 ethernet: XX:XX:XX:XX:XX:XX
475 #define GRUB_NET_MAX_STR_HWADDR_LEN (sizeof ("XX:XX:XX:XX:XX:XX"))
478 grub_net_addr_to_str (const grub_net_network_level_address_t
*target
,
481 grub_net_hwaddr_to_str (const grub_net_link_level_address_t
*addr
, char *str
);
484 grub_net_poll_cards (unsigned time
, int *stop_condition
);
486 void grub_bootp_init (void);
487 void grub_bootp_fini (void);
489 void grub_dns_init (void);
490 void grub_dns_fini (void);
493 grub_net_network_level_interface_unregister (struct grub_net_network_level_interface
*inter
)
495 inter
->card
->num_ifaces
--;
496 *inter
->prev
= inter
->next
;
498 inter
->next
->prev
= inter
->prev
;
504 grub_net_tcp_retransmit (void);
507 grub_net_link_layer_add_address (struct grub_net_card
*card
,
508 const grub_net_network_level_address_t
*nl
,
509 const grub_net_link_level_address_t
*ll
,
512 grub_net_link_layer_resolve_check (struct grub_net_network_level_interface
*inf
,
513 const grub_net_network_level_address_t
*proto_addr
);
515 grub_net_link_layer_resolve (struct grub_net_network_level_interface
*inf
,
516 const grub_net_network_level_address_t
*proto_addr
,
517 grub_net_link_level_address_t
*hw_addr
);
519 grub_net_dns_lookup (const char *name
,
520 const struct grub_net_network_level_address
*servers
,
521 grub_size_t n_servers
,
522 grub_size_t
*naddresses
,
523 struct grub_net_network_level_address
**addresses
,
526 grub_net_add_dns_server (const struct grub_net_network_level_address
*s
);
528 grub_net_remove_dns_server (const struct grub_net_network_level_address
*s
);
531 extern char *grub_net_default_server
;
533 #define GRUB_NET_TRIES 40
534 #define GRUB_NET_INTERVAL 400
536 #endif /* ! GRUB_NET_HEADER */