diff options
Diffstat (limited to 'nbtpd/packet.h')
-rw-r--r-- | nbtpd/packet.h | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/nbtpd/packet.h b/nbtpd/packet.h new file mode 100644 index 0000000..86b43a3 --- /dev/null +++ b/nbtpd/packet.h @@ -0,0 +1,61 @@ +#ifndef NBD_TFTP_PACKET_H +#define NBD_TFTP_PACKET_H + +#include <stdint.h> +#include <unistd.h> + +typedef enum { + RRQ = 1, + WRQ = 2, + DAT = 3, + ACK = 4, + ERR = 5, +} nbd_tftp_opcode; + +typedef enum { + ERROR = 0, + ENOTFOUND = 1, + EACCESS = 2, + ENOSPACE = 3, + EOPERATION = 4, + ETRANS = 5, + EEXISTS = 6, + EUSER = 7, +} nbd_tftp_ecode; + +typedef struct { + uint16_t opcode; + char *filename; + char *mode; +} nbd_tftp_packet_rq; + +typedef struct { + uint16_t opcode; + uint16_t block_num; + char *data; + size_t datalen; +} nbd_tftp_packet_data; + +typedef struct { + uint16_t opcode; + uint16_t block_num; +} nbd_tftp_packet_ack; + +typedef struct { + uint16_t opcode; + uint16_t err; + char *emsg; +} nbd_tftp_packet_error; + +char *nbd_tftp_error_to_message(nbd_tftp_ecode error); +char *nbd_tftp_ser_data(nbd_tftp_packet_data d); +char *nbd_tftp_ser_data_from_parts(uint16_t blocknum, char *data, size_t datalen); +nbd_tftp_packet_data nbd_tftp_de_data(char *data, size_t len); +char *nbd_tftp_ser_error(nbd_tftp_packet_error e); +char *nbd_tftp_ser_error_from_code(nbd_tftp_ecode error); +char *nbd_tftp_ser_ack(nbd_tftp_packet_ack ack); +char *nbd_tftp_ser_ack_from_block_num(uint16_t block_num); +nbd_tftp_packet_ack nbd_tftp_de_ack(char *buf, ssize_t buflen); + +#endif + |