Michael Spencer / Mbed 2 deprecated LaOS

Dependencies:   mbed

Committer:
Michael J. Spencer
Date:
Wed Mar 05 06:14:02 2014 -0800
Revision:
1:f5ac63519541
Initial commit.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Michael J. Spencer 1:f5ac63519541 1 /**
Michael J. Spencer 1:f5ac63519541 2 * TFTPServer.h
Michael J. Spencer 1:f5ac63519541 3 * Simple TFTP server
Michael J. Spencer 1:f5ac63519541 4 *
Michael J. Spencer 1:f5ac63519541 5 * Copyright (c) 2011 Jaap Vermaas
Michael J. Spencer 1:f5ac63519541 6 *
Michael J. Spencer 1:f5ac63519541 7 * This file is part of the LaOS project (see: http://wiki.laoslaser.org
Michael J. Spencer 1:f5ac63519541 8 *
Michael J. Spencer 1:f5ac63519541 9 * LaOS is free software: you can redistribute it and/or modify
Michael J. Spencer 1:f5ac63519541 10 * it under the terms of the GNU General Public License as published by
Michael J. Spencer 1:f5ac63519541 11 * the Free Software Foundation, either version 3 of the License, or
Michael J. Spencer 1:f5ac63519541 12 * (at your option) any later version.
Michael J. Spencer 1:f5ac63519541 13 *
Michael J. Spencer 1:f5ac63519541 14 * LaOS is distributed in the hope that it will be useful,
Michael J. Spencer 1:f5ac63519541 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Michael J. Spencer 1:f5ac63519541 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Michael J. Spencer 1:f5ac63519541 17 * GNU General Public License for more details.
Michael J. Spencer 1:f5ac63519541 18 *
Michael J. Spencer 1:f5ac63519541 19 * You should have received a copy of the GNU General Public License
Michael J. Spencer 1:f5ac63519541 20 * along with LaOS. If not, see <http://www.gnu.org/licenses/>.
Michael J. Spencer 1:f5ac63519541 21 *
Michael J. Spencer 1:f5ac63519541 22 * Minimal TFTP Server
Michael J. Spencer 1:f5ac63519541 23 * * Receive and send files via TFTP
Michael J. Spencer 1:f5ac63519541 24 * * Server handles only one transfer at a time
Michael J. Spencer 1:f5ac63519541 25 * * Supports only binary mode transfers, no (net)ascii
Michael J. Spencer 1:f5ac63519541 26 * * fixed block size: 512 bytes
Michael J. Spencer 1:f5ac63519541 27 *
Michael J. Spencer 1:f5ac63519541 28 * http://spectral.mscs.mu.edu/RFC/rfc1350.html
Michael J. Spencer 1:f5ac63519541 29 *
Michael J. Spencer 1:f5ac63519541 30 * Example:
Michael J. Spencer 1:f5ac63519541 31 * @code
Michael J. Spencer 1:f5ac63519541 32 * TFTPServer *srv;
Michael J. Spencer 1:f5ac63519541 33 * ...
Michael J. Spencer 1:f5ac63519541 34 * srv = new TFTPServer();
Michael J. Spencer 1:f5ac63519541 35 * ...
Michael J. Spencer 1:f5ac63519541 36 * @endcode
Michael J. Spencer 1:f5ac63519541 37 *
Michael J. Spencer 1:f5ac63519541 38 */
Michael J. Spencer 1:f5ac63519541 39
Michael J. Spencer 1:f5ac63519541 40 #ifndef _TFTPSERVER_H_
Michael J. Spencer 1:f5ac63519541 41 #define _TFTPSERVER_H_
Michael J. Spencer 1:f5ac63519541 42
Michael J. Spencer 1:f5ac63519541 43 #include <stdio.h>
Michael J. Spencer 1:f5ac63519541 44 #include <ctype.h>
Michael J. Spencer 1:f5ac63519541 45 #include "mbed.h"
Michael J. Spencer 1:f5ac63519541 46 #include "laosfilesystem.h"
Michael J. Spencer 1:f5ac63519541 47 #include "UDPSocket.h" // http://mbed.org/users/donatien/programs/EthernetNetIf
Michael J. Spencer 1:f5ac63519541 48
Michael J. Spencer 1:f5ac63519541 49 #define TFTP_PORT 69
Michael J. Spencer 1:f5ac63519541 50 //#define TFTP_DEBUG(x) printf("%s\n\r", x);
Michael J. Spencer 1:f5ac63519541 51
Michael J. Spencer 1:f5ac63519541 52 enum TFTPServerState { listen, reading, writing, error, suspended, deleted };
Michael J. Spencer 1:f5ac63519541 53
Michael J. Spencer 1:f5ac63519541 54 class TFTPServer {
Michael J. Spencer 1:f5ac63519541 55
Michael J. Spencer 1:f5ac63519541 56 public:
Michael J. Spencer 1:f5ac63519541 57 // create a new tftp server, with file directory dir and
Michael J. Spencer 1:f5ac63519541 58 // listening on port
Michael J. Spencer 1:f5ac63519541 59 TFTPServer(char* dir, int myport = TFTP_PORT);
Michael J. Spencer 1:f5ac63519541 60 // destroy this instance of the tftp server
Michael J. Spencer 1:f5ac63519541 61 void reset();
Michael J. Spencer 1:f5ac63519541 62 // reset socket
Michael J. Spencer 1:f5ac63519541 63 ~TFTPServer();
Michael J. Spencer 1:f5ac63519541 64 // get current tftp status
Michael J. Spencer 1:f5ac63519541 65 TFTPServerState State();
Michael J. Spencer 1:f5ac63519541 66 // Temporarily disable incoming TFTP connections
Michael J. Spencer 1:f5ac63519541 67 void suspend();
Michael J. Spencer 1:f5ac63519541 68 // Resume after suspension
Michael J. Spencer 1:f5ac63519541 69 void resume();
Michael J. Spencer 1:f5ac63519541 70 // During read and write, this gives you the filename
Michael J. Spencer 1:f5ac63519541 71 void getFilename(char* name);
Michael J. Spencer 1:f5ac63519541 72 // Return number of received files
Michael J. Spencer 1:f5ac63519541 73 int fileCnt();
Michael J. Spencer 1:f5ac63519541 74
Michael J. Spencer 1:f5ac63519541 75 private:
Michael J. Spencer 1:f5ac63519541 76 // create a new connection reading a file from server
Michael J. Spencer 1:f5ac63519541 77 void ConnectRead(char* infile, Host* client);
Michael J. Spencer 1:f5ac63519541 78 // create a new connection writing a file to the server
Michael J. Spencer 1:f5ac63519541 79 void ConnectWrite(char* infile, Host* client);
Michael J. Spencer 1:f5ac63519541 80 // get DATA block from file on disk into memory
Michael J. Spencer 1:f5ac63519541 81 void getBlock();
Michael J. Spencer 1:f5ac63519541 82 // send DATA block to the client
Michael J. Spencer 1:f5ac63519541 83 void sendBlock();
Michael J. Spencer 1:f5ac63519541 84 // handle special files
Michael J. Spencer 1:f5ac63519541 85 // anything called *.bin is written to /local/FIRMWARE.BIN
Michael J. Spencer 1:f5ac63519541 86 // anything called config.txt is written to /local/config.txt
Michael J. Spencer 1:f5ac63519541 87 // even if workdir is not /local
Michael J. Spencer 1:f5ac63519541 88 int cmpHost(Host* client);
Michael J. Spencer 1:f5ac63519541 89 // send ACK to remote
Michael J. Spencer 1:f5ac63519541 90 void Ack(int val);
Michael J. Spencer 1:f5ac63519541 91 // send ERR message to named client
Michael J. Spencer 1:f5ac63519541 92 void Err(char* msg, Host* client);
Michael J. Spencer 1:f5ac63519541 93 // check if connection mode of client is octet/binary
Michael J. Spencer 1:f5ac63519541 94 int modeOctet(char* buff);
Michael J. Spencer 1:f5ac63519541 95 // timed routine to avoid hanging after interrupted transfers
Michael J. Spencer 1:f5ac63519541 96 void cleanUp();
Michael J. Spencer 1:f5ac63519541 97 // event driven routines to handle incoming packets
Michael J. Spencer 1:f5ac63519541 98 void onListenUDPSocketEvent(UDPSocketEvent e);
Michael J. Spencer 1:f5ac63519541 99 int port; // The TFTP port
Michael J. Spencer 1:f5ac63519541 100 UDPSocket* ListenSock; // main listening socket (dflt: UDP port 69)
Michael J. Spencer 1:f5ac63519541 101 char workdir[256]; // file working directory
Michael J. Spencer 1:f5ac63519541 102 TFTPServerState state; // current TFTP server state
Michael J. Spencer 1:f5ac63519541 103 Host* remote; // connected remote Host IP and Port
Michael J. Spencer 1:f5ac63519541 104 int blockcnt, dupcnt; // block counter, and DUP counter
Michael J. Spencer 1:f5ac63519541 105 FILE* fp; // current file to read or write
Michael J. Spencer 1:f5ac63519541 106 char sendbuff[516]; // current DATA block;
Michael J. Spencer 1:f5ac63519541 107 int blocksize; // last DATA block size while sending
Michael J. Spencer 1:f5ac63519541 108 char filename[256]; // current (or most recent) filename
Michael J. Spencer 1:f5ac63519541 109 //Ticker TFTPServerTimer; // timeout timer
Michael J. Spencer 1:f5ac63519541 110 int filecnt; // received file counter
Michael J. Spencer 1:f5ac63519541 111 };
Michael J. Spencer 1:f5ac63519541 112
Michael J. Spencer 1:f5ac63519541 113 #endif