diff --git a/Makefile b/Makefile index 91539de..006218d 100644 --- a/Makefile +++ b/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/include/kvm/uip.h b/include/kvm/uip.h index 32a5da3..c5eb417 100644 --- a/include/kvm/uip.h +++ b/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/uip/arp.c b/uip/arp.c new file mode 100644 index 0000000..98423da --- /dev/null +++ b/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; +}