]> git.proxmox.com Git - qemu.git/blobdiff - slirp/tcp_input.c
Sparse fixes: NULL use, header order, ANSI prototypes, static
[qemu.git] / slirp / tcp_input.c
index 17a9387f041633ab51ba72859080ea2acbb28885..effedfc966cd0cc32cd8f3ba6c82e52094e6faba 100644 (file)
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the University of
- *     California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
+ * 3. Neither the name of the University nor the names of its contributors
  *    may be used to endorse or promote products derived from this software
  *    without specific prior written permission.
  *
@@ -71,7 +67,7 @@ tcp_seq tcp_iss;                /* tcp initial send seq # */
 #ifdef TCP_ACK_HACK
 #define TCP_REASS(tp, ti, m, so, flags) {\
        if ((ti)->ti_seq == (tp)->rcv_nxt && \
-           (tp)->seg_next == (tcpiphdrp_32)(tp) && \
+           tcpfrag_list_empty(tp) && \
            (tp)->t_state == TCPS_ESTABLISHED) {\
                if (ti->ti_flags & TH_PUSH) \
                        tp->t_flags |= TF_ACKNOW; \
@@ -94,7 +90,7 @@ tcp_seq tcp_iss;                /* tcp initial send seq # */
 #else
 #define        TCP_REASS(tp, ti, m, so, flags) { \
        if ((ti)->ti_seq == (tp)->rcv_nxt && \
-           (tp)->seg_next == (tcpiphdrp_32)(tp) && \
+        tcpfrag_list_empty(tp) && \
            (tp)->t_state == TCPS_ESTABLISHED) { \
                tp->t_flags |= TF_DELACK; \
                (tp)->rcv_nxt += (ti)->ti_len; \
@@ -125,17 +121,17 @@ tcp_reass(register struct tcpcb *tp, register struct tcpiphdr *ti,
        int flags;
 
        /*
-        * Call with ti==0 after become established to
+        * Call with ti==NULL after become established to
         * force pre-ESTABLISHED data up to user socket.
         */
-       if (ti == 0)
+        if (ti == NULL)
                goto present;
 
        /*
         * Find a segment which begins after this one does.
         */
-       for (q = (struct tcpiphdr *)tp->seg_next; q != (struct tcpiphdr *)tp;
-           q = (struct tcpiphdr *)q->ti_next)
+       for (q = tcpfrag_list_first(tp); !tcpfrag_list_end(q, tp);
+            q = tcpiphdr_next(q))
                if (SEQ_GT(q->ti_seq, ti->ti_seq))
                        break;
 
@@ -144,9 +140,9 @@ tcp_reass(register struct tcpcb *tp, register struct tcpiphdr *ti,
         * our data already.  If so, drop the data from the incoming
         * segment.  If it provides all of our data, drop us.
         */
-       if ((struct tcpiphdr *)q->ti_prev != (struct tcpiphdr *)tp) {
+       if (!tcpfrag_list_end(tcpiphdr_prev(q), tp)) {
                register int i;
-               q = (struct tcpiphdr *)q->ti_prev;
+               q = tcpiphdr_prev(q);
                /* conversion to int (in i) handles seq wraparound */
                i = q->ti_seq + q->ti_len - ti->ti_seq;
                if (i > 0) {
@@ -166,36 +162,36 @@ tcp_reass(register struct tcpcb *tp, register struct tcpiphdr *ti,
                        ti->ti_len -= i;
                        ti->ti_seq += i;
                }
-               q = (struct tcpiphdr *)(q->ti_next);
+               q = tcpiphdr_next(q);
        }
        STAT(tcpstat.tcps_rcvoopack++);
        STAT(tcpstat.tcps_rcvoobyte += ti->ti_len);
-       REASS_MBUF(ti) = (mbufp_32) m;          /* XXX */
+       ti->ti_mbuf = m;
 
        /*
         * While we overlap succeeding segments trim them or,
         * if they are completely covered, dequeue them.
         */
-       while (q != (struct tcpiphdr *)tp) {
+       while (!tcpfrag_list_end(q, tp)) {
                register int i = (ti->ti_seq + ti->ti_len) - q->ti_seq;
                if (i <= 0)
                        break;
                if (i < q->ti_len) {
                        q->ti_seq += i;
                        q->ti_len -= i;
-                       m_adj((struct mbuf *) REASS_MBUF(q), i);
+                       m_adj(q->ti_mbuf, i);
                        break;
                }
-               q = (struct tcpiphdr *)q->ti_next;
-               m = (struct mbuf *) REASS_MBUF((struct tcpiphdr *)q->ti_prev);
-               remque_32((void *)(q->ti_prev));
+               q = tcpiphdr_next(q);
+               m = tcpiphdr_prev(q)->ti_mbuf;
+               remque(tcpiphdr2qlink(tcpiphdr_prev(q)));
                m_freem(m);
        }
 
        /*
         * Stick new segment in its place.
         */
-       insque_32(ti, (void *)(q->ti_prev));
+       insque(tcpiphdr2qlink(ti), tcpiphdr2qlink(tcpiphdr_prev(q)));
 
 present:
        /*
@@ -204,17 +200,17 @@ present:
         */
        if (!TCPS_HAVEESTABLISHED(tp->t_state))
                return (0);
-       ti = (struct tcpiphdr *) tp->seg_next;
-       if (ti == (struct tcpiphdr *)tp || ti->ti_seq != tp->rcv_nxt)
+       ti = tcpfrag_list_first(tp);
+       if (tcpfrag_list_end(ti, tp) || ti->ti_seq != tp->rcv_nxt)
                return (0);
        if (tp->t_state == TCPS_SYN_RECEIVED && ti->ti_len)
                return (0);
        do {
                tp->rcv_nxt += ti->ti_len;
                flags = ti->ti_flags & TH_FIN;
-               remque_32(ti);
-               m = (struct mbuf *) REASS_MBUF(ti); /* XXX */
-               ti = (struct tcpiphdr *)ti->ti_next;
+               remque(tcpiphdr2qlink(ti));
+               m = ti->ti_mbuf;
+               ti = tcpiphdr_next(ti);
 /*             if (so->so_state & SS_FCANTRCVMORE) */
                if (so->so_state & SS_FCANTSENDMORE)
                        m_freem(m);
@@ -234,25 +230,23 @@ present:
  * protocol specification dated September, 1981 very closely.
  */
 void
-tcp_input(m, iphlen, inso)
-       register struct mbuf *m;
-       int iphlen;
-       struct socket *inso;
+tcp_input(struct mbuf *m, int iphlen, struct socket *inso)
 {
        struct ip save_ip, *ip;
        register struct tcpiphdr *ti;
        caddr_t optp = NULL;
        int optlen = 0;
        int len, tlen, off;
-       register struct tcpcb *tp = 0;
+        register struct tcpcb *tp = NULL;
        register int tiflags;
-       struct socket *so = 0;
+        struct socket *so = NULL;
        int todrop, acked, ourfinisacked, needoutput = 0;
 /*     int dropsocket = 0; */
        int iss = 0;
        u_long tiwin;
        int ret;
 /*     int ts_present = 0; */
+    struct ex_list *ex_ptr;
 
        DEBUG_CALL("tcp_input");
        DEBUG_ARGS((dfd," m = %8lx  iphlen = %2d  inso = %lx\n",
@@ -267,7 +261,7 @@ tcp_input(m, iphlen, inso)
                /* Re-set a few variables */
                tp = sototcpcb(so);
                m = so->so_m;
-               so->so_m = 0;
+                so->so_m = NULL;
                ti = so->so_ti;
                tiwin = ti->ti_win;
                tiflags = ti->ti_flags;
@@ -301,7 +295,8 @@ tcp_input(m, iphlen, inso)
         * Checksum extended TCP header and data.
         */
        tlen = ((struct ip *)ti)->ip_len;
-       ti->ti_next = ti->ti_prev = 0;
+        tcpiphdr2qlink(ti)->next = tcpiphdr2qlink(ti)->prev = NULL;
+        memset(&ti->ti_i.ih_mbuf, 0 , sizeof(struct mbuf_ptr));
        ti->ti_x1 = 0;
        ti->ti_len = htons((u_int16_t)tlen);
        len = sizeof(struct ip ) + tlen;
@@ -363,6 +358,15 @@ tcp_input(m, iphlen, inso)
        m->m_data += sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr);
        m->m_len  -= sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr);
 
+    if (slirp_restrict) {
+        for (ex_ptr = exec_list; ex_ptr; ex_ptr = ex_ptr->ex_next)
+            if (ex_ptr->ex_fport == ti->ti_dport &&
+                    (ntohl(ti->ti_dst.s_addr) & 0xff) == ex_ptr->ex_addr)
+                break;
+
+        if (!ex_ptr)
+            goto drop;
+    }
        /*
         * Locate pcb for segment.
         */
@@ -392,7 +396,7 @@ findso:
         * the only flag set, then create a session, mark it
         * as if it was LISTENING, and continue...
         */
-       if (so == 0) {
+        if (so == NULL) {
          if ((tiflags & (TH_SYN|TH_FIN|TH_RST|TH_URG|TH_ACK)) != TH_SYN)
            goto dropwithreset;
 
@@ -432,7 +436,7 @@ findso:
        tp = sototcpcb(so);
 
        /* XXX Should never fail */
-       if (tp == 0)
+        if (tp == NULL)
                goto dropwithreset;
        if (tp->t_state == TCPS_CLOSED)
                goto drop;
@@ -550,7 +554,7 @@ findso:
                                return;
                        }
                } else if (ti->ti_ack == tp->snd_una &&
-                   tp->seg_next == (tcpiphdrp_32)tp &&
+                   tcpfrag_list_empty(tp) &&
                    ti->ti_len <= sbspace(&so->so_rcv)) {
                        /*
                         * this is a pure, in-sequence data packet
@@ -646,7 +650,6 @@ findso:
 #endif
               {
                /* May be an add exec */
-               struct ex_list *ex_ptr;
                for(ex_ptr = exec_list; ex_ptr; ex_ptr = ex_ptr->ex_next) {
                  if(ex_ptr->ex_fport == so->so_fport &&
                     lastbyte == ex_ptr->ex_addr) {
@@ -1691,9 +1694,7 @@ tcp_xmit_timer(register struct tcpcb *tp, int rtt)
  */
 
 int
-tcp_mss(tp, offer)
-        register struct tcpcb *tp;
-        u_int offer;
+tcp_mss(struct tcpcb *tp, u_int offer)
 {
        struct socket *so = tp->t_socket;
        int mss;