46 lines
1.1 KiB
Plaintext
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% |