3 #include "EthernetInterface.h"
9 * make.py -m LPC1768 -t ARM -d E:\ -n NET_14
10 * udp_link_layer_auto.py -p COM20 -d E:\ -t 10
15 // IP and port used to store HOST address info
16 char host_address
[32] = {0};
17 volatile int host_port
= 0;
19 const int ECHO_SERVER_PORT
= 7;
20 const int BUFFER_SIZE
= 64;
22 // Forwarding packet queue
23 std::list
<std::string
> datagram_queue
;
26 volatile int received_packets
= 0;
27 volatile int forwarded_packets
= 0;
28 volatile int max_queue_len
= 0;
31 // cli_serv_mutex.lock(); // LOCK
32 // cli_serv_mutex.unlock(); // LOCK
35 void udp_server_task(void const *argument
)
37 DigitalOut
indicator(LED1
);
40 server
.bind(ECHO_SERVER_PORT
);
41 // printf("[udp_server_task] Start\r\n");
44 char buffer
[BUFFER_SIZE
] = { 0 };
46 //printf("[udp_server_task] Wait for packet...\r\n");
47 int n
= server
.receiveFrom(client
, buffer
, sizeof(buffer
));
49 //printf("[udp_server_task] Received packet from: %s\r\n", client.get_address());
50 const int buffer_string_end_index
= n
>= BUFFER_SIZE
? BUFFER_SIZE
- 1 : n
;
51 buffer
[buffer_string_end_index
] = '\0';
52 //printf("[udp_server_task] Server received: %s\r\n", buffer);
54 strcpy(host_address
, client
.get_address());
55 host_port
= ECHO_SERVER_PORT
+ 1;
56 //printf("[udp_server_task] Set host address and port: %s:%d\r\n", host_address, host_port);
58 // Dispatch data to client for sending to test HOST
59 cli_serv_mutex
.lock(); // LOCK
60 // Push to datagram queue
61 datagram_queue
.push_front(std::string(buffer
));
62 max_queue_len
= datagram_queue
.size() > max_queue_len
? datagram_queue
.size() : max_queue_len
;
64 cli_serv_mutex
.unlock(); // LOCK
65 indicator
= !indicator
;
70 void udp_client_task(void const *argument
)
72 while (host_port
== 0) {
73 // Waiting for HOST port notification
76 DigitalOut
indicator(LED2
);
81 echo_server
.set_address(host_address
, host_port
);
82 //printf("[udp_client_task] Start: %s:%d\r\n", host_address, host_port);
86 bool sent_datagram
= false;
87 cli_serv_mutex
.lock(); // LOCK
88 if (datagram_queue
.size() > 0) {
89 // POP from datagram queue
90 datagram
= datagram_queue
.back();
91 datagram_queue
.pop_back();
94 cli_serv_mutex
.unlock(); // LOCK
96 //printf("[udp_client_task] Forwarded datagram: %s\r\n", datagram.c_str());
97 socket
.sendTo(echo_server
, (char *)datagram
.c_str(), datagram
.length());
99 indicator
= !indicator
;
106 EthernetInterface eth
;
108 eth
.init(); //Use DHCP
110 printf("MBED: Server IP Address is %s:%d\r\n", eth
.getIPAddress(), ECHO_SERVER_PORT
);
112 Thread
UdpServerTask(udp_server_task
, NULL
, osPriorityNormal
, DEFAULT_STACK_SIZE
* 2.25);
113 Thread
UdpClientTask(udp_client_task
, NULL
, osPriorityNormal
, DEFAULT_STACK_SIZE
* 2.25);
115 // Control TCP server to get MBED statistics
117 char buffer
[BUFFER_SIZE
] = {0};
118 const int TELNET_SERVER_PORT
= 23;
119 const int BUFFER_SIZE
= 256;
120 TCPSocketServer server
;
121 server
.bind(TELNET_SERVER_PORT
);
125 printf("MBED: Wait for new connection...\r\n");
126 TCPSocketConnection client
;
127 server
.accept(client
);
128 client
.set_blocking(false, 1500); // Timeout after (1.5)s
129 printf("MBED: Connection from: %s\r\n", client
.get_address());
132 int n
= client
.receive(buffer
, sizeof(buffer
));
135 // printf("Recv %d chars\r\n", n);
136 const int buffer_string_end_index
= n
>= BUFFER_SIZE
? BUFFER_SIZE
- 1 : n
;
137 buffer
[buffer_string_end_index
] = '\0';
138 // client.send_all(buffer, strlen(buffer));
139 if (strncmp(buffer
, "stat", 4) == 0) {
140 sprintf(buffer
, "received_packets %d\nforwarded_packets %d\nmax_queue_len %d",
141 received_packets
, forwarded_packets
, max_queue_len
);
142 client
.send_all(buffer
, strlen(buffer
));
143 // printf("%s", buffer);