/[H8]/trunk/docs/Microchip TCP_IP stack/TCPIP Stack/Telnet.c
ViewVC logotype

Annotation of /trunk/docs/Microchip TCP_IP stack/TCPIP Stack/Telnet.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 15 - (hide annotations) (download)
Thu Apr 19 09:01:15 2007 UTC (17 years, 2 months ago) by hedin
File MIME type: text/plain
File size: 9739 byte(s)
added the TCP/IP stack, source code.
1 hedin 15 /*********************************************************************
2     *
3     * Telnet Server
4     * Module for Microchip TCP/IP Stack
5     * -Provides Telnet services on TCP port 23
6     * -Reference: RFC 854
7     *
8     *********************************************************************
9     * FileName: Telnet.c
10     * Dependencies: TCP.h
11     * Processor: PIC18, PIC24F, PIC24H, dsPIC30, dsPIC33F
12     * Complier: Microchip C18 v3.03 or higher
13     * Microchip C30 v2.02 or higher
14     * Company: Microchip Technology, Inc.
15     *
16     * Software License Agreement
17     *
18     * Copyright © 2002-2007 Microchip Technology Inc. All rights
19     * reserved.
20     *
21     * Microchip licenses to you the right to use, modify, copy, and
22     * distribute:
23     * (i) the Software when embedded on a Microchip microcontroller or
24     * digital signal controller product (“Device”) which is
25     * integrated into Licensee’s product; or
26     * (ii) ONLY the Software driver source files ENC28J60.c and
27     * ENC28J60.h ported to a non-Microchip device used in
28     * conjunction with a Microchip ethernet controller for the
29     * sole purpose of interfacing with the ethernet controller.
30     *
31     * You should refer to the license agreement accompanying this
32     * Software for additional information regarding your rights and
33     * obligations.
34     *
35     * THE SOFTWARE AND DOCUMENTATION ARE PROVIDED “AS IS” WITHOUT
36     * WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT
37     * LIMITATION, ANY WARRANTY OF MERCHANTABILITY, FITNESS FOR A
38     * PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL
39     * MICROCHIP BE LIABLE FOR ANY INCIDENTAL, SPECIAL, INDIRECT OR
40     * CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF
41     * PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY OR SERVICES, ANY CLAIMS
42     * BY THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE
43     * THEREOF), ANY CLAIMS FOR INDEMNITY OR CONTRIBUTION, OR OTHER
44     * SIMILAR COSTS, WHETHER ASSERTED ON THE BASIS OF CONTRACT, TORT
45     * (INCLUDING NEGLIGENCE), BREACH OF WARRANTY, OR OTHERWISE.
46     *
47     *
48     * Author Date Comment
49     *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
50     * Howard Schlunder 9/12/06 Original
51     ********************************************************************/
52     #define __TELNET_C
53    
54     #include "TCPIP Stack/TCPIP.h"
55    
56     #if defined(STACK_USE_TELNET_SERVER)
57    
58     #if TCP_TX_FIFO_SIZE < 100
59     #error Error, the Telnet module requires at least a TX FIFO size of 100 bytes. Increase TCP_TX_FIFO_SIZE.
60     #endif
61    
62    
63     #define TELNET_PORT 23
64    
65     #define USERNAME "telnet"
66     #define PASSWORD "microchip"
67    
68    
69     static ROM BYTE strTitle[] = "\x1b[2J\x1b[31m\x1b[1m" // 2J is clear screen, 31m is red, 1m is bold
70     "Microchip Telnet Server 1.1\x1b[0m\r\n" // 0m is clear all attributes
71     "(for this demo, type 'telnet' for the login and 'microchip' for the password.)\r\n"
72     "Login: ";
73     static ROM BYTE strPassword[] = "Password: \xff\xfd\x2d"; // DO Suppress Local Echo (stop telnet client from printing typed characters)
74     static ROM BYTE strAccessDenied[] = "\r\nAccess denied\r\n\r\n";
75     static ROM BYTE strAuthenticated[] = "\r\nLogged in successfully\r\n\r\n"
76     "\r\nPress 'q' to quit\r\n";
77     static ROM BYTE strDisplay[] = "\r\nAnalog: 1023"
78     "\r\nButtons: 3 2 1 0"
79     "\r\nLEDs: 7 6 5 4 3 2 1 0";
80     static ROM BYTE strGoodBye[] = "\r\n\r\nGoodbye!\r\n";
81    
82     extern BYTE AN0String[8];
83    
84     /*********************************************************************
85     * Function: void TelnetTask(void)
86     *
87     * PreCondition: Stack is initialized()
88     *
89     * Input: None
90     *
91     * Output: None
92     *
93     * Side Effects: None
94     *
95     * Overview: None
96     *
97     * Note: None
98     ********************************************************************/
99     void TelnetTask(void)
100     {
101     BYTE i;
102     WORD w, w2;
103     static TCP_SOCKET MySocket = INVALID_SOCKET;
104     static enum _TelnetState
105     {
106     SM_HOME = 0,
107     SM_PRINT_LOGIN,
108     SM_GET_LOGIN,
109     SM_GET_PASSWORD,
110     SM_GET_PASSWORD_BAD_LOGIN,
111     SM_AUTHENTICATED,
112     SM_REFRESH_VALUES,
113     } TelnetState = SM_HOME;
114    
115     // Reset our state if the remote client disconnected from us
116     if(TelnetState >= SM_PRINT_LOGIN)
117     {
118     if(!TCPIsConnected(MySocket))
119     {
120     TelnetState = SM_PRINT_LOGIN;
121     return;
122     }
123     }
124    
125     switch(TelnetState)
126     {
127     case SM_HOME:
128     // Connect a socket to the remote TCP server
129     MySocket = TCPListen(TELNET_PORT);
130    
131     // Abort operation if no TCP sockets are available
132     // If this ever happens, incrementing MAX_TCP_SOCKETS in
133     // StackTsk.h may help (at the expense of more global memory
134     // resources).
135     if(MySocket == INVALID_SOCKET)
136     break;
137    
138     TelnetState++;
139     break;
140    
141     case SM_PRINT_LOGIN:
142     // Make certain the socket can be written to
143     if(TCPIsPutReady(MySocket) < strlenpgm((ROM char*)strTitle))
144     break;
145    
146     // Place the application protocol data into the transmit buffer.
147     TCPPutROMString(MySocket, strTitle);
148    
149     // Send the packet
150     TCPFlush(MySocket);
151     TelnetState++;
152    
153     case SM_GET_LOGIN:
154     // Make sure we can put the password prompt
155     if(TCPIsPutReady(MySocket) < strlenpgm((ROM char*)strPassword))
156     break;
157    
158     // See if the user pressed return
159     w = TCPFind(MySocket, '\n', 0, FALSE);
160     if(w == 0xFFFFu)
161     {
162     if(TCPGetRxFIFOFree(MySocket) == 0u)
163     {
164     TCPPutROMString(MySocket, (ROM BYTE*)"Too much data.\r\n");
165     TCPDisconnect(MySocket);
166     }
167    
168     break;
169     }
170    
171     // Search for the username -- case insensitive
172     w2 = TCPFindROMArray(MySocket, (ROM BYTE*)USERNAME, sizeof(USERNAME)-1, 0, TRUE);
173     if((w2 != 0) || !((sizeof(USERNAME)-1 == w) || (sizeof(USERNAME) == w)))
174     {
175     // Did not find the username, but let's pretend we did so we don't leak the user name validity
176     TelnetState = SM_GET_PASSWORD_BAD_LOGIN;
177     }
178     else
179     {
180     TelnetState = SM_GET_PASSWORD;
181     }
182    
183     // Username verified, throw this line of data away
184     TCPGetArray(MySocket, NULL, w + 1);
185    
186     // Print the password prompt
187     TCPPutROMString(MySocket, strPassword);
188     TCPFlush(MySocket);
189     break;
190    
191     case SM_GET_PASSWORD:
192     case SM_GET_PASSWORD_BAD_LOGIN:
193     // Make sure we can put the authenticated prompt
194     if(TCPIsPutReady(MySocket) < strlenpgm((ROM char*)strAuthenticated))
195     break;
196    
197     // See if the user pressed return
198     w = TCPFind(MySocket, '\n', 0, FALSE);
199     if(w == 0xFFFFu)
200     {
201     if(TCPGetRxFIFOFree(MySocket) == 0u)
202     {
203     TCPPutROMString(MySocket, (ROM BYTE*)"Too much data.\r\n");
204     TCPDisconnect(MySocket);
205     }
206    
207     break;
208     }
209    
210     // Search for the password -- case sensitive
211     w2 = TCPFindROMArray(MySocket, (ROM BYTE*)PASSWORD, sizeof(PASSWORD)-1, 0, FALSE);
212     if((w2 != 3) || !((sizeof(PASSWORD)-1 == w-3) || (sizeof(PASSWORD) == w-3)) || (TelnetState == SM_GET_PASSWORD_BAD_LOGIN))
213     {
214     // Did not find the password
215     TelnetState = SM_PRINT_LOGIN;
216     TCPPutROMString(MySocket, strAccessDenied);
217     TCPDisconnect(MySocket);
218     break;
219     }
220    
221     // Password verified, throw this line of data away
222     TCPGetArray(MySocket, NULL, w + 1);
223    
224     // Print the authenticated prompt
225     TCPPutROMString(MySocket, strAuthenticated);
226     TelnetState = SM_AUTHENTICATED;
227     // No break
228    
229     case SM_AUTHENTICATED:
230     if(TCPIsPutReady(MySocket) < strlenpgm((ROM char*)strDisplay) + 4)
231     break;
232    
233     TCPPutROMString(MySocket, strDisplay);
234     TelnetState++;
235    
236     // All future characters will be bold
237     TCPPutROMString(MySocket, (ROM BYTE*)"\x1b[1m");
238    
239     case SM_REFRESH_VALUES:
240     if(TCPIsPutReady(MySocket) >= 60u)
241     {
242     //[10;1]
243     //"Analog: 1023\r\n"
244     //"Buttons: 3 2 1 0\r\n"
245     //"LEDs: 7 6 5 4 3 2 1 0\r\n"
246    
247     // Position cursor at Line 10, Col 21
248     TCPPutROMString(MySocket, (ROM BYTE*)"\x1b[10;21f");
249    
250     // Put analog value with space padding on right side for 4 characters
251     TCPPutROMArray(MySocket, (ROM BYTE*)" ", 4-strlen((char*)AN0String));
252     TCPPutString(MySocket, AN0String);
253    
254     // Put Buttons
255     TCPPutROMString(MySocket, (ROM BYTE*)"\x1b[11;18f");
256     TCPPut(MySocket, BUTTON3_IO ? '1':'0');
257     TCPPut(MySocket, ' ');
258     TCPPut(MySocket, BUTTON2_IO ? '1':'0');
259     TCPPut(MySocket, ' ');
260     TCPPut(MySocket, BUTTON1_IO ? '1':'0');
261     TCPPut(MySocket, ' ');
262     TCPPut(MySocket, BUTTON0_IO ? '1':'0');
263    
264    
265     // Put LEDs
266     TCPPutROMString(MySocket, (ROM BYTE*)"\x1b[12;10f");
267     TCPPut(MySocket, LED7_IO ? '1':'0');
268     TCPPut(MySocket, ' ');
269     TCPPut(MySocket, LED6_IO ? '1':'0');
270     TCPPut(MySocket, ' ');
271     TCPPut(MySocket, LED5_IO ? '1':'0');
272     TCPPut(MySocket, ' ');
273     TCPPut(MySocket, LED4_IO ? '1':'0');
274     TCPPut(MySocket, ' ');
275     TCPPut(MySocket, LED3_IO ? '1':'0');
276     TCPPut(MySocket, ' ');
277     TCPPut(MySocket, LED2_IO ? '1':'0');
278     TCPPut(MySocket, ' ');
279     TCPPut(MySocket, LED1_IO ? '1':'0');
280     TCPPut(MySocket, ' ');
281     TCPPut(MySocket, LED0_IO ? '1':'0');
282    
283    
284     // Put cursor at beginning of next line
285     TCPPutROMString(MySocket, (ROM BYTE*)"\x1b[13;1f");
286    
287     // Send the data out immediately
288     TCPFlush(MySocket);
289     }
290    
291     if(TCPIsGetReady(MySocket))
292     {
293     TCPGet(MySocket, &i);
294     switch(i)
295     {
296     case '\r':
297     case 'q':
298     case 'Q':
299     if(TCPIsPutReady(MySocket) >= strlenpgm((ROM char*)strGoodBye))
300     TCPPutROMString(MySocket, strGoodBye);
301     TCPDisconnect(MySocket);
302     TelnetState = SM_PRINT_LOGIN;
303     break;
304     }
305     }
306    
307     break;
308     }
309     }
310    
311     #endif //#if defined(STACK_USE_TELNET_SERVER)

  ViewVC Help
Powered by ViewVC 1.1.20