]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/qemu-xen.git/commitdiff
slirp: Factorizing and cleaning solookup()
authorGuillaume Subiron <maethor@subiron.org>
Sat, 19 Dec 2015 21:25:00 +0000 (22:25 +0100)
committerJason Wang <jasowang@redhat.com>
Thu, 4 Feb 2016 05:22:06 +0000 (13:22 +0800)
solookup() was only compatible with TCP. Having the socket list in
argument, it is now compatible with UDP too.

Some optimization code is factorized inside the function (the function
look at the last returned result before browsing the complete socket
list).

This prepares for IPv6 support.

Signed-off-by: Guillaume Subiron <maethor@subiron.org>
Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
slirp/socket.c
slirp/socket.h
slirp/tcp_input.c
slirp/udp.c

index d1034fb5366af3d0493593d011be45782d50687b..8f73e906e28f0750f19faceb6d715a20b2c92667 100644 (file)
@@ -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;
 }
 
 /*
index b27bbb2c59314d838aada4ae53884bb2303f4edd..1c8c24c16b78a62376e18db4436ed5cabec31afa 100644 (file)
@@ -87,8 +87,9 @@ 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 * socreate(Slirp *);
+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 *);
 void sorecvoob(struct socket *);
index 4c3191d4fd5b40c34c20d09298645559b5d18d2c..549206150c052a5951747ee91cb55bd48a27afbb 100644 (file)
@@ -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
index 8203eb1bb28f84e433451dc3f0fa2f1c422a3a4e..126ef82a8e100e676c34c4bc511bdb96e1008611 100644 (file)
@@ -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) {
          /*