Message ID | 1448627251-11186-10-git-send-email-zhangchen.fnst@cn.fujitsu.com |
---|---|
State | New |
Headers | show |
* Zhang Chen (zhangchen.fnst@cn.fujitsu.com) wrote: > From: zhangchen <zhangchen.fnst@cn.fujitsu.com> > > Lookup same connection's primary and secondary packet > to compare,if same we will send primary packet and > drop secondary packet,else send all of primary > packets be queued,drop secondary queue and notify > colo to do checkpoint > > Signed-off-by: zhangchen <zhangchen.fnst@cn.fujitsu.com> > --- > net/colo-proxy.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 74 insertions(+) > > diff --git a/net/colo-proxy.c b/net/colo-proxy.c > index 5f1852a..847f7f2 100644 > --- a/net/colo-proxy.c > +++ b/net/colo-proxy.c > @@ -70,6 +70,41 @@ static Connection *connection_new(void) > return connection; > } > > +static void colo_send_primary_packet(void *opaque, void *user_data) > +{ > + Packet *pkt = opaque; > + qemu_net_queue_send(pkt->s->incoming_queue, pkt->sender, 0, > + (const uint8_t *)pkt->data, pkt->size, NULL); > +} > + > +static void colo_flush_connection(void *opaque, void *user_data) > +{ > + Connection *connection = opaque; > + g_queue_foreach(&connection->primary_list, colo_send_primary_packet, NULL); > + g_queue_foreach(&connection->secondary_list, packet_destroy, NULL); > +} > + > +static void colo_proxy_notify_checkpoint(void) > +{ > + DEBUG("colo_proxy_notify_checkpoint\n"); > +} > + > +static void colo_proxy_do_checkpoint(NetFilterState *nf) > +{ > + ColoProxyState *s = FILTER_COLO_PROXY(nf); > + > + g_queue_foreach(&s->unprocessed_connections, colo_flush_connection, NULL); > +} > + > +/* > + * colo failover flag > + */ > +static ssize_t colo_has_failover(NetFilterState *nf) > +{ > + ColoProxyState *s = FILTER_COLO_PROXY(nf); > + return s->has_failover; > +} > + > /* Return 0 on success, or return -1 if the pkt is corrpted */ > static int parse_packet_early(Packet *pkt, Connection_key *key) > { > @@ -136,6 +171,45 @@ static void packet_destroy(void *opaque, void *user_data) > g_slice_free(Packet, pkt); > } > > +/* > + * The sent IP packets comparison between primary > + * and secondary > + * TODO: support ip fragment > + * return: true means packet same > + * false means packet different > + */ > +static bool colo_packet_compare(Packet *ppkt, Packet *spkt) > +{ > + int i; > + DEBUG("colo_packet_compare lens ppkt %d,spkt %d\n", ppkt->size, > + spkt->size); > + DEBUG("primary pkt data=%s, pkt->ip->ipsrc=%x,pkt->ip->ipdst=%x\n", > + (char *)ppkt->data, ppkt->ip->ip_src, ppkt->ip->ip_dst); > + DEBUG("seconda pkt data=%s, pkt->ip->ipsrc=%x,pkt->ip->ipdst=%x\n", > + (char *)spkt->data, spkt->ip->ip_src, spkt->ip->ip_dst); Is it always IP packets we're comparing at this point? > + if (ppkt->size == spkt->size) { > + DEBUG("colo_packet_compare data ppkt\n"); > + for (i = 0; i < spkt->size; i++) { > + DEBUG("%x", ((char *)ppkt->data)[i]); > + DEBUG("|"); > + } > + DEBUG("\ncolo_packet_compare data spkt\n"); > + for (i = 0; i < spkt->size; i++) { > + DEBUG("%x", ((char *)spkt->data)[i]); > + DEBUG("|"); > + } > + DEBUG("\ncolo_packet_compare data ppkt %s\n", (char *)ppkt->data); > + DEBUG("colo_packet_compare data spkt %s\n", (char *)spkt->data); It's probably better to make these a helper debug routine to dump a packet; I bet you'll wnat to sometimes do it when the sizes are different. > + if (!memcmp(ppkt->data, spkt->data, spkt->size)) { > + return true; > + } else { > + return false; > + } > + } else { > + return false; > + } > +} > + > static Connection *colo_proxy_enqueue_packet(GHashTable *unprocessed_packets, > Connection_key *key, > Packet *pkt, packet_type type) > -- > 1.9.1 > > > Dave -- Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
Hi,Dave On 12/02/2015 12:37 AM, Dr. David Alan Gilbert wrote: > * Zhang Chen (zhangchen.fnst@cn.fujitsu.com) wrote: >> From: zhangchen <zhangchen.fnst@cn.fujitsu.com> >> >> Lookup same connection's primary and secondary packet >> to compare,if same we will send primary packet and >> drop secondary packet,else send all of primary >> packets be queued,drop secondary queue and notify >> colo to do checkpoint >> >> Signed-off-by: zhangchen <zhangchen.fnst@cn.fujitsu.com> >> --- >> net/colo-proxy.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ >> 1 file changed, 74 insertions(+) >> >> diff --git a/net/colo-proxy.c b/net/colo-proxy.c >> index 5f1852a..847f7f2 100644 >> --- a/net/colo-proxy.c >> +++ b/net/colo-proxy.c >> @@ -70,6 +70,41 @@ static Connection *connection_new(void) >> return connection; >> } >> >> +static void colo_send_primary_packet(void *opaque, void *user_data) >> +{ >> + Packet *pkt = opaque; >> + qemu_net_queue_send(pkt->s->incoming_queue, pkt->sender, 0, >> + (const uint8_t *)pkt->data, pkt->size, NULL); >> +} >> + >> +static void colo_flush_connection(void *opaque, void *user_data) >> +{ >> + Connection *connection = opaque; >> + g_queue_foreach(&connection->primary_list, colo_send_primary_packet, NULL); >> + g_queue_foreach(&connection->secondary_list, packet_destroy, NULL); >> +} >> + >> +static void colo_proxy_notify_checkpoint(void) >> +{ >> + DEBUG("colo_proxy_notify_checkpoint\n"); >> +} >> + >> +static void colo_proxy_do_checkpoint(NetFilterState *nf) >> +{ >> + ColoProxyState *s = FILTER_COLO_PROXY(nf); >> + >> + g_queue_foreach(&s->unprocessed_connections, colo_flush_connection, NULL); >> +} >> + >> +/* >> + * colo failover flag >> + */ >> +static ssize_t colo_has_failover(NetFilterState *nf) >> +{ >> + ColoProxyState *s = FILTER_COLO_PROXY(nf); >> + return s->has_failover; >> +} >> + >> /* Return 0 on success, or return -1 if the pkt is corrpted */ >> static int parse_packet_early(Packet *pkt, Connection_key *key) >> { >> @@ -136,6 +171,45 @@ static void packet_destroy(void *opaque, void *user_data) >> g_slice_free(Packet, pkt); >> } >> >> +/* >> + * The sent IP packets comparison between primary >> + * and secondary >> + * TODO: support ip fragment >> + * return: true means packet same >> + * false means packet different >> + */ >> +static bool colo_packet_compare(Packet *ppkt, Packet *spkt) >> +{ >> + int i; >> + DEBUG("colo_packet_compare lens ppkt %d,spkt %d\n", ppkt->size, >> + spkt->size); >> + DEBUG("primary pkt data=%s, pkt->ip->ipsrc=%x,pkt->ip->ipdst=%x\n", >> + (char *)ppkt->data, ppkt->ip->ip_src, ppkt->ip->ip_dst); >> + DEBUG("seconda pkt data=%s, pkt->ip->ipsrc=%x,pkt->ip->ipdst=%x\n", >> + (char *)spkt->data, spkt->ip->ip_src, spkt->ip->ip_dst); > Is it always IP packets we're comparing at this point? yes,you are right >> + if (ppkt->size == spkt->size) { >> + DEBUG("colo_packet_compare data ppkt\n"); >> + for (i = 0; i < spkt->size; i++) { >> + DEBUG("%x", ((char *)ppkt->data)[i]); >> + DEBUG("|"); >> + } >> + DEBUG("\ncolo_packet_compare data spkt\n"); >> + for (i = 0; i < spkt->size; i++) { >> + DEBUG("%x", ((char *)spkt->data)[i]); >> + DEBUG("|"); >> + } >> + DEBUG("\ncolo_packet_compare data ppkt %s\n", (char *)ppkt->data); >> + DEBUG("colo_packet_compare data spkt %s\n", (char *)spkt->data); > It's probably better to make these a helper debug routine to dump > a packet; I bet you'll wnat to sometimes do it when the sizes > are different. I will dump packet before diff size in next version Thanks for review zhangchen >> + if (!memcmp(ppkt->data, spkt->data, spkt->size)) { >> + return true; >> + } else { >> + return false; >> + } >> + } else { >> + return false; >> + } >> +} >> + >> static Connection *colo_proxy_enqueue_packet(GHashTable *unprocessed_packets, >> Connection_key *key, >> Packet *pkt, packet_type type) >> -- >> 1.9.1 >> >> >> > Dave > > -- > Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK > > > . >
diff --git a/net/colo-proxy.c b/net/colo-proxy.c index 5f1852a..847f7f2 100644 --- a/net/colo-proxy.c +++ b/net/colo-proxy.c @@ -70,6 +70,41 @@ static Connection *connection_new(void) return connection; } +static void colo_send_primary_packet(void *opaque, void *user_data) +{ + Packet *pkt = opaque; + qemu_net_queue_send(pkt->s->incoming_queue, pkt->sender, 0, + (const uint8_t *)pkt->data, pkt->size, NULL); +} + +static void colo_flush_connection(void *opaque, void *user_data) +{ + Connection *connection = opaque; + g_queue_foreach(&connection->primary_list, colo_send_primary_packet, NULL); + g_queue_foreach(&connection->secondary_list, packet_destroy, NULL); +} + +static void colo_proxy_notify_checkpoint(void) +{ + DEBUG("colo_proxy_notify_checkpoint\n"); +} + +static void colo_proxy_do_checkpoint(NetFilterState *nf) +{ + ColoProxyState *s = FILTER_COLO_PROXY(nf); + + g_queue_foreach(&s->unprocessed_connections, colo_flush_connection, NULL); +} + +/* + * colo failover flag + */ +static ssize_t colo_has_failover(NetFilterState *nf) +{ + ColoProxyState *s = FILTER_COLO_PROXY(nf); + return s->has_failover; +} + /* Return 0 on success, or return -1 if the pkt is corrpted */ static int parse_packet_early(Packet *pkt, Connection_key *key) { @@ -136,6 +171,45 @@ static void packet_destroy(void *opaque, void *user_data) g_slice_free(Packet, pkt); } +/* + * The sent IP packets comparison between primary + * and secondary + * TODO: support ip fragment + * return: true means packet same + * false means packet different + */ +static bool colo_packet_compare(Packet *ppkt, Packet *spkt) +{ + int i; + DEBUG("colo_packet_compare lens ppkt %d,spkt %d\n", ppkt->size, + spkt->size); + DEBUG("primary pkt data=%s, pkt->ip->ipsrc=%x,pkt->ip->ipdst=%x\n", + (char *)ppkt->data, ppkt->ip->ip_src, ppkt->ip->ip_dst); + DEBUG("seconda pkt data=%s, pkt->ip->ipsrc=%x,pkt->ip->ipdst=%x\n", + (char *)spkt->data, spkt->ip->ip_src, spkt->ip->ip_dst); + if (ppkt->size == spkt->size) { + DEBUG("colo_packet_compare data ppkt\n"); + for (i = 0; i < spkt->size; i++) { + DEBUG("%x", ((char *)ppkt->data)[i]); + DEBUG("|"); + } + DEBUG("\ncolo_packet_compare data spkt\n"); + for (i = 0; i < spkt->size; i++) { + DEBUG("%x", ((char *)spkt->data)[i]); + DEBUG("|"); + } + DEBUG("\ncolo_packet_compare data ppkt %s\n", (char *)ppkt->data); + DEBUG("colo_packet_compare data spkt %s\n", (char *)spkt->data); + if (!memcmp(ppkt->data, spkt->data, spkt->size)) { + return true; + } else { + return false; + } + } else { + return false; + } +} + static Connection *colo_proxy_enqueue_packet(GHashTable *unprocessed_packets, Connection_key *key, Packet *pkt, packet_type type)