common = grub-core/commands/blocklist.c;
common = grub-core/commands/extcmd.c;
common = grub-core/commands/ls.c;
- common = grub-core/net/net.c;
- common = grub-core/net/netbuff.c;
common = grub-core/disk/dmraid_nvidia.c;
common = grub-core/disk/loopback.c;
common = grub-core/disk/lvm.c;
if COND_emu
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/datetime.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/emu/misc.h
+KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/emu/export.h
if COND_GRUB_EMU_SDL
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/sdl.h
endif
static grub_err_t
grub_ls_list_devices (int longlist)
{
- grub_net_app_level_t proto;
- int first = 1;
-
auto int grub_ls_print_devices (const char *name);
int grub_ls_print_devices (const char *name)
{
grub_device_iterate (grub_ls_print_devices);
grub_xputs ("\n");
- FOR_NET_APP_LEVEL (proto)
+#ifndef GRUB_UTIL
{
- if (first)
- grub_puts_ (N_ ("Network protocols:"));
- first = 0;
- grub_printf ("%s ", proto->name);
+ grub_net_app_level_t proto;
+ int first = 1;
+ FOR_NET_APP_LEVEL (proto)
+ {
+ if (first)
+ grub_puts_ (N_ ("Network protocols:"));
+ first = 0;
+ grub_printf ("%s ", proto->name);
+ }
+ grub_xputs ("\n");
}
-
- grub_xputs ("\n");
+#endif
grub_refresh ();
grub_memcpy (hw_addr, &entry->ll_address, sizeof (*hw_addr));
return GRUB_ERR_NONE;
}
- grub_net_pool_cards (200);
-
- }
+ grub_net_poll_cards (200);
+ }
- return grub_error (GRUB_ERR_TIMEOUT, "Timeout: could not resolve hardware address.");
+ return grub_error (GRUB_ERR_TIMEOUT, "timeout: could not resolve hardware address");
}
grub_err_t
return GRUB_ERR_NONE;
}
-static grub_size_t
+static grub_ssize_t
get_card_packet (struct grub_net_card *dev __attribute__ ((unused)),
struct grub_net_buff *pack)
{
grub_netbuff_clear(pack);
actual = read (fd, pack->data, 1500);
if (actual < 0)
- {
- grub_error (GRUB_ERR_IO, "couldn't receive packets");
- return -1;
- }
+ return -1;
grub_netbuff_put (pack, actual);
return actual;
GRUB_MOD_INIT(emunet)
{
struct ifreq ifr;
- // char fullname[64];
fd = open ("/dev/net/tun", O_RDWR | O_NONBLOCK);
if (fd < 0)
return;
#include <grub/net/netbuff.h>
-#include <grub/net/ethernet.h>
#include <grub/ieee1275/ofnet.h>
#include <grub/ieee1275/ieee1275.h>
#include <grub/dl.h>
return GRUB_ERR_NONE;
}
-static grub_err_t
+static grub_ssize_t
get_card_packet (struct grub_net_card *dev, struct grub_net_buff *nb)
{
if (actual)
{
grub_netbuff_put (nb, actual);
- return grub_net_recv_ethernet_packet (nb);
+ return actual;
}
- return GRUB_ERR_TIMEOUT;
+ return -1;
}
static struct grub_net_card_driver ofdriver =
#include <grub/dl.h>
#include <grub/command.h>
#include <grub/env.h>
+#include <grub/net/ethernet.h>
GRUB_MOD_LICENSE ("GPLv3+");
grub_net_network_level_address_t gateway;
grub_net_socket_t socket;
static int port = 25300;
+ const char *comma;
- err = grub_net_resolve_address (file->device->net->name
- + sizeof (file->device->net->protocol->name) + 1, &addr);
+ comma = grub_strchr (file->device->net->name, ',');
+ if (!comma)
+ return grub_error (GRUB_ERR_NET_BAD_ADDRESS, "no separator");
+
+ err = grub_net_resolve_address (comma + 1, &addr);
if (err)
return err;
if (err)
return err;
- if ((socket = (grub_net_socket_t) grub_malloc (sizeof (*socket))) == NULL)
- return GRUB_ERR_OUT_OF_MEMORY;
+ socket = (grub_net_socket_t) grub_malloc (sizeof (*socket));
+ if (socket == NULL)
+ return grub_errno;
socket->inf = inf;
socket->out_nla = addr;
socket->in_port = port++;
socket->status = 0;
socket->app = file->device->net->protocol;
- socket->packs = NULL;
+ socket->packs.first = NULL;
+ socket->packs.last = NULL;
file->device->net->socket = socket;
grub_net_socket_register (socket);
- if ((err = file->device->net->protocol->open (file,name)))
+ err = file->device->net->protocol->open (file,name);
+ if (err)
goto fail;
file->not_easily_seekable = 1;
grub_net_file_close_real (grub_file_t file)
{
grub_net_socket_t sock = file->device->net->socket;
- while (sock->packs->first)
+ while (sock->packs.first)
{
- grub_netbuff_free (sock->packs->first->nb);
- grub_net_remove_packet (sock->packs->first);
+ grub_netbuff_free (sock->packs.first->nb);
+ grub_net_remove_packet (sock->packs.first);
}
grub_net_socket_unregister (sock);
grub_free (sock);
}
-static grub_err_t
+static void
receive_packets (struct grub_net_card *card)
{
/* Maybe should be better have a fixed number of packets for each card
and just mark them as used and not used. */
struct grub_net_buff *nb;
- grub_err_t err;
+ grub_ssize_t actual;
nb = grub_netbuff_alloc (1500);
if (!nb)
- return grub_errno;
+ {
+ grub_print_error ();
+ return;
+ }
- if ((err = card->driver->recv (card, nb)) != GRUB_ERR_NONE)
+ actual = card->driver->recv (card, nb);
+ if (actual < 0)
grub_netbuff_free (nb);
- return err;
+ else
+ grub_net_recv_ethernet_packet (nb);
+ grub_print_error ();
}
void
-grub_net_pool_cards (unsigned time)
+grub_net_poll_cards (unsigned time)
{
struct grub_net_card *card;
grub_uint64_t start_time;
FOR_NET_CARDS (card)
{
start_time = grub_get_time_ms ();
- while( (grub_get_time_ms () - start_time) < time)
- if( receive_packets (card) != GRUB_ERR_NONE)
- break;
+ while ((grub_get_time_ms () - start_time) < time)
+ receive_packets (card);
}
}
+/* Read from the packets list*/
static grub_ssize_t
-process_packets (grub_file_t file, void *buf, grub_size_t len,
- void *NESTED_FUNC_ATTR (hook) (void *dest, const void *src, grub_size_t n))
+grub_net_read_real (grub_file_t file, void *buf, grub_size_t len)
{
grub_net_socket_t sock = file->device->net->socket;
struct grub_net_buff *nb;
int try = 0;
while (try <= 3)
{
- while (sock->packs->first)
+ while (sock->packs.first)
{
try = 0;
- nb = sock->packs->first->nb;
- amount = (grub_size_t)(len <= (grub_size_t) (nb->tail - nb->data))? len :(grub_size_t)(nb->tail - nb->data);
+ nb = sock->packs.first->nb;
+ amount = nb->tail - nb->data;
+ if (amount > len)
+ amount = len;
len -= amount;
total += amount;
- hook (ptr, nb->data, amount);
- ptr += amount;
+ if (buf)
+ {
+ grub_memcpy (ptr, nb->data, amount);
+ ptr += amount;
+ }
if (amount == (grub_size_t) (nb->tail - nb->data))
{
grub_netbuff_free (nb);
- grub_net_remove_packet (sock->packs->first);
+ grub_net_remove_packet (sock->packs.first);
}
else
nb->data += amount;
if (sock->status == 1)
{
try++;
- grub_net_pool_cards (200);
+ grub_net_poll_cards (200);
}
else
return total;
return total;
}
-
-/* Read from the packets list*/
-static grub_ssize_t
-grub_net_read_real (grub_file_t file, void *buf, grub_size_t len )
-{
- auto void *NESTED_FUNC_ATTR memcpy_hook (void *dest, const void *src, grub_size_t n);
- void *NESTED_FUNC_ATTR memcpy_hook (void *dest __attribute__ ((unused)), const void *src __attribute__ ((unused)),
- grub_size_t n __attribute__ ((unused)))
- {
- return grub_memcpy (dest, src, n);
- }
- return process_packets (file, buf, len, memcpy_hook);
-}
-
/* Read from the packets list*/
static grub_err_t
grub_net_seek_real (struct grub_file *file, grub_off_t offset)
/* We cant seek backwards past the current packet. */
if (file->offset > offset)
{
- nb = sock->packs->first->nb;
+ nb = sock->packs.first->nb;
return grub_netbuff_push (nb, file->offset - offset);
}
- auto void *NESTED_FUNC_ATTR dummy (void *dest, const void *src, grub_size_t n);
- void *NESTED_FUNC_ATTR dummy (void *dest __attribute__ ((unused)), const void *src __attribute__ ((unused)),
- grub_size_t n __attribute__ ((unused)))
- {
- return NULL;
- }
- process_packets (file, NULL, len, dummy);
+ grub_net_read_real (file, NULL, len);
return GRUB_ERR_NONE;
}
int hdrlen;
char open_data[1500];
struct grub_net_buff nb;
- tftp_data_t data = grub_malloc (sizeof *data);
+ tftp_data_t data;
grub_err_t err;
+
+ data = grub_malloc (sizeof *data);
+ if (!data)
+ return grub_errno;
file->device->net->socket->data = (void *) data;
nb.head = open_data;
/* Receive OACK packet. */
for ( i = 0; i < 3; i++)
{
- grub_net_pool_cards (100);
+ grub_net_poll_cards (100);
if (grub_errno)
return grub_errno;
if (file->device->net->socket->status != 0)
switch (grub_be_to_cpu16 (tftph->opcode))
{
case TFTP_OACK:
- for (ptr = nb->data; ptr < nb->tail; )
+ for (ptr = nb->data + sizeof (tftph->opcode); ptr < nb->tail; )
{
if (grub_memcmp (ptr, "tsize\0", sizeof ("tsize\0") - 1) == 0)
- data->file_size = grub_strtoul (ptr + sizeof ("tsize\0") - 1, 0, 0);
+ {
+ data->file_size = grub_strtoul (ptr + sizeof ("tsize\0") - 1,
+ 0, 0);
+ }
while (ptr < nb->tail && *ptr)
ptr++;
ptr++;
tftph = (struct tftphdr *) nb_ack.data;
tftph->opcode = grub_cpu_to_be16 (TFTP_ACK);
- tftph->u.ack.block = data->block;
+ tftph->u.ack.block = grub_cpu_to_be16 (data->block);
err = grub_net_send_udp_packet (sock, &nb_ack);
return err;
if (grub_be_to_cpu16 (udph->dst) == sock->in_port)
{
if (sock->status == 0)
- sock->out_port = udph->src;
+ sock->out_port = grub_be_to_cpu16 (udph->src);
-
/* App protocol remove its own reader. */
sock->app->read (sock,nb);
/* If there is data, puts packet in socket list */
if ((nb->tail - nb->data) > 0)
- grub_net_put_packet (sock->packs, nb);
+ grub_net_put_packet (&sock->packs, nb);
else
grub_netbuff_free (nb);
return GRUB_ERR_NONE;
grub_err_t (*init) (struct grub_net_card *dev);
grub_err_t (*fini) (struct grub_net_card *dev);
grub_err_t (*send) (struct grub_net_card *dev, struct grub_net_buff *buf);
- grub_size_t (*recv) (struct grub_net_card *dev, struct grub_net_buff *buf);
+ grub_ssize_t (*recv) (struct grub_net_card *dev, struct grub_net_buff *buf);
};
extern struct grub_net_card_driver *grub_net_card_drivers;
grub_net_app_level_t app;
grub_net_network_level_address_t out_nla;
struct grub_net_network_level_interface *inf;
- grub_net_packets_t *packs;
+ grub_net_packets_t packs;
void *data;
};
extern struct grub_net_socket *grub_net_sockets;
static inline void
-grub_net_socket_register (grub_net_socket_t socket)
+grub_net_socket_register (grub_net_socket_t sock)
{
grub_list_push (GRUB_AS_LIST_P (&grub_net_sockets),
- GRUB_AS_LIST (socket));
+ GRUB_AS_LIST (sock));
}
static inline void
-grub_net_socket_unregister (grub_net_socket_t socket)
+grub_net_socket_unregister (grub_net_socket_t sock)
{
grub_list_remove (GRUB_AS_LIST_P (&grub_net_sockets),
- GRUB_AS_LIST (socket));
+ GRUB_AS_LIST (sock));
}
#define FOR_NET_SOCKETS(var) for (var = grub_net_sockets; var; var = var->next)
#define FOR_NET_NL_PACKETS(inf, var) FOR_PACKETS(inf->nl_pending, var)
void
-grub_net_pool_cards (unsigned time);
+grub_net_poll_cards (unsigned time);
extern grub_err_t (*EXPORT_VAR (grub_file_net_close)) (grub_file_t file);
#endif /* ! GRUB_NET_HEADER */