diff options
| author | user <user@clank> | 2026-07-17 14:11:22 +0200 |
|---|---|---|
| committer | user <user@clank> | 2026-07-17 14:11:22 +0200 |
| commit | a2cb756693229c7880d926d2cdde2f838c697415 (patch) | |
| tree | e327278e7d8b7150d7a2b01cf38b4895caab7356 /c/sh.c | |
| parent | kernel: sys_sleep - a cooperative delay off the DIV timer (+ ping pacing) (diff) | |
| download | gbos-a2cb756693229c7880d926d2cdde2f838c697415.tar.gz gbos-a2cb756693229c7880d926d2cdde2f838c697415.tar.xz gbos-a2cb756693229c7880d926d2cdde2f838c697415.zip | |
net: DHCP client - lease the IP at boot instead of hardcoding it
The address is no longer baked in. net_init starts at 0.0.0.0; a DHCP client
runs as the first thing on boot (init/shell forks it and waits), and only once
it has a lease (or gives up) does the prompt appear.
Kernel:
- IP is configurable: 0.0.0.0 until leased; NET_SETIP op stores it.
- 16-bit frame length. DHCP/BOOTP packets are ~272 bytes, over the old 255-byte
frame cap, so net_slip_send takes a 16-bit length, net_pump assembles into a
320-byte buffer with a 16-bit wNetRxLen, and udp_send writes a 16-bit IP total.
Payloads stay <=255 (kept small on purpose) so the per-protocol datalen math
is unchanged. wNetTx/wNetRxBuf 256->320, SK_RXBUF 208->288.
Userland:
- c/dhcp.c: DISCOVER->OFFER->REQUEST->ACK over a UDP socket, then net_setip();
times out gracefully (shell still boots) if there's no server. sh.c runs it
before the prompt.
Bridge (self-contained DHCP server, no dnsmasq):
- tunbridge.py + netboot intercept UDP->:67 and answer OFFER/ACK leasing
10.0.0.2 (gateway 10.0.0.1); everything else is bridged/NATed as before.
Regression-tested ICMP/UDP/TCP after the 16-bit change. Verified end to end:
dhcp: discovering
dhcp: leased 10.0.0.2
/# ping 10.0.0.1 -> 4/4 (traffic from the leased address)
Diffstat (limited to '')
| -rw-r--r-- | c/sh.c | 6 |
1 files changed, 6 insertions, 0 deletions
@@ -155,6 +155,12 @@ void main(void) { char *tok[16]; char cwd[40]; cwd[0] = '/'; cwd[1] = 0; + /* bring up networking first: run the DHCP client and wait for it to finish + (got a lease, or gave up). Only then drop to the prompt. */ + { + unsigned char d = lookup("dhcp"); + if (d != NOFD) { if (fork() == 0) exec(d); else wait(); } + } for (;;) { unsigned char nt, i, pipepos, c, bg; /* reap finished background jobs */ |
