From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Kd9Ez-0001cb-Nq for qemu-devel@nongnu.org; Tue, 09 Sep 2008 15:51:09 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Kd9Ex-0001Un-02 for qemu-devel@nongnu.org; Tue, 09 Sep 2008 15:51:08 -0400 Received: from [199.232.76.173] (port=35813 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Kd9Ev-0001UQ-EM for qemu-devel@nongnu.org; Tue, 09 Sep 2008 15:51:05 -0400 Received: from e31.co.us.ibm.com ([32.97.110.149]:39382) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1Kd9Ev-0001vN-ME for qemu-devel@nongnu.org; Tue, 09 Sep 2008 15:51:05 -0400 Received: from d03relay02.boulder.ibm.com (d03relay02.boulder.ibm.com [9.17.195.227]) by e31.co.us.ibm.com (8.13.8/8.13.8) with ESMTP id m89JosBd022504 for ; Tue, 9 Sep 2008 15:50:54 -0400 Received: from d03av01.boulder.ibm.com (d03av01.boulder.ibm.com [9.17.195.167]) by d03relay02.boulder.ibm.com (8.13.8/8.13.8/NCO v9.1) with ESMTP id m89JoqgT157994 for ; Tue, 9 Sep 2008 13:50:53 -0600 Received: from d03av01.boulder.ibm.com (loopback [127.0.0.1]) by d03av01.boulder.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id m89Jop1T007735 for ; Tue, 9 Sep 2008 13:50:51 -0600 From: Anthony Liguori Date: Tue, 9 Sep 2008 14:49:57 -0500 Message-Id: <1220989802-13706-6-git-send-email-aliguori@us.ibm.com> In-Reply-To: <1220989802-13706-1-git-send-email-aliguori@us.ibm.com> References: <1220989802-13706-1-git-send-email-aliguori@us.ibm.com> Subject: [Qemu-devel] [PATCH 5/10] Add network announce function Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Chris Wright , Uri Lublin , Anthony Liguori , kvm@vger.kernel.org This patch adds an ethernet announce function that will minimize downtime when doing a live migration. Signed-off-by: Anthony Liguori diff --git a/sysemu.h b/sysemu.h index b12fae0..cebcc60 100644 --- a/sysemu.h +++ b/sysemu.h @@ -46,6 +46,8 @@ void do_loadvm(const char *name); void do_delvm(const char *name); void do_info_snapshots(void); +void qemu_announce_self(void); + void main_loop_wait(int timeout); /* Polling handling */ diff --git a/vl.c b/vl.c index ac9f8b0..7093c9c 100644 --- a/vl.c +++ b/vl.c @@ -6115,6 +6115,45 @@ void qemu_del_wait_object(HANDLE handle, WaitObjectFunc *func, void *opaque) } #endif +#define SELF_ANNOUNCE_ROUNDS 5 +#define ETH_P_EXPERIMENTAL 0x01F1 /* just a number */ +//#define ETH_P_EXPERIMENTAL 0x0012 /* make it the size of the packet */ +#define EXPERIMENTAL_MAGIC 0xf1f23f4f + +static int announce_self_create(uint8_t *buf, + uint8_t *mac_addr) +{ + uint32_t magic = EXPERIMENTAL_MAGIC; + uint16_t proto = htons(ETH_P_EXPERIMENTAL); + + /* FIXME: should we send a different packet (arp/rarp/ping)? */ + + memset(buf, 0xff, 6); /* h_dst */ + memcpy(buf + 6, mac_addr, 6); /* h_src */ + memcpy(buf + 12, &proto, 2); /* h_proto */ + memcpy(buf + 14, &magic, 4); /* magic */ + + return 18; /* len */ +} + +void qemu_announce_self(void) +{ + int i, j, len; + VLANState *vlan; + VLANClientState *vc; + uint8_t buf[256]; + + for (i = 0; i < nb_nics; i++) { + len = announce_self_create(buf, nd_table[i].macaddr); + vlan = nd_table[i].vlan; + for(vc = vlan->first_client; vc != NULL; vc = vc->next) { + if (vc->fd_read == tap_receive) /* send only if tap */ + for (j=0; j < SELF_ANNOUNCE_ROUNDS; j++) + vc->fd_read(vc->opaque, buf, len); + } + } +} + /***********************************************************/ /* savevm/loadvm support */