mirror of
https://github.com/clearlinux/kvmtool.git
synced 2026-08-28 09:55:57 +00:00
kvm tools: Add ARP support for uip
- Introduce struct uip_arp to present ARP package - uip_tx_do_arp() Clone incoming ARP ethernet frame, if ARP is requesting host IP address, tell guest host MAC address. Signed-off-by: Asias He <asias.hejun@gmail.com> Signed-off-by: Pekka Enberg <penberg@kernel.org>
This commit is contained in:
@@ -45,6 +45,7 @@ OBJS += disk/qcow.o
|
||||
OBJS += disk/raw.o
|
||||
OBJS += ioeventfd.o
|
||||
OBJS += irq.o
|
||||
OBJS += uip/arp.o
|
||||
OBJS += uip/buf.o
|
||||
OBJS += kvm-cmd.o
|
||||
OBJS += kvm-debug.o
|
||||
|
||||
@@ -21,6 +21,19 @@ struct uip_eth {
|
||||
u16 type;
|
||||
} __attribute__((packed));
|
||||
|
||||
struct uip_arp {
|
||||
struct uip_eth eth;
|
||||
u16 hwtype;
|
||||
u16 proto;
|
||||
u8 hwlen;
|
||||
u8 protolen;
|
||||
u16 op;
|
||||
struct uip_eth_addr smac;
|
||||
u32 sip;
|
||||
struct uip_eth_addr dmac;
|
||||
u32 dip;
|
||||
} __attribute__((packed));
|
||||
|
||||
struct uip_info {
|
||||
struct list_head udp_socket_head;
|
||||
struct list_head tcp_socket_head;
|
||||
@@ -60,6 +73,8 @@ struct uip_tx_arg {
|
||||
int eth_len;
|
||||
};
|
||||
|
||||
int uip_tx_do_arp(struct uip_tx_arg *arg);
|
||||
|
||||
struct uip_buf *uip_buf_set_used(struct uip_info *info, struct uip_buf *buf);
|
||||
struct uip_buf *uip_buf_set_free(struct uip_info *info, struct uip_buf *buf);
|
||||
struct uip_buf *uip_buf_get_used(struct uip_info *info);
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
#include "kvm/uip.h"
|
||||
|
||||
int uip_tx_do_arp(struct uip_tx_arg *arg)
|
||||
{
|
||||
struct uip_arp *arp, *arp2;
|
||||
struct uip_info *info;
|
||||
struct uip_buf *buf;
|
||||
|
||||
info = arg->info;
|
||||
buf = uip_buf_clone(arg);
|
||||
|
||||
arp = (struct uip_arp *)(arg->eth);
|
||||
arp2 = (struct uip_arp *)(buf->eth);
|
||||
|
||||
/*
|
||||
* ARP replay code: 2
|
||||
*/
|
||||
arp2->op = htons(0x2);
|
||||
arp2->dmac = arp->smac;
|
||||
arp2->dip = arp->sip;
|
||||
|
||||
if (arp->dip == htonl(info->host_ip)) {
|
||||
arp2->smac = info->host_mac;
|
||||
arp2->sip = htonl(info->host_ip);
|
||||
|
||||
uip_buf_set_used(info, buf);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user