tftp.c: use symbolic constants for protocol opcodes
This commit is contained in:
parent
65b807b63f
commit
36613c7955
|
@ -6,10 +6,18 @@
|
||||||
#define PORT_OUT 69
|
#define PORT_OUT 69
|
||||||
#define PORT_IN 7642
|
#define PORT_IN 7642
|
||||||
|
|
||||||
|
enum {
|
||||||
|
TFTP_RRQ = 1, /* Read request */
|
||||||
|
TFTP_WRQ = 2, /* Write request */
|
||||||
|
TFTP_DATA = 3, /* Data */
|
||||||
|
TFTP_ACK = 4, /* Acknowledgment */
|
||||||
|
TFTP_ERROR = 5, /* Error */
|
||||||
|
};
|
||||||
|
|
||||||
static int format_request(char *buf, const char *filename)
|
static int format_request(char *buf, const char *filename)
|
||||||
{
|
{
|
||||||
*buf++ = 0x00; /* Opcode: Request */
|
*buf++ = 0x00; /* Opcode: Request */
|
||||||
*buf++ = 0x01;
|
*buf++ = TFTP_RRQ;
|
||||||
strcpy(buf, filename);
|
strcpy(buf, filename);
|
||||||
buf += strlen(filename);
|
buf += strlen(filename);
|
||||||
*buf++ = 0x00;
|
*buf++ = 0x00;
|
||||||
|
@ -25,7 +33,7 @@ static int format_request(char *buf, const char *filename)
|
||||||
static int format_ack(char *buf, unsigned short block)
|
static int format_ack(char *buf, unsigned short block)
|
||||||
{
|
{
|
||||||
*buf++ = 0x00; /* Opcode: Ack */
|
*buf++ = 0x00; /* Opcode: Ack */
|
||||||
*buf++ = 0x04;
|
*buf++ = TFTP_ACK;
|
||||||
*buf++ = (block & 0xff00) >> 8;
|
*buf++ = (block & 0xff00) >> 8;
|
||||||
*buf++ = (block & 0x00ff);
|
*buf++ = (block & 0x00ff);
|
||||||
return 4;
|
return 4;
|
||||||
|
@ -36,7 +44,8 @@ static int total_length;
|
||||||
static int transfer_finished;
|
static int transfer_finished;
|
||||||
static char *dst_buffer;
|
static char *dst_buffer;
|
||||||
|
|
||||||
static void rx_callback(unsigned int src_ip, unsigned short src_port, unsigned short dst_port, void *_data, unsigned int length)
|
static void rx_callback(unsigned int src_ip, unsigned short src_port,
|
||||||
|
unsigned short dst_port, void *_data, unsigned int length)
|
||||||
{
|
{
|
||||||
unsigned char *data = (unsigned char *)_data;
|
unsigned char *data = (unsigned char *)_data;
|
||||||
unsigned short opcode;
|
unsigned short opcode;
|
||||||
|
@ -49,7 +58,7 @@ static void rx_callback(unsigned int src_ip, unsigned short src_port, unsigned s
|
||||||
opcode = ((unsigned short)(data[0]) << 8)|((unsigned short)(data[1]));
|
opcode = ((unsigned short)(data[0]) << 8)|((unsigned short)(data[1]));
|
||||||
block = ((unsigned short)(data[2]) << 8)|((unsigned short)(data[3]));
|
block = ((unsigned short)(data[2]) << 8)|((unsigned short)(data[3]));
|
||||||
if(block < 1) return;
|
if(block < 1) return;
|
||||||
if(opcode == 3) { /* Data */
|
if(opcode == TFTP_DATA) { /* Data */
|
||||||
length -= 4;
|
length -= 4;
|
||||||
offset = (block-1)*512;
|
offset = (block-1)*512;
|
||||||
for(i=0;i<length;i++)
|
for(i=0;i<length;i++)
|
||||||
|
@ -61,7 +70,7 @@ static void rx_callback(unsigned int src_ip, unsigned short src_port, unsigned s
|
||||||
length = format_ack(packet_data, block);
|
length = format_ack(packet_data, block);
|
||||||
microudp_send(PORT_IN, src_port, length);
|
microudp_send(PORT_IN, src_port, length);
|
||||||
}
|
}
|
||||||
if(opcode == 5) { /* Error */
|
if(opcode == TFTP_ERROR) { /* Error */
|
||||||
total_length = -1;
|
total_length = -1;
|
||||||
transfer_finished = 1;
|
transfer_finished = 1;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue