Commit f932b6ce717e65687c3095e3e41a6c18972f996c
Committed by
Anthony Liguori
1 parent
3c6a0580
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>
Showing
5 changed files
with
26 additions
and
13 deletions
slirp/slirp.c
@@ -495,7 +495,8 @@ void slirp_select_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds) | @@ -495,7 +495,8 @@ void slirp_select_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds) | ||
495 | continue; | 495 | continue; |
496 | 496 | ||
497 | /* else failed */ | 497 | /* else failed */ |
498 | - so->so_state = SS_NOFDREF; | 498 | + so->so_state &= SS_PERSISTENT_MASK; |
499 | + so->so_state |= SS_NOFDREF; | ||
499 | } | 500 | } |
500 | /* else so->so_state &= ~SS_ISFCONNECTING; */ | 501 | /* else so->so_state &= ~SS_ISFCONNECTING; */ |
501 | 502 | ||
@@ -529,7 +530,8 @@ void slirp_select_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds) | @@ -529,7 +530,8 @@ void slirp_select_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds) | ||
529 | continue; /* Still connecting, continue */ | 530 | continue; /* Still connecting, continue */ |
530 | 531 | ||
531 | /* else failed */ | 532 | /* else failed */ |
532 | - so->so_state = SS_NOFDREF; | 533 | + so->so_state &= SS_PERSISTENT_MASK; |
534 | + so->so_state |= SS_NOFDREF; | ||
533 | 535 | ||
534 | /* tcp_input will take care of it */ | 536 | /* tcp_input will take care of it */ |
535 | } else { | 537 | } else { |
@@ -540,7 +542,8 @@ void slirp_select_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds) | @@ -540,7 +542,8 @@ void slirp_select_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds) | ||
540 | errno == EINPROGRESS || errno == ENOTCONN) | 542 | errno == EINPROGRESS || errno == ENOTCONN) |
541 | continue; | 543 | continue; |
542 | /* else failed */ | 544 | /* else failed */ |
543 | - so->so_state = SS_NOFDREF; | 545 | + so->so_state &= SS_PERSISTENT_MASK; |
546 | + so->so_state |= SS_NOFDREF; | ||
544 | } else | 547 | } else |
545 | so->so_state &= ~SS_ISFCONNECTING; | 548 | so->so_state &= ~SS_ISFCONNECTING; |
546 | 549 |
slirp/socket.c
@@ -581,7 +581,8 @@ sosendto(struct socket *so, struct mbuf *m) | @@ -581,7 +581,8 @@ sosendto(struct socket *so, struct mbuf *m) | ||
581 | */ | 581 | */ |
582 | if (so->so_expire) | 582 | if (so->so_expire) |
583 | so->so_expire = curtime + SO_EXPIRE; | 583 | so->so_expire = curtime + SO_EXPIRE; |
584 | - so->so_state = SS_ISFCONNECTED; /* So that it gets select()ed */ | 584 | + so->so_state &= SS_PERSISTENT_MASK; |
585 | + so->so_state |= SS_ISFCONNECTED; /* So that it gets select()ed */ | ||
585 | return 0; | 586 | return 0; |
586 | } | 587 | } |
587 | 588 | ||
@@ -620,7 +621,8 @@ tcp_listen(u_int32_t haddr, u_int hport, u_int32_t laddr, u_int lport, int flags | @@ -620,7 +621,8 @@ tcp_listen(u_int32_t haddr, u_int hport, u_int32_t laddr, u_int lport, int flags | ||
620 | if (flags & SS_FACCEPTONCE) | 621 | if (flags & SS_FACCEPTONCE) |
621 | so->so_tcpcb->t_timer[TCPT_KEEP] = TCPTV_KEEP_INIT*2; | 622 | so->so_tcpcb->t_timer[TCPT_KEEP] = TCPTV_KEEP_INIT*2; |
622 | 623 | ||
623 | - so->so_state = (SS_FACCEPTCONN|flags); | 624 | + so->so_state &= SS_PERSISTENT_MASK; |
625 | + so->so_state |= (SS_FACCEPTCONN | flags); | ||
624 | so->so_lport = lport; /* Kept in network format */ | 626 | so->so_lport = lport; /* Kept in network format */ |
625 | so->so_laddr.s_addr = laddr; /* Ditto */ | 627 | so->so_laddr.s_addr = laddr; /* Ditto */ |
626 | 628 | ||
@@ -715,10 +717,12 @@ sofcantrcvmore(struct socket *so) | @@ -715,10 +717,12 @@ sofcantrcvmore(struct socket *so) | ||
715 | } | 717 | } |
716 | } | 718 | } |
717 | so->so_state &= ~(SS_ISFCONNECTING); | 719 | so->so_state &= ~(SS_ISFCONNECTING); |
718 | - if (so->so_state & SS_FCANTSENDMORE) | ||
719 | - so->so_state = SS_NOFDREF; /* Don't select it */ /* XXX close() here as well? */ | ||
720 | - else | 720 | + if (so->so_state & SS_FCANTSENDMORE) { |
721 | + so->so_state &= SS_PERSISTENT_MASK; | ||
722 | + so->so_state |= SS_NOFDREF; /* Don't select it */ | ||
723 | + } else { | ||
721 | so->so_state |= SS_FCANTRCVMORE; | 724 | so->so_state |= SS_FCANTRCVMORE; |
725 | + } | ||
722 | } | 726 | } |
723 | 727 | ||
724 | static void | 728 | static void |
@@ -734,10 +738,12 @@ sofcantsendmore(struct socket *so) | @@ -734,10 +738,12 @@ sofcantsendmore(struct socket *so) | ||
734 | } | 738 | } |
735 | } | 739 | } |
736 | so->so_state &= ~(SS_ISFCONNECTING); | 740 | so->so_state &= ~(SS_ISFCONNECTING); |
737 | - if (so->so_state & SS_FCANTRCVMORE) | ||
738 | - so->so_state = SS_NOFDREF; /* as above */ | ||
739 | - else | 741 | + if (so->so_state & SS_FCANTRCVMORE) { |
742 | + so->so_state &= SS_PERSISTENT_MASK; | ||
743 | + so->so_state |= SS_NOFDREF; /* as above */ | ||
744 | + } else { | ||
740 | so->so_state |= SS_FCANTSENDMORE; | 745 | so->so_state |= SS_FCANTSENDMORE; |
746 | + } | ||
741 | } | 747 | } |
742 | 748 | ||
743 | void | 749 | void |
slirp/socket.h
@@ -71,6 +71,8 @@ struct socket { | @@ -71,6 +71,8 @@ struct socket { | ||
71 | #define SS_FACCEPTCONN 0x100 /* Socket is accepting connections from a host on the internet */ | 71 | #define SS_FACCEPTCONN 0x100 /* Socket is accepting connections from a host on the internet */ |
72 | #define SS_FACCEPTONCE 0x200 /* If set, the SS_FACCEPTCONN socket will die after one accept */ | 72 | #define SS_FACCEPTONCE 0x200 /* If set, the SS_FACCEPTCONN socket will die after one accept */ |
73 | 73 | ||
74 | +#define SS_PERSISTENT_MASK 0xf000 /* Unremovable state bits */ | ||
75 | + | ||
74 | extern struct socket tcb; | 76 | extern struct socket tcb; |
75 | 77 | ||
76 | struct socket * solookup _P((struct socket *, struct in_addr, u_int, struct in_addr, u_int)); | 78 | struct socket * solookup _P((struct socket *, struct in_addr, u_int, struct in_addr, u_int)); |
slirp/tcp_input.c
@@ -1038,7 +1038,8 @@ trimthenstep6: | @@ -1038,7 +1038,8 @@ trimthenstep6: | ||
1038 | soisfconnected(so); | 1038 | soisfconnected(so); |
1039 | so->so_state &= ~SS_CTL; /* success XXX */ | 1039 | so->so_state &= ~SS_CTL; /* success XXX */ |
1040 | } else if (ret == 2) { | 1040 | } else if (ret == 2) { |
1041 | - so->so_state = SS_NOFDREF; /* CTL_CMD */ | 1041 | + so->so_state &= SS_PERSISTENT_MASK; |
1042 | + so->so_state |= SS_NOFDREF; /* CTL_CMD */ | ||
1042 | } else { | 1043 | } else { |
1043 | needoutput = 1; | 1044 | needoutput = 1; |
1044 | tp->t_state = TCPS_FIN_WAIT_1; | 1045 | tp->t_state = TCPS_FIN_WAIT_1; |
slirp/udp.c
@@ -666,7 +666,8 @@ udp_listen(u_int32_t haddr, u_int hport, u_int32_t laddr, u_int lport, | @@ -666,7 +666,8 @@ udp_listen(u_int32_t haddr, u_int hport, u_int32_t laddr, u_int lport, | ||
666 | if (flags != SS_FACCEPTONCE) | 666 | if (flags != SS_FACCEPTONCE) |
667 | so->so_expire = 0; | 667 | so->so_expire = 0; |
668 | 668 | ||
669 | - so->so_state = SS_ISFCONNECTED; | 669 | + so->so_state &= SS_PERSISTENT_MASK; |
670 | + so->so_state |= SS_ISFCONNECTED; | ||
670 | 671 | ||
671 | return so; | 672 | return so; |
672 | } | 673 | } |