From 98198e32d2cc6965656af2b075ec65f5c2a4c4a2 Mon Sep 17 00:00:00 2001 From: Asias He Date: Wed, 29 Jun 2011 16:47:07 +0800 Subject: [PATCH] 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 Signed-off-by: Pekka Enberg --- tools/kvm/Makefile | 1 + tools/kvm/include/kvm/uip.h | 15 +++++++++++++++ tools/kvm/uip/arp.c | 30 ++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+) create mode 100644 tools/kvm/uip/arp.c diff --git a/tools/kvm/Makefile b/tools/kvm/Makefile index 91539de76234..006218d736bc 100644 --- a/tools/kvm/Makefile +++ b/tools/kvm/Makefile @@ -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 diff --git a/tools/kvm/include/kvm/uip.h b/tools/kvm/include/kvm/uip.h index 32a5da365ad5..c5eb4172206a 100644 --- a/tools/kvm/include/kvm/uip.h +++ b/tools/kvm/include/kvm/uip.h @@ -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); diff --git a/tools/kvm/uip/arp.c b/tools/kvm/uip/arp.c new file mode 100644 index 000000000000..98423da6cb19 --- /dev/null +++ b/tools/kvm/uip/arp.c @@ -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; +} -- 2.39.5