70 lines
1.4 KiB
C
70 lines
1.4 KiB
C
|
#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);
|
||
|
}
|
||
|
|
||
|
|
||
|
|