slirp: Prepare for persistent socket state flags
This prepares for adding flags to socket.so_state that must not be removed during the lifetime of a socket. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
3c6a05803c
commit
f932b6ce71
@ -495,7 +495,8 @@ void slirp_select_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds)
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* else failed */
|
/* else failed */
|
||||||
so->so_state = SS_NOFDREF;
|
so->so_state &= SS_PERSISTENT_MASK;
|
||||||
|
so->so_state |= SS_NOFDREF;
|
||||||
}
|
}
|
||||||
/* else so->so_state &= ~SS_ISFCONNECTING; */
|
/* else so->so_state &= ~SS_ISFCONNECTING; */
|
||||||
|
|
||||||
@ -529,7 +530,8 @@ void slirp_select_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds)
|
|||||||
continue; /* Still connecting, continue */
|
continue; /* Still connecting, continue */
|
||||||
|
|
||||||
/* else failed */
|
/* else failed */
|
||||||
so->so_state = SS_NOFDREF;
|
so->so_state &= SS_PERSISTENT_MASK;
|
||||||
|
so->so_state |= SS_NOFDREF;
|
||||||
|
|
||||||
/* tcp_input will take care of it */
|
/* tcp_input will take care of it */
|
||||||
} else {
|
} else {
|
||||||
@ -540,7 +542,8 @@ void slirp_select_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds)
|
|||||||
errno == EINPROGRESS || errno == ENOTCONN)
|
errno == EINPROGRESS || errno == ENOTCONN)
|
||||||
continue;
|
continue;
|
||||||
/* else failed */
|
/* else failed */
|
||||||
so->so_state = SS_NOFDREF;
|
so->so_state &= SS_PERSISTENT_MASK;
|
||||||
|
so->so_state |= SS_NOFDREF;
|
||||||
} else
|
} else
|
||||||
so->so_state &= ~SS_ISFCONNECTING;
|
so->so_state &= ~SS_ISFCONNECTING;
|
||||||
|
|
||||||
|
@ -581,7 +581,8 @@ sosendto(struct socket *so, struct mbuf *m)
|
|||||||
*/
|
*/
|
||||||
if (so->so_expire)
|
if (so->so_expire)
|
||||||
so->so_expire = curtime + SO_EXPIRE;
|
so->so_expire = curtime + SO_EXPIRE;
|
||||||
so->so_state = SS_ISFCONNECTED; /* So that it gets select()ed */
|
so->so_state &= SS_PERSISTENT_MASK;
|
||||||
|
so->so_state |= SS_ISFCONNECTED; /* So that it gets select()ed */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -620,7 +621,8 @@ tcp_listen(u_int32_t haddr, u_int hport, u_int32_t laddr, u_int lport, int flags
|
|||||||
if (flags & SS_FACCEPTONCE)
|
if (flags & SS_FACCEPTONCE)
|
||||||
so->so_tcpcb->t_timer[TCPT_KEEP] = TCPTV_KEEP_INIT*2;
|
so->so_tcpcb->t_timer[TCPT_KEEP] = TCPTV_KEEP_INIT*2;
|
||||||
|
|
||||||
so->so_state = (SS_FACCEPTCONN|flags);
|
so->so_state &= SS_PERSISTENT_MASK;
|
||||||
|
so->so_state |= (SS_FACCEPTCONN | flags);
|
||||||
so->so_lport = lport; /* Kept in network format */
|
so->so_lport = lport; /* Kept in network format */
|
||||||
so->so_laddr.s_addr = laddr; /* Ditto */
|
so->so_laddr.s_addr = laddr; /* Ditto */
|
||||||
|
|
||||||
@ -715,10 +717,12 @@ sofcantrcvmore(struct socket *so)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
so->so_state &= ~(SS_ISFCONNECTING);
|
so->so_state &= ~(SS_ISFCONNECTING);
|
||||||
if (so->so_state & SS_FCANTSENDMORE)
|
if (so->so_state & SS_FCANTSENDMORE) {
|
||||||
so->so_state = SS_NOFDREF; /* Don't select it */ /* XXX close() here as well? */
|
so->so_state &= SS_PERSISTENT_MASK;
|
||||||
else
|
so->so_state |= SS_NOFDREF; /* Don't select it */
|
||||||
|
} else {
|
||||||
so->so_state |= SS_FCANTRCVMORE;
|
so->so_state |= SS_FCANTRCVMORE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -734,10 +738,12 @@ sofcantsendmore(struct socket *so)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
so->so_state &= ~(SS_ISFCONNECTING);
|
so->so_state &= ~(SS_ISFCONNECTING);
|
||||||
if (so->so_state & SS_FCANTRCVMORE)
|
if (so->so_state & SS_FCANTRCVMORE) {
|
||||||
so->so_state = SS_NOFDREF; /* as above */
|
so->so_state &= SS_PERSISTENT_MASK;
|
||||||
else
|
so->so_state |= SS_NOFDREF; /* as above */
|
||||||
|
} else {
|
||||||
so->so_state |= SS_FCANTSENDMORE;
|
so->so_state |= SS_FCANTSENDMORE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -71,6 +71,8 @@ struct socket {
|
|||||||
#define SS_FACCEPTCONN 0x100 /* Socket is accepting connections from a host on the internet */
|
#define SS_FACCEPTCONN 0x100 /* Socket is accepting connections from a host on the internet */
|
||||||
#define SS_FACCEPTONCE 0x200 /* If set, the SS_FACCEPTCONN socket will die after one accept */
|
#define SS_FACCEPTONCE 0x200 /* If set, the SS_FACCEPTCONN socket will die after one accept */
|
||||||
|
|
||||||
|
#define SS_PERSISTENT_MASK 0xf000 /* Unremovable state bits */
|
||||||
|
|
||||||
extern struct socket tcb;
|
extern struct socket tcb;
|
||||||
|
|
||||||
struct socket * solookup _P((struct socket *, struct in_addr, u_int, struct in_addr, u_int));
|
struct socket * solookup _P((struct socket *, struct in_addr, u_int, struct in_addr, u_int));
|
||||||
|
@ -1038,7 +1038,8 @@ trimthenstep6:
|
|||||||
soisfconnected(so);
|
soisfconnected(so);
|
||||||
so->so_state &= ~SS_CTL; /* success XXX */
|
so->so_state &= ~SS_CTL; /* success XXX */
|
||||||
} else if (ret == 2) {
|
} else if (ret == 2) {
|
||||||
so->so_state = SS_NOFDREF; /* CTL_CMD */
|
so->so_state &= SS_PERSISTENT_MASK;
|
||||||
|
so->so_state |= SS_NOFDREF; /* CTL_CMD */
|
||||||
} else {
|
} else {
|
||||||
needoutput = 1;
|
needoutput = 1;
|
||||||
tp->t_state = TCPS_FIN_WAIT_1;
|
tp->t_state = TCPS_FIN_WAIT_1;
|
||||||
|
@ -666,7 +666,8 @@ udp_listen(u_int32_t haddr, u_int hport, u_int32_t laddr, u_int lport,
|
|||||||
if (flags != SS_FACCEPTONCE)
|
if (flags != SS_FACCEPTONCE)
|
||||||
so->so_expire = 0;
|
so->so_expire = 0;
|
||||||
|
|
||||||
so->so_state = SS_ISFCONNECTED;
|
so->so_state &= SS_PERSISTENT_MASK;
|
||||||
|
so->so_state |= SS_ISFCONNECTED;
|
||||||
|
|
||||||
return so;
|
return so;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user