From: Samuel Thibault <samuel.thibault@gnu.org>
To: Thomas Huth <thuth@redhat.com>
Cc: zhanghailiang <zhang.zhanghailiang@huawei.com>,
Li Zhijian <lizhijian@cn.fujitsu.com>,
Stefan Hajnoczi <stefanha@gmail.com>,
Jason Wang <jasowang@redhat.com>,
qemu-devel@nongnu.org, Vasiliy Tolstov <v.tolstov@selfip.ru>,
Dave Gilbert <dgilbert@redhat.com>,
Gonglei <arei.gonglei@huawei.com>,
Jan Kiszka <jan.kiszka@siemens.com>,
Huangpeng <peter.huangpeng@huawei.com>,
Yang Hongyang <yanghy@cn.fujitsu.com>,
Guillaume Subiron <maethor@subiron.org>
Subject: Re: [Qemu-devel] [PATCH 06/18] slirp: Factorizing and cleaning solookup()
Date: Fri, 11 Dec 2015 21:02:41 +0100 [thread overview]
Message-ID: <20151211200241.GO2764@var.home> (raw)
In-Reply-To: <20151211195102.GK2764@var.home>
[-- Attachment #1: Type: text/plain, Size: 386 bytes --]
Samuel Thibault, on Fri 11 Dec 2015 20:51:02 +0100, wrote:
> Samuel Thibault, on Fri 11 Dec 2015 20:38:19 +0100, wrote:
> > I'll however have a look at introducing the optimizations etc. first, so
> > that both making solookup use sockaddr and introducing sockaddr_equal
> > looks natural.
>
> Yes, it seems to be working very nicely.
Just FYI, here is how it looks like now.
Samuel
[-- Attachment #2: patch6-socket-refactor3 --]
[-- Type: text/plain, Size: 3740 bytes --]
diff --git a/slirp/socket.c b/slirp/socket.c
index 97948e8..6382b6d 100644
--- a/slirp/socket.c
+++ b/slirp/socket.c
@@ -16,23 +16,34 @@ static void sofcantrcvmore(struct socket *so);
static void sofcantsendmore(struct socket *so);
struct socket *
-solookup(struct socket *head, struct in_addr laddr, u_int lport,
+solookup(struct socket **last, struct socket *head,
+ struct in_addr laddr, u_int lport,
struct in_addr faddr, u_int fport)
{
- struct socket *so;
-
- for (so = head->so_next; so != head; so = so->so_next) {
- if (so->so_lport == lport &&
- so->so_laddr.s_addr == laddr.s_addr &&
- so->so_faddr.s_addr == faddr.s_addr &&
- so->so_fport == fport)
- break;
- }
+ struct socket *so = *last;
+
+ /* Optimisation */
+ if (so != head &&
+ so->so_lport == lport &&
+ so->so_laddr.s_addr == laddr.s_addr &&
+ (!faddr.s_addr ||
+ (so->so_faddr.s_addr == faddr.s_addr &&
+ so->so_fport == fport))) {
+ return so;
+ }
- if (so == head)
- return (struct socket *)NULL;
- return so;
+ for (so = head->so_next; so != head; so = so->so_next) {
+ if (so->so_lport == lport &&
+ so->so_laddr.s_addr == laddr.s_addr &&
+ (!faddr.s_addr ||
+ (so->so_faddr.s_addr == faddr.s_addr &&
+ so->so_fport == fport))) {
+ *last = so;
+ return so;
+ }
+ }
+ return (struct socket *)NULL;
}
/*
diff --git a/slirp/socket.h b/slirp/socket.h
index b27bbb2..3077581 100644
--- a/slirp/socket.h
+++ b/slirp/socket.h
@@ -87,7 +87,8 @@ struct socket {
#define SS_HOSTFWD 0x1000 /* Socket describes host->guest forwarding */
#define SS_INCOMING 0x2000 /* Connection was initiated by a host on the internet */
-struct socket * solookup(struct socket *, struct in_addr, u_int, struct in_addr, u_int);
+struct socket * solookup(struct socket **, struct socket *,
+ struct in_addr, u_int, struct in_addr, u_int);
struct socket * socreate(Slirp *);
void sofree(struct socket *);
int soread(struct socket *);
diff --git a/slirp/tcp_input.c b/slirp/tcp_input.c
index 4c3191d..5492061 100644
--- a/slirp/tcp_input.c
+++ b/slirp/tcp_input.c
@@ -320,16 +320,9 @@ tcp_input(struct mbuf *m, int iphlen, struct socket *inso)
* Locate pcb for segment.
*/
findso:
- so = slirp->tcp_last_so;
- if (so->so_fport != ti->ti_dport ||
- so->so_lport != ti->ti_sport ||
- so->so_laddr.s_addr != ti->ti_src.s_addr ||
- so->so_faddr.s_addr != ti->ti_dst.s_addr) {
- so = solookup(&slirp->tcb, ti->ti_src, ti->ti_sport,
- ti->ti_dst, ti->ti_dport);
- if (so)
- slirp->tcp_last_so = so;
- }
+ so = solookup(&slirp->tcp_last_so, &slirp->tcb,
+ ti->ti_src, ti->ti_sport,
+ ti->ti_dst, ti->ti_dport);
/*
* If the state is CLOSED (i.e., TCB does not exist) then
diff --git a/slirp/udp.c b/slirp/udp.c
index 8203eb1..126ef82 100644
--- a/slirp/udp.c
+++ b/slirp/udp.c
@@ -151,25 +151,8 @@ udp_input(register struct mbuf *m, int iphlen)
/*
* Locate pcb for datagram.
*/
- so = slirp->udp_last_so;
- if (so == &slirp->udb || so->so_lport != uh->uh_sport ||
- so->so_laddr.s_addr != ip->ip_src.s_addr) {
- struct socket *tmp;
-
- for (tmp = slirp->udb.so_next; tmp != &slirp->udb;
- tmp = tmp->so_next) {
- if (tmp->so_lport == uh->uh_sport &&
- tmp->so_laddr.s_addr == ip->ip_src.s_addr) {
- so = tmp;
- break;
- }
- }
- if (tmp == &slirp->udb) {
- so = NULL;
- } else {
- slirp->udp_last_so = so;
- }
- }
+ so = solookup(&slirp->udp_last_so, &slirp->udb,
+ ip->ip_src, uh->uh_sport, (struct in_addr) {0}, 0);
if (so == NULL) {
/*
[-- Attachment #3: patch7-socket-refactor4 --]
[-- Type: text/plain, Size: 4860 bytes --]
diff --git a/slirp/socket.c b/slirp/socket.c
index 6382b6d..a4db442 100644
--- a/slirp/socket.c
+++ b/slirp/socket.c
@@ -15,29 +15,20 @@
static void sofcantrcvmore(struct socket *so);
static void sofcantsendmore(struct socket *so);
-struct socket *
-solookup(struct socket **last, struct socket *head,
- struct in_addr laddr, u_int lport,
- struct in_addr faddr, u_int fport)
+struct socket *solookup(struct socket **last, struct socket *head,
+ struct sockaddr_storage *lhost, struct sockaddr_storage *fhost)
{
struct socket *so = *last;
/* Optimisation */
- if (so != head &&
- so->so_lport == lport &&
- so->so_laddr.s_addr == laddr.s_addr &&
- (!faddr.s_addr ||
- (so->so_faddr.s_addr == faddr.s_addr &&
- so->so_fport == fport))) {
+ if (so != head && sockaddr_equal(&(so->lhost.ss), lhost)
+ && (!fhost || sockaddr_equal(&(so->fhost.ss), fhost))) {
return so;
}
for (so = head->so_next; so != head; so = so->so_next) {
- if (so->so_lport == lport &&
- so->so_laddr.s_addr == laddr.s_addr &&
- (!faddr.s_addr ||
- (so->so_faddr.s_addr == faddr.s_addr &&
- so->so_fport == fport))) {
+ if (sockaddr_equal(&(so->lhost.ss), lhost)
+ && (!fhost || sockaddr_equal(&(so->fhost.ss), fhost))) {
*last = so;
return so;
}
diff --git a/slirp/socket.h b/slirp/socket.h
index 3077581..8a23125 100644
--- a/slirp/socket.h
+++ b/slirp/socket.h
@@ -87,8 +87,27 @@ struct socket {
#define SS_HOSTFWD 0x1000 /* Socket describes host->guest forwarding */
#define SS_INCOMING 0x2000 /* Connection was initiated by a host on the internet */
-struct socket * solookup(struct socket **, struct socket *,
- struct in_addr, u_int, struct in_addr, u_int);
+static inline int sockaddr_equal(struct sockaddr_storage *a,
+ struct sockaddr_storage *b)
+{
+ if (a->ss_family != b->ss_family)
+ return 0;
+
+ switch (a->ss_family) {
+ case AF_INET:
+ {
+ struct sockaddr_in *a4 = (struct sockaddr_in *) a;
+ struct sockaddr_in *b4 = (struct sockaddr_in *) b;
+ return (a4->sin_addr.s_addr == b4->sin_addr.s_addr
+ && a4->sin_port == b4->sin_port);
+ }
+ default:
+ assert(0);
+ }
+}
+
+struct socket *solookup(struct socket **, struct socket *,
+ struct sockaddr_storage *, struct sockaddr_storage *);
struct socket * socreate(Slirp *);
void sofree(struct socket *);
int soread(struct socket *);
diff --git a/slirp/tcp_input.c b/slirp/tcp_input.c
index 5492061..8c4fa62 100644
--- a/slirp/tcp_input.c
+++ b/slirp/tcp_input.c
@@ -227,6 +227,7 @@ tcp_input(struct mbuf *m, int iphlen, struct socket *inso)
int iss = 0;
u_long tiwin;
int ret;
+ struct sockaddr_storage lhost, fhost;
struct ex_list *ex_ptr;
Slirp *slirp;
@@ -320,9 +321,14 @@ tcp_input(struct mbuf *m, int iphlen, struct socket *inso)
* Locate pcb for segment.
*/
findso:
- so = solookup(&slirp->tcp_last_so, &slirp->tcb,
- ti->ti_src, ti->ti_sport,
- ti->ti_dst, ti->ti_dport);
+ lhost.ss_family = AF_INET;
+ ((struct sockaddr_in *)&lhost)->sin_addr = ti->ti_src;
+ ((struct sockaddr_in *)&lhost)->sin_port = ti->ti_sport;
+ fhost.ss_family = AF_INET;
+ ((struct sockaddr_in *)&fhost)->sin_addr = ti->ti_dst;
+ ((struct sockaddr_in *)&fhost)->sin_port = ti->ti_dport;
+
+ so = solookup(&slirp->tcp_last_so, &slirp->tcb, &lhost, &fhost);
/*
* If the state is CLOSED (i.e., TCB does not exist) then
@@ -367,12 +373,8 @@ findso:
sbreserve(&so->so_snd, TCP_SNDSPACE);
sbreserve(&so->so_rcv, TCP_RCVSPACE);
- so->so_lfamily = AF_INET;
- so->so_laddr = ti->ti_src;
- so->so_lport = ti->ti_sport;
- so->so_ffamily = AF_INET;
- so->so_faddr = ti->ti_dst;
- so->so_fport = ti->ti_dport;
+ so->lhost.ss = lhost;
+ so->fhost.ss = fhost;
if ((so->so_iptos = tcp_tos(so)) == 0)
so->so_iptos = ((struct ip *)ti)->ip_tos;
diff --git a/slirp/udp.c b/slirp/udp.c
index 126ef82..f2dd773 100644
--- a/slirp/udp.c
+++ b/slirp/udp.c
@@ -70,6 +70,7 @@ udp_input(register struct mbuf *m, int iphlen)
int len;
struct ip save_ip;
struct socket *so;
+ struct sockaddr_storage lhost;
DEBUG_CALL("udp_input");
DEBUG_ARG("m = %p", m);
@@ -151,8 +152,11 @@ udp_input(register struct mbuf *m, int iphlen)
/*
* Locate pcb for datagram.
*/
- so = solookup(&slirp->udp_last_so, &slirp->udb,
- ip->ip_src, uh->uh_sport, (struct in_addr) {0}, 0);
+ lhost.ss_family = AF_INET;
+ ((struct sockaddr_in *)&lhost)->sin_addr = ip->ip_src;
+ ((struct sockaddr_in *)&lhost)->sin_port = uh->uh_sport;
+
+ so = solookup(&slirp->udp_last_so, &slirp->udb, &lhost, NULL);
if (so == NULL) {
/*
next prev parent reply other threads:[~2015-12-11 20:02 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-12-11 0:15 [Qemu-devel] [PATCHv5 00/18] slirp: Adding IPv6 support to Qemu -net user mode Samuel Thibault
2015-12-11 0:15 ` [Qemu-devel] [PATCH 01/18] slirp: goto bad in udp_input if sosendto fails Samuel Thibault
2015-12-11 0:15 ` [Qemu-devel] [PATCH 02/18] slirp: Generalizing and neutralizing code before adding IPv6 stuff Samuel Thibault
2015-12-11 13:38 ` Thomas Huth
2015-12-11 13:43 ` Thomas Huth
2015-12-11 13:47 ` Samuel Thibault
2015-12-11 13:52 ` Thomas Huth
2015-12-11 13:49 ` Thomas Huth
2015-12-11 14:01 ` Samuel Thibault
2015-12-11 14:32 ` Thomas Huth
2015-12-11 14:55 ` Samuel Thibault
2015-12-11 15:09 ` Thomas Huth
2015-12-11 15:40 ` Laszlo Ersek
2015-12-11 15:41 ` Samuel Thibault
2015-12-11 16:17 ` Eric Blake
2015-12-11 18:01 ` Laszlo Ersek
2015-12-11 13:45 ` Samuel Thibault
2015-12-11 20:10 ` Samuel Thibault
2015-12-11 0:15 ` [Qemu-devel] [PATCH 03/18] slirp: Reindent after refactoring Samuel Thibault
2015-12-11 0:15 ` [Qemu-devel] [PATCH 04/18] slirp: Make Socket structure IPv6 compatible Samuel Thibault
2015-12-11 14:47 ` Thomas Huth
2015-12-11 0:15 ` [Qemu-devel] [PATCH 05/18] slirp: Factorizing address translation Samuel Thibault
2015-12-11 23:14 ` Samuel Thibault
2015-12-14 11:41 ` Thomas Huth
2015-12-11 0:15 ` [Qemu-devel] [PATCH 06/18] slirp: Factorizing and cleaning solookup() Samuel Thibault
2015-12-11 15:06 ` Thomas Huth
2015-12-11 19:29 ` Samuel Thibault
2015-12-11 19:38 ` Samuel Thibault
2015-12-11 19:51 ` Samuel Thibault
2015-12-11 20:02 ` Samuel Thibault [this message]
2015-12-11 0:15 ` [Qemu-devel] [PATCH 07/18] slirp: Make udp_attach IPv6 compatible Samuel Thibault
2015-12-11 15:12 ` Thomas Huth
2015-12-11 0:15 ` [Qemu-devel] [PATCH 08/18] slirp: Adding family argument to tcp_fconnect() Samuel Thibault
2015-12-11 15:26 ` Thomas Huth
2015-12-11 0:15 ` [Qemu-devel] [PATCH 09/18] qemu/timer.h : Adding function to second scale Samuel Thibault
2015-12-11 0:15 ` [Qemu-devel] [PATCH 10/18] slirp: Adding IPv6, ICMPv6 Echo and NDP autoconfiguration Samuel Thibault
2015-12-11 0:15 ` [Qemu-devel] [PATCH 11/18] slirp: Adding ICMPv6 error sending Samuel Thibault
2015-12-11 0:15 ` [Qemu-devel] [PATCH 12/18] slirp: Adding IPv6 UDP support Samuel Thibault
2015-12-11 0:15 ` [Qemu-devel] [PATCH 13/18] slirp: Factorizing tcpiphdr structure with an union Samuel Thibault
2015-12-11 0:15 ` [Qemu-devel] [PATCH 14/18] slirp: Generalizing and neutralizing various TCP functions before adding IPv6 stuff Samuel Thibault
2015-12-11 0:15 ` [Qemu-devel] [PATCH 15/18] slirp: Reindent after refactoring Samuel Thibault
2015-12-11 0:15 ` [Qemu-devel] [PATCH 16/18] slirp: Handle IPv6 in TCP functions Samuel Thibault
2015-12-11 0:15 ` [Qemu-devel] [PATCH 17/18] slirp: Adding IPv6 address for DNS relay Samuel Thibault
2015-12-11 0:15 ` [Qemu-devel] [PATCH 18/18] qapi-schema, qemu-options & slirp: Adding Qemu options for IPv6 addresses Samuel Thibault
2015-12-11 11:54 ` [Qemu-devel] [PATCH 01/18] slirp: goto bad in udp_input if sosendto fails Thomas Huth
2015-12-11 12:05 ` Samuel Thibault
-- strict thread matches above, loose matches on Subject: below --
2015-07-28 22:57 [Qemu-devel] [PATCHv4 00/18] slirp: Adding IPv6 support to Qemu -net user mode Samuel Thibault
2015-07-28 22:57 ` [Qemu-devel] [PATCH 01/18] slirp: goto bad in udp_input if sosendto fails Samuel Thibault
2015-07-28 22:57 ` [Qemu-devel] [PATCH 06/18] slirp: Factorizing and cleaning solookup() Samuel Thibault
2014-03-30 22:22 [Qemu-devel] [PATCHv4 00/18] slirp: Adding IPv6 support to Qemu -net user mode Samuel Thibault
2014-03-30 22:22 ` [Qemu-devel] [PATCH 06/18] slirp: Factorizing and cleaning solookup() Samuel Thibault
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20151211200241.GO2764@var.home \
--to=samuel.thibault@gnu.org \
--cc=arei.gonglei@huawei.com \
--cc=dgilbert@redhat.com \
--cc=jan.kiszka@siemens.com \
--cc=jasowang@redhat.com \
--cc=lizhijian@cn.fujitsu.com \
--cc=maethor@subiron.org \
--cc=peter.huangpeng@huawei.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@gmail.com \
--cc=thuth@redhat.com \
--cc=v.tolstov@selfip.ru \
--cc=yanghy@cn.fujitsu.com \
--cc=zhang.zhanghailiang@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).