grub/grub-core/net/drivers/emu/emunet.c

70 lines
1.4 KiB
C
Raw Normal View History

2010-09-22 15:14:43 +00:00
#include <grub/net/netbuff.h>
#include <sys/socket.h>
#include <netpacket/packet.h>
#include <net/ethernet.h> /* the L2 protocols */
#include <grub/net.h>
static grub_err_t
card_open (struct grub_net_card *dev)
{
dev->data_num = socket (AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
if (dev->data_num < 0)
return grub_error (GRUB_ERR_IO, "couldn't open packet interface");
return GRUB_ERR_NONE;
}
static grub_err_t
card_close (struct grub_net_card *dev)
{
close (dev->data_num);
return GRUB_ERR_NONE;
}
static grub_err_t
send_card_buffer (struct grub_net_card *dev, struct grub_net_buff *pack)
{
ssize_t actual;
actual = write (dev->data_num, pack->data, pack->tail - pack->data);
if (actual < 0)
return grub_error (GRUB_ERR_IO, "couldn't send packets");
return GRUB_ERR_NONE;
}
static grub_err_t
get_card_packet (struct grub_net_card *dev, struct grub_net_buff *pack)
{
ssize_t actual;
grub_netbuff_clear(pack);
actual = read (dev->data_num, pack->data, 1500);
if (actual < 0)
return grub_error (GRUB_ERR_IO, "couldn't receive packets");
grub_netbuff_put (pack, actual);
return GRUB_ERR_NONE;
}
static struct grub_net_card_driver emudriver =
{
.name = "emu",
.init = card_open,
.fini = card_close,
.send = send_card_buffer,
.recv = get_card_packet
};
GRUB_MOD_INIT(emunet)
{
grub_net_card_driver_register (&emudriver);
}
GRUB_MODE_FINI(emunet)
{
grub_net_card_driver_unregister (&emudriver);
}