@@ -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);
new file mode 100644
@@ -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;
+}
- 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> --- tools/kvm/Makefile | 1 + tools/kvm/include/kvm/uip.h | 15 +++++++++++++++ tools/kvm/uip/arp.c | 30 ++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 0 deletions(-) create mode 100644 tools/kvm/uip/arp.c