mirror of
https://github.com/soypat/lneto.git
synced 2026-08-16 21:03:25 +00:00
handle clientsynseg
This commit is contained in:
@@ -41,7 +41,7 @@ func main() {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
err = pStack.handler.Open(tcp.StateListen, gen.DstTCP, gen.SrcTCP, iss)
|
err = pStack.handler.Open(gen.DstTCP, iss)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -138,7 +138,7 @@ type recvSpace struct {
|
|||||||
WND Size // receive window defined by local. Permitted number of remote unacked octets in flight.
|
WND Size // receive window defined by local. Permitted number of remote unacked octets in flight.
|
||||||
}
|
}
|
||||||
|
|
||||||
// Open implements a passive opening of a connection (wait for incoming packets).
|
// Open implements a passive opening of a connection (wait for incoming packets from an unknown remote port).
|
||||||
// Upon success [ControlBlock] enters LISTEN state, such as that of a server.
|
// Upon success [ControlBlock] enters LISTEN state, such as that of a server.
|
||||||
// To open an active connection use [ControlBlock.Send] with a segment generated with [ClientSynSegment].
|
// To open an active connection use [ControlBlock.Send] with a segment generated with [ClientSynSegment].
|
||||||
func (tcb *ControlBlock) Open(iss Value, wnd Size) (err error) {
|
func (tcb *ControlBlock) Open(iss Value, wnd Size) (err error) {
|
||||||
|
|||||||
+11
-12
@@ -51,7 +51,8 @@ func (h *Handler) LocalPort() uint16 {
|
|||||||
return h.localPort
|
return h.localPort
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *Handler) Open(state State, localPort, remotePort uint16, iss Value) error {
|
// Open prepares a passive connection. Set remote port to non-zero to
|
||||||
|
func (h *Handler) Open(localPort uint16, iss Value) error {
|
||||||
// Open will fail unless SCB in closed state.
|
// Open will fail unless SCB in closed state.
|
||||||
err := h.scb.Open(iss, Size(h.bufRx.Size()))
|
err := h.scb.Open(iss, Size(h.bufRx.Size()))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -63,7 +64,7 @@ func (h *Handler) Open(state State, localPort, remotePort uint16, iss Value) err
|
|||||||
bufRx: h.bufRx,
|
bufRx: h.bufRx,
|
||||||
connid: h.connid + 1,
|
connid: h.connid + 1,
|
||||||
localPort: localPort,
|
localPort: localPort,
|
||||||
remotePort: remotePort,
|
remotePort: 0,
|
||||||
validator: h.validator,
|
validator: h.validator,
|
||||||
logger: h.logger,
|
logger: h.logger,
|
||||||
closing: false,
|
closing: false,
|
||||||
@@ -139,15 +140,9 @@ func (h *Handler) Send(b []byte) (int, error) {
|
|||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
var segment Segment
|
var segment Segment
|
||||||
if h.AwaitingSyn() {
|
if h.AwaitingSynSend() {
|
||||||
// Handling init syn segment.
|
// Handling init syn segment.
|
||||||
segment = Segment{
|
segment = ClientSynSegment(h.scb.ISS(), h.scb.RecvWindow())
|
||||||
SEQ: h.scb.ISS(),
|
|
||||||
ACK: 0,
|
|
||||||
Flags: FlagSYN,
|
|
||||||
WND: h.scb.RecvWindow(),
|
|
||||||
DATALEN: 0,
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
var ok bool
|
var ok bool
|
||||||
available := min(h.bufTx.Buffered(), len(b)-sizeHeaderTCP)
|
available := min(h.bufTx.Buffered(), len(b)-sizeHeaderTCP)
|
||||||
@@ -181,11 +176,15 @@ func (h *Handler) Send(b []byte) (int, error) {
|
|||||||
return sizeHeaderTCP + int(segment.DATALEN), nil
|
return sizeHeaderTCP + int(segment.DATALEN), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// AwaitingSyn checks if the Handler is waiting for a Syn to arrive.
|
// AwaitingSynResponse checks if the Handler is waiting for a Syn to arrive.
|
||||||
func (h *Handler) AwaitingSyn() bool {
|
func (h *Handler) AwaitingSynResponse() bool {
|
||||||
return h.remotePort != 0 && h.scb.State() == StateSynSent
|
return h.remotePort != 0 && h.scb.State() == StateSynSent
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h *Handler) AwaitingSynSend() bool {
|
||||||
|
return h.remotePort != 0 && h.scb.State() == StateClosed
|
||||||
|
}
|
||||||
|
|
||||||
func (h *Handler) isClosed() bool {
|
func (h *Handler) isClosed() bool {
|
||||||
return h.closing || h.scb.State().IsClosed()
|
return h.closing || h.scb.State().IsClosed()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user