Go to the source code of this file.
Functions | |
void | RRQ_driver (char *rawPacket, int sz) |
void | WRQ_driver (char *rawPacket, int sz) |
int | TestTimeout (short blockNo) |
void | DATA_driver (char *rawPacket, int sz) |
void | ACK_driver (char *rawPacket, int sz) |
void | ERROR_driver (char *rawPacket, int sz) |
void | OACK_driver (char *rawPacket, int sz) |
void | opcodeDispatcher (char *rawPacket, int sz) |
|
Definition at line 214 of file TFTP_ParserStatic.hpp. Referenced by opcodeDispatcher().
00215 { 00216 if ( option.isACK_Valid() ) 00217 { 00218 short blockNo = 0; 00219 memcpy( (char*)&blockNo, rawPacket+2, 2 ); 00220 00221 // Scan waitingForAck SList and remove packets from Timeout Queue. 00222 if ( option.isClient() && option.state == TFTP_Writing ) 00223 { 00224 if ( option.dataFactory == NULL ) { 00225 option.dataFactory = new DataFactory(); 00226 } 00227 00228 // Cheap scheduling without threads 00229 option.dataFactory->run(); 00230 } 00231 00232 if ( blockNo == 0 && \ 00233 ( ( option.isServer() && option.state == TFTP_Reading ) || \ 00234 ( option.isClient() && option.state == TFTP_Writing ) ) ) 00235 { 00236 if ( option.sendFactory != NULL ) { 00237 option.sendFactory = new TFTP_Sender(); 00238 } 00239 00240 option.sendFactory->start(); 00241 // Let Send Factory the time to Send ! =) 00242 // sched_yield(); 00243 00244 // Send data #1 00245 // Start the DataFactory & TFTP_DataSender 00246 // which will create data packet and send them. 00247 } 00248 00249 00250 00251 if (blockNo == option.LastData && blockNo != 0 ) 00252 { 00253 printf("Got the ACK of the last packet. \n"); 00254 option.state= TFTP_Finished; 00255 //exit(0); 00256 } 00257 00258 if ( blockNo > 0 ) { 00259 TFTP_DataAck clean( blockNo ); 00260 clean.run(); 00261 option.windowsizeLeft++; 00262 printf("I received an acknowledgment, for block number %d\n",blockNo); 00263 00264 // printf("The windowsizeLeft is now %d\n",option.windowsizeLeft); 00265 00266 // Should be auto-destroyed after this if block 00267 } 00268 00269 00270 if ( option.isClient() && option.state == TFTP_WritingNotAck ) { 00271 // The server refused all extension and used default TFTP. 00272 00273 } 00274 00275 if ( option.isServer() && option.isReading() ) { 00276 // The client approved server OACK and replied. 00277 } 00278 00279 }else { 00280 option.state = TFTP_Error; 00281 // Send Error 4. 00282 SendIllegalOpError( "ACK Rejected ?! \n" ); 00283 } 00284 } |
|
Definition at line 170 of file TFTP_ParserStatic.hpp. Referenced by opcodeDispatcher().
00171 { 00172 if ( option.isDATA_Valid() ) 00173 { 00174 TFTP_Packet* pktData = new TFTP_Packet(); 00175 pktData->createData( rawPacket, sz ); 00176 00177 // option.rwlock5_data_queue.write(); 00178 // option.data_queue->enqueue( pktData ); 00179 // option.rwlock5_data_queue.releaseWrite(); 00180 00181 TFTP_Packet* pktAck = new TFTP_Packet(); 00182 short blockNo = 0; 00183 memcpy( (char*)&blockNo, rawPacket + 2, 2 ); 00184 00185 // option.fileFactory->start(28); 00186 00187 option.fileFactory->directWrite( pktData ); 00188 00189 sched_yield(); 00190 00191 if ( TestTimeout( blockNo ) ) 00192 { 00193 printf("Sending Ack for block number %d\n",blockNo); 00194 fflush(stdout); 00195 pktAck->sendAck( blockNo ); // Auto-Respond. 00196 } 00197 00198 if (option.isEnding()) 00199 { 00200 exit( 0); 00201 } 00202 } else { 00203 00204 option.state = TFTP_Error; 00205 00206 // Send Error 4. 00207 SendIllegalOpError( "DATA Rejected: Your NOT allowed yet to send data. \n" ); 00208 } 00209 } |
|
Definition at line 288 of file TFTP_ParserStatic.hpp. Referenced by opcodeDispatcher().
00289 { 00290 // Allow DList to complete ? 00291 option.state = TFTP_Finished; 00292 exit( 0 ); 00293 } |
|
Definition at line 298 of file TFTP_ParserStatic.hpp. Referenced by opcodeDispatcher().
00299 { 00300 if ( ( option.state == TFTP_ReadingNotAck || \ 00301 option.state == TFTP_WritingNotAck ) && \ 00302 option.isClient() ) 00303 { 00304 // Okay. 00305 00306 // Save default, for future request to other servers. 00307 savedOptions.save(); 00308 00309 // Parse OACK args 00310 parseOptions( rawPacket, sz, 2 ); 00311 00312 if ( option.state == TFTP_ReadingNotAck ) { 00313 option.state = TFTP_Reading; 00314 // option.openFile( "rb" ); 00315 TFTP_Packet* pkt = new TFTP_Packet(); 00316 pkt->sendAck( 0 ); 00317 } 00318 00319 if ( option.state == TFTP_WritingNotAck ) { 00320 option.state = TFTP_Writing; 00321 // option.openFile( "wb" ); 00322 // pkt.sendData( 1 ); 00323 00324 if ( option.dataFactory != NULL ) { 00325 option.dataFactory = new DataFactory(); 00326 } 00327 00328 option.dataFactory->run(); 00329 00330 // Let Data Factory the time to produce ! =) 00331 sched_yield(); 00332 00333 if ( option.sendFactory != NULL ) { 00334 option.sendFactory = new TFTP_Sender(); 00335 } 00336 00337 option.sendFactory->run(); 00338 00339 // Let Send Factory the time to Send ! =) 00340 // sched_yield(); 00341 00342 // Send data #1 00343 // Start the DataFactory & TFTP_DataSender 00344 // which will create data packet and send them. 00345 } 00346 00347 } else { 00348 00349 option.state = TFTP_Error; 00350 // Send Error 4. 00351 SendIllegalOpError( "OACK Rejected. \n" ); 00352 } 00353 } |
|
Definition at line 6 of file TFTP_ParserStatic.hpp. Referenced by opcodeDispatcher().
00007 { 00008 // %0000,0011 && Server 00009 // We are the Server and the client wants to read a file from the server. 00010 if ( option.isRRQ_Valid() ) 00011 { 00012 option.state = TFTP_Reading; 00013 00014 // Save default, for future request from other clients. 00015 savedOptions.save(); 00016 00017 // Parse RRQ args 00018 parseOptions( rawPacket, sz, 2 ); 00019 00020 option.showOptions(); 00021 fflush( stdout ); 00022 00023 option.openFile( "rb" ); 00024 fflush( stdout ); 00025 00026 if ( option.dataFactory == NULL ) { 00027 option.dataFactory = new DataFactory(); 00028 } 00029 00030 // Cheap scheduling without threads 00031 option.dataFactory->run(); 00032 00033 // Let Data Factory the time to produce ! =) 00034 // sched_yield(); 00035 00036 //option.build_RRQ_WRQ_TemplatePacket(); 00037 option.build_OptionPacket(); 00038 00039 printf("back\n"); 00040 option.showOptions(); 00041 fflush( stdout ); 00042 00043 OACK_arg = FALSE; 00044 // Send Data/OACK... 00045 if ( OACK_arg == TRUE ) 00046 { 00047 TFTP_Packet* pkt = new TFTP_Packet(); 00048 pkt->sendOAck(); 00049 00050 // Ack#0 will start sendFactory then... 00051 00052 } else { 00053 00054 if ( option.sendFactory == NULL ) { 00055 option.sendFactory = new TFTP_Sender(); 00056 } 00057 00058 option.sendFactory->start(); 00059 00060 // Let Send Factory the time to Send ! =) 00061 sched_yield(); 00062 00063 // Send data #1 00064 // Start the DataFactory & SendFactory 00065 // which will create data packet and send them. 00066 } 00067 00068 } else { 00069 00070 option.state = TFTP_Error; 00071 00072 // We are in a situation where a RRQ packet is not expected, 00073 // in any given way and therefore makes no sense. 00074 00075 // Send Error #4 packet. 00076 SendIllegalOpError( "RRQ Rejected: Your Read Request makes no sense. \n" ); 00077 } 00078 } |
|
Definition at line 136 of file TFTP_ParserStatic.hpp. Referenced by DATA_driver().
00137 { 00138 return 1; 00139 00140 if ( blockNo == 2 ) 00141 { 00142 if ( option.debug == 0 ) 00143 { 00144 option.debug = option.currentTime + 3; 00145 } else 00146 { 00147 if ( option.debug > option.currentTime ) { 00148 printf( "\nLet NOT TIMEOUT !\n"); 00149 fflush( stdout ); 00150 return 1; 00151 } 00152 } 00153 printf( "\nTIMEOUT TEST!\n"); 00154 fflush( stdout ); 00155 return 0; 00156 } 00157 00158 return 1; 00159 } |
|
Definition at line 82 of file TFTP_ParserStatic.hpp. Referenced by opcodeDispatcher().
00083 { 00084 // %0000,0011 && Server 00085 // We are the Server and the client wants to write 00086 // a file on the server side. 00087 if ( option.isWRQ_Valid() ) 00088 { 00089 option.state = TFTP_Writing; 00090 00091 // Save default, for future request from other clients. 00092 savedOptions.save(); 00093 00094 // Parse WRQ args 00095 parseOptions( rawPacket, sz, 2 ); 00096 option.showOptions(); 00097 option.openFile( "wb" ); 00098 00099 if ( option.fileFactory != NULL ) { 00100 option.fileFactory = new FileFactory(); 00101 } 00102 00103 00104 00105 00106 // option.fileFactory->start(28); 00107 00108 option.build_RRQ_WRQ_TemplatePacket(); 00109 option.build_OptionPacket(); 00110 00111 // Send Data/OACK... 00112 if ( OACK_arg == TRUE ) 00113 { 00114 // Send OAck 00115 TFTP_Packet* pkt = new TFTP_Packet(); 00116 pkt->sendOAck(); 00117 00118 } else { 00119 00120 TFTP_Packet* pkt = new TFTP_Packet(); 00121 pkt->sendAck( 0 ); 00122 // Send Ack Block#0 00123 } 00124 } else { 00125 00126 option.state = TFTP_Error; 00127 00128 // We are in a situation where a WRQ packet is not expected, 00129 // in any given way and therefore makes no sense. 00130 00131 // Send Error #4 packet. 00132 SendIllegalOpError( "WRQ Rejected: Your Write Request makes no sense. \n" ); 00133 } 00134 } |
|
Definition at line 355 of file TFTP_ParserStatic.hpp. 00356 { 00357 //printf("\nPDU = {"); 00358 //for( int i = 0; i < sz; i++ ) 00359 // printf("[%d]%c)", rawPacket[i], rawPacket[i] ); 00360 00361 //printf("};\n"); 00362 //option.showOptions(); 00363 //fflush( stdout ); 00364 short op; 00365 00366 memcpy( (char*)&op, rawPacket, 2 ); 00367 00368 if ( op >= 1 && op <= 6 ) 00369 { 00370 char* rawCopy = new char[ sz + 1 ]; 00371 memcpy( rawCopy, rawPacket, sz ); 00372 00373 // opTable start at 0, not 1 00374 switch( op ) 00375 { 00376 case 1: RRQ_driver( rawCopy, sz ); break; 00377 case 2: WRQ_driver( rawCopy, sz ); break; 00378 case 3: DATA_driver( rawCopy, sz ); break; 00379 case 4: ACK_driver( rawCopy, sz ); break; 00380 case 5: ERROR_driver( rawCopy, sz ); break; 00381 case 6: OACK_driver( rawCopy, sz ); break; 00382 } 00383 00384 //(this->*( opTable[ op-1 ] ))( rawCopy, sz ); 00385 00386 } else { 00387 00388 char buf[80]; 00389 sprintf( buf, "Invalid Opcode: %d\n", op ); 00390 SendIllegalOpError( buf ); 00391 } 00392 } |