os

An operating system
git clone https://erai.gay/code/os/
Log | Files | Refs | README | LICENSE

commit 04eb516326c4ea9ca489a392a76c90213d63314d
parent 9a1ec7062f7814651636989286d88e85d3ea641a
Author: erai <erai@omiltem.net>
Date:   Wed,  8 May 2024 14:47:15 -0400

tcp reader tasks

Diffstat:
Mkernel.c | 68++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------
1 file changed, 58 insertions(+), 10 deletions(-)

diff --git a/kernel.c b/kernel.c @@ -827,6 +827,8 @@ struct tcp_state { send_buf: *byte; fin_seq: int; + + task: *task; } struct task { @@ -835,7 +837,8 @@ struct task { name: *byte; stack: *byte; dead: int; - f: (func()); + f: (func(t: *task)); + a: *void; regs: regs; } @@ -2186,10 +2189,6 @@ tcp_echo(tcb: *tcp_state) { var buf: *byte; var len: int; - if tcb.state == TCP_LISTEN { - return; - } - if tcb.state == TCP_CLOSED { tcp_free(tcb); return; @@ -2209,6 +2208,49 @@ tcp_echo(tcb: *tcp_state) { free(buf); } +task_ssh(t: *task) { + var tcb: *tcp_state; + var buf: *byte; + var c: byte; + var n: int; + tcb = t.a:*tcp_state; + kputs("accept\n"); + buf = alloc(); + loop { + yield(); + if tcb.state == TCP_CLOSED { + kputs("closed\n"); + tcp_free(tcb); + break; + } else if tcb.state == TCP_CLOSE_WAIT { + if tcb.send_fin { + continue; + } + kputs("close_wait\n"); + tcp_close(tcb); + continue; + } else if tcb.state < TCP_ESTAB { + continue; + } + + // echo + loop { + n = tcp_recv(tcb, buf, 4096); + if n == 0 { + break; + } + tcp_send(tcb, buf, n); + } + } + free(buf); +} + +tcp_ssh(tcb: *tcp_state) { + if !tcb.task { + tcb.task = spawn(task_ssh, "sshd", tcb:*void); + } +} + send_rst(pkt: *rxinfo) { var tx: *txinfo; tx = alloc_tx(); @@ -2668,7 +2710,9 @@ handle_tcp(pkt: *rxinfo) { send_rst(pkt); } else { handle_seg(tcb, pkt); - tcb.event_func(tcb); + if tcb.state != TCP_LISTEN { + tcb.event_func(tcb); + } } } @@ -3115,7 +3159,9 @@ tick(r: *regs) { tcb = global.tcp[i]; if tcb { tcp_tick(tcb); - tcb.event_func(tcb); + if tcb.state != TCP_LISTEN { + tcb.event_func(tcb); + } } i = i + 1; @@ -3407,11 +3453,11 @@ _tstart() { global = g(); t = global.curtask; sti(); - t.f(); + t.f(t); task_exit(); } -spawn(f: (func()), name: *byte) { +spawn(f: (func(t: *task)), name: *byte, a: *void): *task { var global: *global; var t: *task; var cur: *task; @@ -3427,6 +3473,7 @@ spawn(f: (func()), name: *byte) { t.regs.cs = 8; t.regs.ss = 16; t.f = f; + t.a = a; flags = rdflags(); cli(); cur = global.curtask; @@ -3436,6 +3483,7 @@ spawn(f: (func()), name: *byte) { cur.next = t; next.prev = t; wrflags(flags); + return t; } _kstart(mb: int) { @@ -3650,7 +3698,7 @@ _kstart(mb: int) { scan_pci(pci, init_realtek); scan_pci(pci, init_ahci); - tcp_listen(22, tcp_echo); + tcp_listen(22, tcp_ssh); // Wait for interrupts kputs("zzz\n");