zeek/auxil/spicy/doc/tutorial/examples/_tftp-unified-request.spicy
Patrick Kelley 8fd444092b initial
2025-05-07 15:35:15 -04:00

46 lines
1.1 KiB
Plaintext

# Automatically generated; edit in Sphinx source code, not here.
# %hide-begin%
module TFTP;
type Opcode = enum { RRQ = 1, WRQ = 2, DATA = 3, ACK = 4, ERROR = 5 };
# %hide-end%
public type Packet = unit {
opcode: uint16 &convert=Opcode($$);
switch ( self.opcode ) {
Opcode::RRQ -> rrq: Request(True);
Opcode::WRQ -> wrq: Request(False);
# ...
# %hide-begin%
Opcode::DATA -> data: Data;
Opcode::ACK -> ack: Acknowledgement;
Opcode::ERROR -> error: Error;
# %hide-end%
};
on %done { print self; }
};
type Request = unit(is_read: bool) {
filename: bytes &until=b"\x00";
mode: bytes &until=b"\x00";
on %done { print "We got a %s request." % (is_read ? "read" : "write"); }
};
# %hide-begin%
type Data = unit {
num: uint16;
data: bytes &eod; # parse until end of data (i.e., packet) is reached
};
type Acknowledgement = unit {
num: uint16; # block number being acknowledged
};
type Error = unit {
code: uint16;
msg: bytes &until=b"\x00";
};
# %hide-end%