1 /* =================================================================
5 * An HTTP system monitor
7 * =================================================================
8 * ####ECOSGPLCOPYRIGHTBEGIN####
9 * -------------------------------------------
10 * This file is part of eCos, the Embedded Configurable Operating
12 * Copyright (C) 2002 Nick Garnett.
13 * Copyright (C) 2003 Andrew Lunn
15 * eCos is free software; you can redistribute it and/or modify it
16 * under the terms of the GNU General Public License as published by
17 * the Free Software Foundation; either version 2 or (at your option)
20 * eCos is distributed in the hope that it will be useful, but
21 * WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
23 * General Public License for more details.
25 * You should have received a copy of the GNU General Public License
26 * along with eCos; if not, write to the Free Software Foundation,
27 * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
29 * As a special exception, if other files instantiate templates or
30 * use macros or inline functions from this file, or you compile this
31 * file and link it with other works to produce a work based on this
32 * file, this file does not by itself cause the resulting work to be
33 * covered by the GNU General Public License. However the source code
34 * for this file must still be made available in accordance with
35 * section (3) of the GNU General Public License.
37 * This exception does not invalidate any other reasons why a work
38 * based on this file might be covered by the GNU General Public
41 * -------------------------------------------
42 * ####ECOSGPLCOPYRIGHTEND####
43 * =================================================================
44 * #####DESCRIPTIONBEGIN####
46 * Author(s): nickg@calivar.com
47 * Contributors: nickg@calivar.com, andrew.lunn@ascom.ch
52 * ####DESCRIPTIONEND####
54 * =================================================================
57 #include <pkgconf/system.h>
58 #include <pkgconf/isoinfra.h>
59 #include <pkgconf/net.h>
60 #include <pkgconf/httpd.h>
61 #include <pkgconf/kernel.h>
63 #include <cyg/infra/cyg_trac.h> /* tracing macros */
64 #include <cyg/infra/cyg_ass.h> /* assertion macros */
66 #include <cyg/httpd/httpd.h>
68 #include <cyg/kernel/kapi.h>
69 #ifdef CYGPKG_KERNEL_INSTRUMENT
70 #include <cyg/kernel/instrmnt.h>
71 #include <cyg/kernel/instrument_desc.h>
77 /* ================================================================= */
78 /* Include all the necessary network headers by hand. We need to do
79 * this so that _KERNEL is correctly defined, or not, for specific
80 * headers so we can use both the external API and get at internal
85 #include <sys/param.h>
87 #include <sys/socket.h>
88 #include <sys/ioctl.h>
89 #include <sys/errno.h>
94 #include <sys/sysctl.h>
97 #include <netinet/in.h>
98 #include <netinet/ip.h>
99 #include <netinet/ip_icmp.h>
100 #include <net/route.h>
101 #include <net/if_dl.h>
103 #include <sys/protosw.h>
104 #include <netinet/in_pcb.h>
105 #include <netinet/udp.h>
106 #include <netinet/tcp.h>
107 #include <netinet/tcp_timer.h>
108 #include <netinet/ip_var.h>
109 #include <netinet/icmp_var.h>
110 #include <netinet/udp_var.h>
111 #include <netinet/tcp_var.h>
112 #ifdef CYGPKG_NET_INET6
113 #include <netinet/ip6.h>
114 #include <net/if_var.h>
115 #include <netinet6/ip6_var.h>
116 #include <netinet6/in6_var.h>
117 #include <netinet/icmp6.h>
121 #include <sys/mbuf.h>
123 #include <cyg/io/eth/eth_drv_stats.h>
125 /* ================================================================= */
126 /* Use this when a thread appears to have no name.
129 #define NULL_THREAD_NAME "----------"
131 /* ================================================================= */
132 /* Draw navigation bar
134 * This draws a simple table containing links to the various monitor
135 * pages at the current position in the HTML stream.
138 static void draw_navbar( FILE *client )
140 html_para_begin( client, "" );
142 html_table_begin( client, "border cellpadding=\"4\"" );
144 html_table_row_begin(client, "" );
146 html_table_data_begin( client, "" );
147 html_image( client, "/monitor/ecos.gif", "eCos logo", "" );
148 html_table_data_begin( client, "" );
149 html_url( client, "Threads", "/monitor/threads.html");
150 html_table_data_begin( client, "" );
151 html_url( client, "Interrupts", "/monitor/interrupts.html");
152 html_table_data_begin( client, "" );
153 html_url( client, "Memory", "/monitor/memory.html");
154 html_table_data_begin( client, "" );
155 html_url( client, "Network", "/monitor/network.html");
156 #ifdef CYGPKG_KERNEL_INSTRUMENT
157 html_table_data_begin( client, "" );
158 html_url( client, "Instrumentation", "/monitor/instrument.html");
161 html_table_row_end( client );
163 html_table_end( client );
166 /* ================================================================= */
169 * A simple introductory page matching "/monitor" and
170 * "/monitor/index.html".
173 static char monitor_index_blurb[] =
174 "<p>This is the eCos System Monitor. It presents a simple web monitor "
175 "and control interface for eCos systems.\n"
176 "<p>Use the navigation bar at the bottom of each page to explore."
179 static cyg_bool cyg_monitor_index( FILE * client, char *filename,
180 char *formdata, void *arg )
184 html_head(client,"eCos System Monitor", "");
186 html_body_begin(client,"");
188 html_heading(client, 2, "eCos System Monitor" );
190 fputs( monitor_index_blurb, client );
194 html_body_end(client);
201 CYG_HTTPD_TABLE_ENTRY( cyg_monitor_entry,
206 CYG_HTTPD_TABLE_ENTRY( cyg_monitor_index_entry,
207 "/monitor/index.html",
211 /* ================================================================= */
214 * Uses the kapi thread info API to enumerate all the current threads
215 * and generate a table showing their state.
218 static cyg_bool cyg_monitor_threads( FILE * client, char *filename,
219 char *formdata, void *arg )
224 /* html_head(client,"Thread Monitor", "<meta http-equiv=\"refresh\" content=\"10\">"); */
225 html_head(client,"eCos Thread Monitor", "");
227 html_body_begin(client,"");
229 html_heading(client, 2, "Thread Monitor" );
231 html_table_begin( client, "border" );
233 cyg_handle_t thread = 0;
236 html_table_header( client, "Id", "" );
237 html_table_header( client, "State", "" );
238 html_table_header( client, "Set<br>Priority", "" );
239 html_table_header( client, "Current<br>Priority", "" );
240 html_table_header( client, "Name", "" );
241 html_table_header( client, "Stack Base", "" );
242 html_table_header( client, "Stack Size", "" );
243 #ifdef CYGFUN_KERNEL_THREADS_STACK_MEASUREMENT
244 html_table_header( client, "Stack Used", "" );
246 /* Loop over the threads, and generate a table row for
249 while( cyg_thread_get_next( &thread, &id ) )
251 cyg_thread_info info;
254 cyg_thread_get_info( thread, id, &info );
256 if( info.name == NULL )
257 info.name = NULL_THREAD_NAME;
259 /* Translate the state into a string.
261 if( info.state == 0 )
262 state_string = "RUN";
263 else if( info.state & 0x04 )
264 state_string = "SUSP";
265 else switch( info.state & 0x1b )
267 case 0x01: state_string = "SLEEP"; break;
268 case 0x02: state_string = "CNTSLEEP"; break;
269 case 0x08: state_string = "CREATE"; break;
270 case 0x10: state_string = "EXIT"; break;
271 default: state_string = "????"; break;
274 /* Now generate the row.
276 html_table_row_begin(client, "" );
278 html_table_data_begin( client, "" );
279 fprintf( client, "<a href=\"/monitor/thread-%04x.html\">%04x</a>\n", id,id);
280 html_table_data_begin( client, "" );
281 fprintf( client, "%s", state_string);
282 html_table_data_begin( client, "" );
283 fprintf( client, "%d", info.set_pri);
284 html_table_data_begin( client, "" );
285 fprintf( client, "%d", info.cur_pri);
286 html_table_data_begin( client, "" );
287 fputs( info.name, client );
288 html_table_data_begin( client, "" );
289 fprintf( client, "%08x", info.stack_base );
290 html_table_data_begin( client, "" );
291 fprintf( client, "%d", info.stack_size );
292 #ifdef CYGFUN_KERNEL_THREADS_STACK_MEASUREMENT
293 html_table_data_begin( client, "" );
294 fprintf( client, "%d", info.stack_used );
297 html_table_row_end(client);
301 html_table_end( client );
305 html_body_end(client);
312 CYG_HTTPD_TABLE_ENTRY( cyg_monitor_show_threads,
313 "/monitor/threads.htm*",
317 /* ================================================================= */
320 * A page on which the thread's state may be edited. This tests forms
324 static char thread_edit_blurb[] =
325 "<p>This table contains an entry for each property of the thread "
326 "that you can edit. The properties are:\n"
327 "<p><b>State:</b> Change thread's state. The <em>Suspend</em> button "
328 "will suspend the thread. The <em>Run</em> button will undo any previous "
329 "suspends. The <em>Release</em> button will release the thread out of "
330 "any sleep it is currently in.\n"
331 "<p><b>Priority:</b> Change the thread's priority.\n"
332 "<p>Once the new state has been selected, press the <em>Submit</em> "
333 "button to make the change, or <em>Reset</em> to clear it."
336 static cyg_bool cyg_monitor_thread_edit( FILE * client, char *filename,
337 char *formdata, void *arg )
339 /* If any form data has been supplied, then change the thread's
342 if( formdata != NULL )
348 cyg_handle_t thread = 0;
352 cyg_formdata_parse( formdata, formlist, 6 );
354 /* Get the thread id from the hidden control */
355 id_string = cyg_formlist_find( formlist, "thread");
357 sscanf( id_string, "%04hx", &id );
359 thread = cyg_thread_find( id );
361 /* If there is a pri field, change the priority */
362 pri_string = cyg_formlist_find( formlist, "pri");
364 if( pri_string != NULL )
368 sscanf( pri_string, "%d", &pri );
370 cyg_thread_set_priority( thread, pri );
373 /* If there is a state field, change the thread state */
374 state = cyg_formlist_find( formlist, "state");
378 if( strcmp( state, "run" ) == 0 )
379 cyg_thread_resume( thread );
380 if( strcmp( state, "suspend" ) == 0 )
381 cyg_thread_suspend( thread );
382 if( strcmp( state, "release" ) == 0 )
383 cyg_thread_release( thread );
387 /* Now generate a page showing the current thread state, and
388 * including form controls to change it.
393 html_head(client,"eCos Thread Editor", "");
395 html_body_begin(client,"");
398 cyg_thread_info info;
399 cyg_handle_t thread = 0;
402 sscanf( filename, "/monitor/thread-%04hx.html", &id );
404 thread = cyg_thread_find( id );
405 cyg_thread_get_info(thread, id, &info );
407 html_heading(client, 2, "Thread State Editor" );
409 html_para_begin( client, "" );
411 fprintf( client, "Editing Thread %04x %s\n",id,
412 info.name?info.name:NULL_THREAD_NAME);
414 fputs( thread_edit_blurb, client );
416 html_form_begin( client, filename, "" );
418 html_table_begin( client, "border" );
420 html_table_header( client, "Property", "" );
421 html_table_header( client, "Value", "" );
423 html_table_row_begin(client, "" );
425 html_table_data_begin( client, "" );
426 fputs( "State", client );
428 html_table_data_begin( client, "" );
430 html_form_input_radio( client, "state", "run", (info.state&0x04)==0 );
431 fputs( "Run", client );
432 html_form_input_radio( client, "state", "suspend", (info.state&0x04)!=0 );
433 fputs( "Suspend", client );
434 html_form_input_radio( client, "state", "release", 0 );
435 fputs( "Release", client );
437 html_table_row_end( client );
439 html_table_row_begin(client, "" );
441 html_table_data_begin( client, "" );
442 fputs( "Priority", client );
444 html_table_data_begin( client, "" );
445 fprintf(client,"<input type=\"text\" name=\"pri\" size=\"10\" value=\"%d\">\n",
448 html_table_row_end( client );
451 html_table_end( client );
453 /* Add submit and reset buttons */
454 html_form_input(client, "submit", "submit", "Submit", "");
455 html_form_input(client, "reset", "reset", "Reset", "");
457 /* Pass the thread ID through to our next incarnation */
458 sprintf( idbuf, "%04x", id );
459 html_form_input_hidden(client, "thread", idbuf );
462 html_form_end( client );
466 html_body_end(client);
473 CYG_HTTPD_TABLE_ENTRY( cyg_monitor_thread_edit_entry,
475 cyg_monitor_thread_edit,
478 /* ================================================================= */
481 * At present this just generates a table showing which interrupts
482 * have an ISR attached.
485 static cyg_bool cyg_monitor_interrupts( FILE * client, char *filename,
486 char *formdata, void *arg )
490 html_head(client,"eCos Interrupt Monitor", "");
492 html_body_begin(client,"");
494 html_heading(client, 2, "Interrupt Monitor" );
496 html_table_begin( client, "border" );
499 int maxint = CYGNUM_HAL_ISR_MAX;
501 #ifdef CYGPKG_HAL_I386
502 maxint = CYGNUM_HAL_ISR_MIN+16;
505 html_table_header( client, "ISR", "" );
506 html_table_header( client, "State", "" );
508 for( i = CYGNUM_HAL_ISR_MIN; i <= maxint ; i++ )
511 HAL_INTERRUPT_IN_USE( i, inuse );
513 html_table_row_begin(client, "" );
515 html_table_data_begin( client, "" );
516 fprintf( client, "%d", i);
517 html_table_data_begin( client, "" );
518 fprintf( client, "%s", inuse?"In Use":"Free");
520 html_table_row_end( client );
523 html_table_end( client );
527 html_body_end(client);
535 CYG_HTTPD_TABLE_ENTRY( cyg_monitor_interrupts_entry,
536 "/monitor/interrupts.htm*",
537 cyg_monitor_interrupts,
540 /* ================================================================= */
543 * Generates a table showing a 256 byte page of memory. Form controls
544 * allow changes to the base address and display element size.
547 static cyg_bool cyg_monitor_memory( FILE * client, char *filename,
548 char *formdata, void *arg )
552 unsigned int datasize = 1;
555 bool valid_base = true;
558 cyg_formdata_parse( formdata, formlist, 10 );
560 p = cyg_formlist_find( formlist, "base" );
562 /* If the page is requested without a 'base' parameter, do not attempt
563 * to access any memory locations to prevent illegal memory accesses
564 * on targets where '0' is not a valid address.
567 sscanf( p, "%x", &base );
571 p = cyg_formlist_find( formlist, "datasize" );
574 sscanf( p, "%x", &datasize );
576 if( cyg_formlist_find( formlist, "next" ) != NULL )
579 if( cyg_formlist_find( formlist, "prev" ) != NULL )
584 html_head(client,"eCos Memory Monitor", "");
586 html_body_begin(client,"");
588 html_heading(client, 2, "Memory Monitor" );
590 html_form_begin( client, "/monitor/memory.html", "" );
593 /* Text input control for base address
595 html_para_begin( client, "" );
597 "Base Address: 0x<input type=\"text\" name=\"base\" size=\"10\" value=\"%x\">\n",
601 "WARNING: entering an illegal base address can crash the system.\n");
603 /* A little menu for the element size
605 html_para_begin( client, "" );
607 fputs( "Element Size: ", client );
608 html_form_select_begin( client, "datasize", "" );
609 html_form_option( client, "1", "bytes", datasize==1 );
610 html_form_option( client, "2", "words", datasize==2 );
611 html_form_option( client, "4", "dwords", datasize==4 );
612 html_form_select_end( client );
614 html_para_begin( client, "" );
616 /* Submit and reset buttons
618 html_form_input(client, "submit", "submit", "Submit", "");
619 html_form_input(client, "reset", "reset", "Reset", "");
621 html_para_begin( client, "" );
623 /* Previous page button */
624 html_form_input(client, "submit", "prev", "Prev Page", "");
626 /* Switch to monospaced font */
627 cyg_html_tag_begin( client, "font", "face=\"monospace\"" );
629 html_table_begin( client, "" );
631 if (valid_base == true) {
635 for( oloc = loc = base; loc <= (base+size) ; loc++ )
637 if( ( loc % 16 ) == 0 )
641 html_table_data_begin( client, "" );
642 for( ; oloc < loc; oloc++ )
644 char c = *(char *)oloc;
649 html_table_row_end( client );
651 if( loc == (base+size) )
653 html_table_row_begin(client, "" );
654 html_table_data_begin( client, "" );
655 fprintf( client, "%08x:",loc);
658 html_table_data_begin( client, "" );
660 if( (loc % datasize) == 0 )
664 case 1: fprintf( client, "%02x", *(cyg_uint8 *)loc ); break;
665 case 2: fprintf( client, "%04x", *(cyg_uint16 *)loc ); break;
666 case 4: fprintf( client, "%08x", *(cyg_uint32 *)loc ); break;
671 html_table_end( client );
672 cyg_html_tag_end( client, "font" );
674 html_form_input(client, "submit", "next", "Next Page", "");
676 html_form_end( client );
680 html_body_end(client);
688 CYG_HTTPD_TABLE_ENTRY( cyg_monitor_memory_entry,
689 "/monitor/memory.htm*",
693 /* ================================================================= */
696 * This function generates a page containing information about the
697 * network interfaces and the protocols.
700 static cyg_bool cyg_monitor_network( FILE * client, char *filename,
701 char *formdata, void *arg )
703 struct ifaddrs *iflist, *ifp;
705 if(getifaddrs(&iflist)!=0)
710 html_head(client,"eCos Network Monitor", "");
712 html_body_begin(client,"");
714 html_heading(client, 2, "Network Monitor" );
716 html_heading(client, 3, "Interfaces" );
718 html_table_begin( client, "border" );
724 html_table_header( client, "Interface", "" );
725 html_table_header( client, "Status", "" );
727 while( ifp != (struct ifaddrs *)NULL)
729 if (ifp->ifa_addr->sa_family != AF_LINK)
732 html_table_row_begin(client, "" );
734 html_table_data_begin( client, "" );
735 fprintf( client, "%s", ifp->ifa_name);
737 html_table_data_begin( client, "" );
738 html_table_begin( client, "" );
740 /* Get the interface's flags and display
741 * the interesting ones.
744 html_table_row_begin(client, "" );
745 fprintf( client, "<td>Flags<td>\n" );
746 for( i = 0; i < 16; i++ )
748 switch( ifp->ifa_flags & (1<<i) )
751 case IFF_UP: fputs( " UP", client ); break;
752 case IFF_BROADCAST: fputs( " BROADCAST", client ); break;
753 case IFF_DEBUG: fputs( " DEBUG", client ); break;
754 case IFF_LOOPBACK: fputs( " LOOPBACK", client ); break;
755 case IFF_PROMISC: fputs( " PROMISCUOUS", client ); break;
756 case IFF_RUNNING: fputs( " RUNNING", client ); break;
757 case IFF_SIMPLEX: fputs( " SIMPLEX", client ); break;
758 case IFF_MULTICAST: fputs( " MULTICAST", client ); break;
761 html_table_row_end( client );
763 html_table_row_begin(client, "" );
764 getnameinfo(ifp->ifa_addr, sizeof(*ifp->ifa_addr),
765 addr, sizeof(addr), NULL, 0, NI_NUMERICHOST);
766 fprintf( client, "<td>Address<td>%s\n", addr);
767 html_table_row_end( client );
769 if (ifp->ifa_netmask)
771 html_table_row_begin(client, "" );
772 getnameinfo(ifp->ifa_netmask, sizeof(*ifp->ifa_netmask),
773 addr, sizeof(addr), NULL, 0, NI_NUMERICHOST);
774 fprintf( client, "<td>Mask<td>%s\n", addr);
775 html_table_row_end( client );
778 if (ifp->ifa_broadaddr)
780 html_table_row_begin(client, "" );
781 getnameinfo(ifp->ifa_broadaddr, sizeof(*ifp->ifa_broadaddr),
782 addr, sizeof(addr), NULL, 0, NI_NUMERICHOST);
783 fprintf( client, "<td>Broadcast<td>%s\n", addr);
784 html_table_row_end( client );
787 html_table_end( client );
789 html_table_row_end( client );
795 html_table_end( client );
797 /* Now the protocols. For each of the main protocols: IP,
798 * ICMP, UDP, TCP print a table of useful information derived
799 * from the in-kernel data structures. Note that this only
800 * works for the BSD stacks.
803 html_para_begin( client, "" );
804 html_heading(client, 3, "Protocols" );
806 html_para_begin( client, "" );
807 html_table_begin( client, "border");
809 html_table_header( client, "IPv4", "" );
810 #ifdef CYGPKG_NET_INET6
811 html_table_header( client, "IPv6", "" );
813 html_table_header( client, "ICMPv4", "" );
814 #ifdef CYGPKG_NET_INET6
815 html_table_header( client, "ICMPv6", "" );
817 html_table_header( client, "UDP", "" );
818 html_table_header( client, "TCP", "" );
820 html_table_row_begin(client, "" );
822 html_table_data_begin( client, "valign=\"top\"" );
823 html_table_begin( client, "" );
826 fprintf( client, "<tr><td><b>%s:</b><td></tr>\n", "Received" );
827 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "Total",
829 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "Bad",
838 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "Reassembled",
839 ipstat.ips_reassembled );
840 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "Delivered",
841 ipstat.ips_delivered );
843 fprintf( client, "<tr><td><b>%s:</b><td></tr>\n", "Sent" );
844 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "Total",
845 ipstat.ips_localout );
846 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "Raw",
848 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "Fragmented",
849 ipstat.ips_fragmented );
851 html_table_end( client );
852 #ifdef CYGPKG_NET_INET6
853 html_table_data_begin( client, "valign=\"top\"" );
854 html_table_begin( client, "" );
857 fprintf( client, "<tr><td><b>%s:</b><td></tr>\n", "Received" );
858 fprintf( client, "<tr><td>%s<td>%lld</tr>\n", "Total",
859 ip6stat.ip6s_total );
860 fprintf( client, "<tr><td>%s<td>%lld</tr>\n", "Bad",
861 ip6stat.ip6s_tooshort+
862 ip6stat.ip6s_toosmall
864 fprintf( client, "<tr><td>%s<td>%lld</tr>\n", "Reassembled",
865 ip6stat.ip6s_reassembled );
866 fprintf( client, "<tr><td>%s<td>%lld</tr>\n", "Delivered",
867 ip6stat.ip6s_delivered );
869 fprintf( client, "<tr><td><b>%s:</b><td></tr>\n", "Sent" );
870 fprintf( client, "<tr><td>%s<td>%lld</tr>\n", "Total",
871 ip6stat.ip6s_localout );
872 fprintf( client, "<tr><td>%s<td>%lld</tr>\n", "Raw",
873 ip6stat.ip6s_rawout );
874 fprintf( client, "<tr><td>%s<td>%lld</tr>\n", "Fragmented",
875 ip6stat.ip6s_fragmented );
877 html_table_end( client );
879 html_table_data_begin( client, "valign=\"top\"" );
880 html_table_begin( client, "" );
883 fprintf( client, "<tr><td><b>%s:</b><td></tr>\n", "Received" );
884 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "ECHO",
885 icmpstat.icps_inhist[ICMP_ECHO] );
886 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "ECHO REPLY",
887 icmpstat.icps_inhist[ICMP_ECHOREPLY] );
888 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "UNREACH",
889 icmpstat.icps_inhist[ICMP_UNREACH] );
890 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "REDIRECT",
891 icmpstat.icps_inhist[ICMP_REDIRECT] );
892 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "Other",
893 icmpstat.icps_inhist[ICMP_SOURCEQUENCH]+
894 icmpstat.icps_inhist[ICMP_ROUTERADVERT]+
895 icmpstat.icps_inhist[ICMP_ROUTERSOLICIT]+
896 icmpstat.icps_inhist[ICMP_TIMXCEED]+
897 icmpstat.icps_inhist[ICMP_PARAMPROB]+
898 icmpstat.icps_inhist[ICMP_TSTAMP]+
899 icmpstat.icps_inhist[ICMP_TSTAMPREPLY]+
900 icmpstat.icps_inhist[ICMP_IREQ]+
901 icmpstat.icps_inhist[ICMP_IREQREPLY]+
902 icmpstat.icps_inhist[ICMP_MASKREQ]+
903 icmpstat.icps_inhist[ICMP_MASKREPLY]
905 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "Bad",
906 icmpstat.icps_badcode+
907 icmpstat.icps_tooshort+
908 icmpstat.icps_checksum+
909 icmpstat.icps_badlen+
910 icmpstat.icps_bmcastecho
913 fprintf( client, "<tr><td><b>%s:</b><td></tr>\n", "Sent" );
914 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "ECHO",
915 icmpstat.icps_outhist[ICMP_ECHO] );
916 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "ECHO REPLY",
917 icmpstat.icps_outhist[ICMP_ECHOREPLY] );
918 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "UNREACH",
919 icmpstat.icps_outhist[ICMP_UNREACH] );
920 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "REDIRECT",
921 icmpstat.icps_outhist[ICMP_REDIRECT] );
922 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "Other",
923 icmpstat.icps_inhist[ICMP_SOURCEQUENCH]+
924 icmpstat.icps_outhist[ICMP_ROUTERADVERT]+
925 icmpstat.icps_outhist[ICMP_ROUTERSOLICIT]+
926 icmpstat.icps_outhist[ICMP_TIMXCEED]+
927 icmpstat.icps_outhist[ICMP_PARAMPROB]+
928 icmpstat.icps_outhist[ICMP_TSTAMP]+
929 icmpstat.icps_outhist[ICMP_TSTAMPREPLY]+
930 icmpstat.icps_outhist[ICMP_IREQ]+
931 icmpstat.icps_outhist[ICMP_IREQREPLY]+
932 icmpstat.icps_outhist[ICMP_MASKREQ]+
933 icmpstat.icps_outhist[ICMP_MASKREPLY]
936 html_table_end( client );
938 #ifdef CYGPKG_NET_INET6
939 html_table_data_begin( client, "valign=\"top\"" );
940 html_table_begin( client, "" );
943 fprintf( client, "<tr><td><b>%s:</b><td></tr>\n", "Received" );
944 fprintf( client, "<tr><td>%s<td>%lld</tr>\n", "ECHO",
945 icmp6stat.icp6s_inhist[ICMP_ECHO] );
946 fprintf( client, "<tr><td>%s<td>%lld</tr>\n", "ECHO REPLY",
947 icmp6stat.icp6s_inhist[ICMP_ECHOREPLY] );
948 fprintf( client, "<tr><td>%s<td>%lld</tr>\n", "UNREACH",
949 icmp6stat.icp6s_inhist[ICMP_UNREACH] );
950 fprintf( client, "<tr><td>%s<td>%lld</tr>\n", "REDIRECT",
951 icmp6stat.icp6s_inhist[ICMP_REDIRECT] );
952 fprintf( client, "<tr><td>%s<td>%lld</tr>\n", "Other",
953 icmp6stat.icp6s_inhist[ICMP_SOURCEQUENCH]+
954 icmp6stat.icp6s_inhist[ICMP_ROUTERADVERT]+
955 icmp6stat.icp6s_inhist[ICMP_ROUTERSOLICIT]+
956 icmp6stat.icp6s_inhist[ICMP_TIMXCEED]+
957 icmp6stat.icp6s_inhist[ICMP_PARAMPROB]+
958 icmp6stat.icp6s_inhist[ICMP_TSTAMP]+
959 icmp6stat.icp6s_inhist[ICMP_TSTAMPREPLY]+
960 icmp6stat.icp6s_inhist[ICMP_IREQ]+
961 icmp6stat.icp6s_inhist[ICMP_IREQREPLY]+
962 icmp6stat.icp6s_inhist[ICMP_MASKREQ]+
963 icmp6stat.icp6s_inhist[ICMP_MASKREPLY]
965 fprintf( client, "<tr><td>%s<td>%lld</tr>\n", "Bad",
966 icmp6stat.icp6s_badcode+
967 icmp6stat.icp6s_tooshort+
968 icmp6stat.icp6s_checksum+
969 icmp6stat.icp6s_badlen
972 fprintf( client, "<tr><td><b>%s:</b><td></tr>\n", "Sent" );
973 fprintf( client, "<tr><td>%s<td>%lld</tr>\n", "ECHO",
974 icmp6stat.icp6s_outhist[ICMP_ECHO] );
975 fprintf( client, "<tr><td>%s<td>%lld</tr>\n", "ECHO REPLY",
976 icmp6stat.icp6s_outhist[ICMP_ECHOREPLY] );
977 fprintf( client, "<tr><td>%s<td>%lld</tr>\n", "UNREACH",
978 icmp6stat.icp6s_outhist[ICMP_UNREACH] );
979 fprintf( client, "<tr><td>%s<td>%lld</tr>\n", "REDIRECT",
980 icmp6stat.icp6s_outhist[ICMP_REDIRECT] );
981 fprintf( client, "<tr><td>%s<td>%lld</tr>\n", "Other",
982 icmp6stat.icp6s_inhist[ICMP_SOURCEQUENCH]+
983 icmp6stat.icp6s_outhist[ICMP_ROUTERADVERT]+
984 icmp6stat.icp6s_outhist[ICMP_ROUTERSOLICIT]+
985 icmp6stat.icp6s_outhist[ICMP_TIMXCEED]+
986 icmp6stat.icp6s_outhist[ICMP_PARAMPROB]+
987 icmp6stat.icp6s_outhist[ICMP_TSTAMP]+
988 icmp6stat.icp6s_outhist[ICMP_TSTAMPREPLY]+
989 icmp6stat.icp6s_outhist[ICMP_IREQ]+
990 icmp6stat.icp6s_outhist[ICMP_IREQREPLY]+
991 icmp6stat.icp6s_outhist[ICMP_MASKREQ]+
992 icmp6stat.icp6s_outhist[ICMP_MASKREPLY]
995 html_table_end( client );
997 html_table_data_begin( client, "valign=\"top\"" );
998 html_table_begin( client, "" );
1001 fprintf( client, "<tr><td><b>%s:</b><td></tr>\n", "Received" );
1002 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "Total",
1003 udpstat.udps_ipackets );
1004 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "Bad",
1005 udpstat.udps_hdrops+
1006 udpstat.udps_badsum+
1007 udpstat.udps_badlen+
1008 udpstat.udps_noport+
1009 udpstat.udps_noportbcast+
1010 udpstat.udps_fullsock
1012 fprintf( client, "<tr><td><b>%s:</b><td></tr>\n", "Sent" );
1013 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "Total",
1014 udpstat.udps_opackets );
1016 html_table_end( client );
1018 html_table_data_begin( client, "valign=\"top\"" );
1019 html_table_begin( client, "" );
1022 fprintf( client, "<tr><td><b>%s:</b><td></tr>\n", "Connections" );
1023 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "Initiated",
1024 tcpstat.tcps_connattempt );
1025 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "Accepted",
1026 tcpstat.tcps_accepts );
1027 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "Established",
1028 tcpstat.tcps_connects );
1029 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "Closed",
1030 tcpstat.tcps_closed );
1032 fprintf( client, "<tr><td><b>%s:</b><td></tr>\n", "Received" );
1033 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "Packets",
1034 tcpstat.tcps_rcvtotal );
1035 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "Data Packets",
1036 tcpstat.tcps_rcvpack );
1037 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "Bytes",
1038 tcpstat.tcps_rcvbyte );
1040 fprintf( client, "<tr><td><b>%s:</b><td></tr>\n", "Sent" );
1041 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "Packets",
1042 tcpstat.tcps_sndtotal );
1043 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "Data Packets",
1044 tcpstat.tcps_sndpack );
1045 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "Bytes",
1046 tcpstat.tcps_sndbyte );
1050 html_table_end( client );
1054 html_table_row_end( client );
1057 html_table_end( client );
1059 html_para_begin( client, "" );
1060 html_heading(client, 3, "Mbufs" );
1062 html_table_begin( client, "border" );
1064 html_table_header( client, "Summary", "" );
1065 html_table_header( client, "Types", "" );
1067 html_table_row_begin( client, "" );
1069 html_table_data_begin( client, "valign=\"top\"" );
1070 html_table_begin( client, "" );
1072 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "Mbufs",
1074 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "Clusters",
1075 mbstat.m_clusters );
1076 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "Free Clusters",
1078 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "Drops",
1080 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "Waits",
1082 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "Drains",
1084 #if defined(CYGPKG_NET_FREEBSD_STACK)
1085 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "Copy Fails",
1087 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "Pullup Fails",
1092 html_table_end( client );
1094 html_table_data_begin( client, "valign=\"top\"" );
1095 html_table_begin( client, "" );
1098 #if defined(CYGPKG_NET_FREEBSD_STACK)
1101 mtypes = mbstat.m_mtypes;
1104 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "FREE",
1106 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "DATA",
1108 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "HEADER",
1109 mtypes[MT_HEADER] );
1110 #if !defined(CYGPKG_NET_FREEBSD_STACK)
1111 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "SOCKET",
1112 mtypes[MT_SOCKET] );
1113 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "PCB",
1115 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "RTABLE",
1116 mtypes[MT_RTABLE] );
1117 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "HTABLE",
1118 mtypes[MT_HTABLE] );
1119 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "ATABLE",
1120 mtypes[MT_ATABLE] );
1122 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "SONAME",
1123 mtypes[MT_SONAME] );
1124 #if !defined(CYGPKG_NET_FREEBSD_STACK)
1125 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "SOOPTS",
1126 mtypes[MT_SOOPTS] );
1128 fprintf( client, "<tr><td>%s<td>%ld</tr>\n", "FTABLE",
1129 mtypes[MT_FTABLE] );
1131 /* Ignore the rest for now... */
1134 html_table_end( client );
1137 html_table_row_end( client );
1140 html_table_end( client );
1143 draw_navbar(client);
1145 html_body_end(client);
1149 freeifaddrs(iflist);
1154 CYG_HTTPD_TABLE_ENTRY( cyg_monitor_network_entry,
1155 "/monitor/network.htm*",
1156 cyg_monitor_network,
1160 /* ================================================================= */
1161 /* Instrumentation Monitor
1163 * If the CYGPKG_KERNEL_INSTRUMENT option is set, we generate a table
1164 * showing the current instrumentation buffer. If the FLAGS option is
1165 * enabled we also print a table giving control of the flags.
1169 #ifdef CYGPKG_KERNEL_INSTRUMENT
1171 /* Instrumentation record. */
1172 struct Instrument_Record
1174 CYG_WORD16 type; // record type
1175 CYG_WORD16 thread; // current thread id
1176 CYG_WORD timestamp; // 32 bit timestamp
1177 CYG_WORD arg1; // first arg
1178 CYG_WORD arg2; // second arg
1180 typedef struct Instrument_Record Instrument_Record;
1182 /* Instrumentation variables, these live in the
1183 * instrumentation files in the kernel
1185 __externC Instrument_Record *instrument_buffer_pointer;
1186 __externC Instrument_Record instrument_buffer[];
1187 __externC cyg_uint32 instrument_buffer_size;
1189 #if defined(CYGDBG_KERNEL_INSTRUMENT_FLAGS) && \
1190 defined(CYGDBG_KERNEL_INSTRUMENT_MSGS)
1192 static cyg_uint32 instrument_flags[(CYG_INSTRUMENT_CLASS_MAX>>8)+1];
1196 static char cyg_monitor_instrument_blurb1[] =
1197 "<p>Use the checkboxes to enable the events to be recorded. Click "
1198 "the <em>Submit</em> button to start recording. Click the <em>Clear</em> "
1199 "button to clear all instrumentation and to stop recording."
1202 static cyg_bool cyg_monitor_instrument( FILE * client, char *filename,
1203 char *formdata, void *arg )
1206 #if defined(CYGDBG_KERNEL_INSTRUMENT_FLAGS) && \
1207 defined(CYGDBG_KERNEL_INSTRUMENT_MSGS)
1209 /* Disable all instrumentation while we generate the page.
1210 * Otherwise we could swamp the information we are really after.
1213 cyg_scheduler_lock();
1215 struct instrument_desc_s *id = instrument_desc;
1216 CYG_WORD cl = 0, ev = 0;
1218 for( ; id->msg != 0; id++ )
1220 if( id->num > 0xff )
1223 instrument_flags[cl] = 0;
1228 cyg_instrument_disable( cl<<8, ev );
1232 cyg_scheduler_unlock();
1236 /* If we have some form data, deal with it.
1238 if( formdata != NULL )
1242 cyg_formdata_parse( formdata, list, sizeof(list)/sizeof(*list) );
1244 #if defined(CYGDBG_KERNEL_INSTRUMENT_FLAGS) && \
1245 defined(CYGDBG_KERNEL_INSTRUMENT_MSGS)
1247 if( cyg_formlist_find( list, "clear" ) != NULL )
1249 /* If the clear button is set, then disable all instrumentation flags.
1252 for( i = 0; i < sizeof(instrument_flags)/sizeof(*instrument_flags); i++ )
1253 instrument_flags[i] = 0;
1257 /* Otherwise all the set checkboxes have been reported to
1258 * us in the form of class=event inputs.
1261 for( p = list; *p != NULL; p++ )
1264 if( sscanf( *p, "%02x=%02x", &cl, &ev ) == 2 )
1265 instrument_flags[cl] |= 1<<ev;
1270 /* If the cleartable button has been pressed, clear all the
1273 if( cyg_formlist_find( list, "cleartable" ) != NULL )
1275 cyg_scheduler_lock();
1277 Instrument_Record *ibp = instrument_buffer_pointer;
1282 if( ibp == &instrument_buffer[instrument_buffer_size] )
1283 ibp = instrument_buffer;
1285 } while( ibp != instrument_buffer_pointer );
1288 cyg_scheduler_unlock();
1292 /* Now start generating the HTML page.
1296 html_head(client,"eCos Instrumentation Buffer", "");
1298 html_body_begin(client,"");
1300 html_heading(client, 2, "Instrumentation Buffer" );
1302 html_form_begin( client, "/monitor/instrument.html", "" );
1304 #if defined(CYGDBG_KERNEL_INSTRUMENT_FLAGS) && \
1305 defined(CYGDBG_KERNEL_INSTRUMENT_MSGS)
1307 /* If we have the flags enabled, generate a table showing all
1308 * the flag names with a checkbox against each.
1311 fputs( cyg_monitor_instrument_blurb1, client );
1313 html_para_begin( client, "" );
1314 /* Add submit,clear and reset buttons */
1315 html_form_input(client, "submit", "submit", "Submit", "");
1316 html_form_input(client, "submit", "clear", "Clear", "");
1317 html_form_input(client, "reset", "reset", "Reset", "");
1319 html_table_begin( client, "border width=100%" );
1321 struct instrument_desc_s *id = instrument_desc;
1322 CYG_WORD cl = 0, ev = 0;
1324 char class[5], event[5];
1326 html_table_row_begin( client, "" );
1328 for( ; id->msg != 0; id++ )
1330 if( id->num > 0xff )
1333 sprintf( class, "%02x", cl>>8 );
1336 if( id != instrument_desc )
1338 html_table_end( client );
1339 html_table_row_end( client );
1340 html_table_row_begin( client, "" );
1343 html_table_data_begin( client, "valign=\"top\" width=100%" );
1344 html_table_begin( client, "width=100%" );
1349 sprintf( event, "%02x", ev );
1354 html_table_row_end( client );
1356 html_table_row_begin( client, "" );
1359 html_table_data_begin( client, "width=25%" );
1360 html_form_input_checkbox( client, class, event,
1361 instrument_flags[cl>>8] & (1<<ev) );
1362 fputs( id->msg, client );
1365 html_table_end( client );
1366 html_table_row_end( client );
1368 html_table_end( client );
1370 /* Add submit,clear and reset buttons */
1371 html_form_input(client, "submit", "submit", "Submit", "");
1372 html_form_input(client, "submit", "clear", "Clear", "");
1373 html_form_input(client, "reset", "reset", "Reset", "");
1377 html_para_begin( client, "" );
1379 html_form_input(client, "submit", "cleartable", "Clear Table", "");
1385 html_table_begin( client, "border" );
1387 Instrument_Record *ibp = instrument_buffer_pointer;
1389 html_table_header( client, "TIME", "" );
1390 html_table_header( client, "THREAD", "" );
1391 html_table_header( client, "EVENT", "" );
1392 html_table_header( client, "ARG1", "" );
1393 html_table_header( client, "ARG2", "" );
1397 if( ibp->type != 0 )
1399 html_table_row_begin(client, "" );
1401 cyg_handle_t thread = cyg_thread_find(ibp->thread);
1402 cyg_thread_info info;
1404 html_table_data_begin( client, "" );
1405 fprintf( client, "%08x",ibp->timestamp);
1406 html_table_data_begin( client, "" );
1408 cyg_thread_get_info( thread, ibp->thread, &info ) &&
1410 fputs( info.name, client );
1411 else fprintf( client, "[%04x]", ibp->thread);
1412 html_table_data_begin( client, "" );
1413 #if defined(CYGDBG_KERNEL_INSTRUMENT_MSGS)
1414 fprintf( client, "%s", cyg_instrument_msg(ibp->type));
1416 fprintf( client, "%04x", ibp->type );
1418 html_table_data_begin( client, "" );
1419 fprintf( client, "%08x", ibp->arg1);
1420 html_table_data_begin( client, "" );
1421 fprintf( client, "%08x", ibp->arg2);
1423 html_table_row_end( client );
1426 if( ibp == &instrument_buffer[instrument_buffer_size] )
1427 ibp = instrument_buffer;
1429 } while( ibp != instrument_buffer_pointer );
1431 html_table_end( client );
1433 html_para_begin( client, "" );
1435 html_form_input(client, "submit", "cleartable", "Clear Table", "");
1437 html_form_end( client );
1439 draw_navbar(client);
1441 html_body_end(client);
1446 #if defined(CYGDBG_KERNEL_INSTRUMENT_FLAGS) && \
1447 defined(CYGDBG_KERNEL_INSTRUMENT_MSGS)
1452 cyg_scheduler_lock();
1454 struct instrument_desc_s *id = instrument_desc;
1455 CYG_WORD cl = 0, ev = 0;
1457 for( ; id->msg != 0; id++ )
1459 if( id->num > 0xff )
1464 if( (instrument_flags[cl] & (1<<ev)) != 0 )
1465 cyg_instrument_enable( cl<<8, ev );
1469 cyg_scheduler_unlock();
1475 CYG_HTTPD_TABLE_ENTRY( cyg_monitor_instrument_entry,
1476 "/monitor/instrument.htm*",
1477 cyg_monitor_instrument,
1482 /* ================================================================= */
1485 * Define the logo as a byte array, and then define the data structure
1486 * and table entry to allow it to be fetched by the client.
1489 static cyg_uint8 ecos_logo_gif[] = {
1490 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x6f, 0x00, 0x23, 0x00, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00,
1491 0xff, 0xff, 0xff, 0xea, 0x19, 0x00, 0xcc, 0x00, 0x00, 0xfd, 0xfd, 0xfd, 0x83, 0x00, 0x00, 0xf6,
1492 0xf6, 0xf6, 0x2f, 0x2f, 0x2f, 0xef, 0xef, 0xef, 0x19, 0x00, 0x19, 0x45, 0x45, 0x45, 0xbb, 0xbb,
1493 0xbb, 0xe2, 0x3e, 0x3e, 0xe8, 0xbb, 0xd3, 0x3e, 0x3e, 0x3e, 0xfb, 0xfb, 0xfb, 0xbe, 0xbe, 0xbe,
1494 0xf1, 0xed, 0xed, 0xe5, 0x7b, 0x8e, 0xe5, 0x6b, 0x7b, 0xcc, 0xcc, 0xcc, 0x98, 0x95, 0x98, 0xc6,
1495 0xc3, 0xc6, 0x19, 0x19, 0x19, 0xf1, 0xf1, 0xf1, 0x98, 0x98, 0x98, 0xd6, 0xd3, 0xd6, 0x83, 0x83,
1496 0x83, 0xde, 0xde, 0xde, 0xe5, 0x25, 0x25, 0x73, 0x6f, 0x73, 0xea, 0xea, 0xea, 0xe5, 0x8e, 0xa2,
1497 0xe8, 0xe8, 0xe8, 0x7f, 0x7b, 0x7f, 0xe2, 0x56, 0x66, 0x8b, 0x8b, 0x8b, 0x19, 0x19, 0x00, 0xf8,
1498 0xf8, 0xf8, 0x73, 0x73, 0x73, 0xd3, 0xd1, 0xd1, 0x9c, 0x9c, 0x9c, 0x50, 0x50, 0x50, 0xef, 0xce,
1499 0xea, 0x92, 0x8e, 0x92, 0x6f, 0x6f, 0x6f, 0xe2, 0x2f, 0x2f, 0x61, 0x61, 0x61, 0xe5, 0xe5, 0xe5,
1500 0xe8, 0x9f, 0xb8, 0x37, 0x2f, 0x37, 0x66, 0x66, 0x66, 0xe2, 0x4b, 0x50, 0x56, 0x50, 0x56, 0xa9,
1501 0xa5, 0xa9, 0xce, 0xce, 0xce, 0x56, 0x50, 0x50, 0xd9, 0xd9, 0xd9, 0x77, 0x73, 0x77, 0x25, 0x25,
1502 0x2f, 0x6b, 0x6b, 0x6b, 0x9f, 0x9f, 0x9f, 0x87, 0x83, 0x87, 0x3e, 0x37, 0x37, 0xf4, 0xf4, 0xf4,
1503 0x25, 0x25, 0x25, 0xc1, 0xc1, 0xc1, 0x83, 0x7f, 0x83, 0xe5, 0xe2, 0xe2, 0x4b, 0x45, 0x4b, 0xd1,
1504 0xce, 0xd1, 0xaf, 0xac, 0xaf, 0xcc, 0xc9, 0xcc, 0x5b, 0x56, 0x5b, 0xdb, 0xd9, 0xdb, 0x66, 0x61,
1505 0x66, 0xe2, 0xe2, 0xe2, 0xb8, 0xb5, 0xb8, 0x2f, 0x25, 0x2f, 0xc3, 0xc1, 0xc3, 0xe0, 0xde, 0xe0,
1506 0xd3, 0xd3, 0xd3, 0xde, 0xdb, 0xde, 0xac, 0xac, 0xac, 0xce, 0xcc, 0xce, 0x77, 0x6f, 0x73, 0x4b,
1507 0x45, 0x45, 0xc9, 0xc6, 0xc9, 0x45, 0x3e, 0x45, 0x61, 0x5b, 0x61, 0xb5, 0xb2, 0xb5, 0x3e, 0x00,
1508 0x00, 0x8b, 0x87, 0x87, 0x95, 0x92, 0x95, 0xa2, 0x9f, 0xa2, 0xb8, 0xb8, 0xb8, 0x7b, 0x77, 0x7b,
1509 0x9c, 0x98, 0x9c, 0x50, 0x4b, 0x50, 0x6f, 0x6b, 0x6f, 0x6b, 0x66, 0x6b, 0xac, 0xa9, 0xac, 0x8e,
1510 0x8b, 0x8e, 0x8e, 0x00, 0x00, 0xdb, 0xdb, 0xdb, 0xed, 0xed, 0xed, 0x50, 0x4b, 0x4b, 0x3e, 0x37,
1511 0x3e, 0x95, 0x95, 0x95, 0xa5, 0xa2, 0xa5, 0x9f, 0x9c, 0x9f, 0xc1, 0xbe, 0xbe, 0x2f, 0x25, 0x25,
1512 0xd3, 0xd1, 0xd3, 0xf4, 0xf1, 0xf4, 0xc6, 0xc6, 0xc6, 0x8e, 0x8e, 0x8e, 0x25, 0x19, 0x19, 0x66,
1513 0x61, 0x61, 0xb2, 0xaf, 0xb2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1514 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1515 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1516 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1517 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1518 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1519 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1520 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1521 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1522 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1523 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1524 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1525 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1526 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1527 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1528 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1529 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1530 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1531 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1532 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1533 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1534 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1535 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1536 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1537 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1538 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00,
1539 0x00, 0x00, 0x6f, 0x00, 0x23, 0x00, 0x40, 0x08, 0xff, 0x00, 0x03, 0x08, 0x1c, 0x28, 0x10, 0x41,
1540 0x8a, 0x17, 0x0e, 0x1c, 0x00, 0x58, 0xc8, 0xb0, 0xa1, 0xc3, 0x87, 0x10, 0x21, 0x12, 0x14, 0x28,
1541 0xa0, 0xa2, 0xc5, 0x8b, 0x18, 0x33, 0x6a, 0xdc, 0xb8, 0x91, 0x01, 0x83, 0x11, 0x31, 0x26, 0x12,
1542 0x44, 0x10, 0x91, 0xe1, 0x09, 0x91, 0x28, 0x03, 0x4c, 0xb9, 0x50, 0x72, 0xa1, 0x0a, 0x04, 0x29,
1543 0x09, 0x72, 0x6c, 0x10, 0x73, 0xe2, 0x88, 0x8d, 0x2e, 0x0c, 0xd4, 0x0c, 0x70, 0x73, 0x63, 0x80,
1544 0x88, 0x10, 0x76, 0x0a, 0x6d, 0x18, 0x94, 0x60, 0x03, 0x8e, 0x1a, 0x27, 0x4a, 0x40, 0x5a, 0x51,
1545 0xa9, 0xc5, 0x0e, 0x3b, 0x0d, 0x30, 0x40, 0xca, 0x40, 0x45, 0xc9, 0x14, 0x42, 0x45, 0x72, 0x60,
1546 0xf9, 0xf0, 0x64, 0xd6, 0x00, 0x19, 0x3b, 0xe8, 0xfc, 0x3a, 0x70, 0xe9, 0x45, 0x10, 0x59, 0x0d,
1547 0x70, 0x9c, 0x30, 0xf1, 0x44, 0xcb, 0xb7, 0x70, 0x4b, 0x8a, 0x64, 0x4a, 0xb7, 0xae, 0x5d, 0x01,
1548 0x6c, 0x51, 0xbe, 0x88, 0xcb, 0xb7, 0xef, 0xc2, 0xb9, 0x77, 0x03, 0x0b, 0xbe, 0x98, 0x37, 0xc0,
1549 0x81, 0x88, 0x58, 0x09, 0xde, 0xe0, 0xea, 0xf0, 0xc5, 0x44, 0x0e, 0x0f, 0x13, 0x13, 0x34, 0x30,
1550 0x21, 0x23, 0xdb, 0x8c, 0x63, 0x07, 0x4a, 0xcd, 0x88, 0xd6, 0xa9, 0x45, 0x9a, 0x04, 0x69, 0x60,
1551 0xec, 0xc0, 0x94, 0x41, 0x44, 0xaf, 0x03, 0x53, 0xf8, 0xdd, 0xd1, 0x10, 0xf5, 0xc0, 0xa9, 0x76,
1552 0x41, 0x0f, 0x24, 0xcd, 0xb1, 0xf3, 0xc0, 0x9e, 0x1c, 0x25, 0x88, 0xac, 0xac, 0x91, 0x41, 0x00,
1553 0xc8, 0x6f, 0x77, 0x48, 0x9e, 0x78, 0xc3, 0xaa, 0xdf, 0x03, 0x27, 0xa6, 0x40, 0x28, 0x2a, 0x13,
1554 0xe9, 0x08, 0xd9, 0x93, 0x41, 0xd0, 0xe6, 0xd8, 0x41, 0x42, 0x83, 0x15, 0x02, 0x0d, 0x34, 0xe0,
1555 0x8d, 0x34, 0x73, 0x6a, 0xc6, 0x7e, 0xc3, 0x3b, 0xff, 0x04, 0x3c, 0xb8, 0x3c, 0x5d, 0xdb, 0x03,
1556 0xb7, 0xc2, 0x7d, 0x91, 0x02, 0xa6, 0xe2, 0x13, 0xe0, 0xf9, 0x22, 0x3f, 0xe1, 0x9a, 0x22, 0xd3,
1557 0x09, 0xd0, 0x03, 0x18, 0x00, 0x01, 0x9b, 0x2e, 0x48, 0xec, 0x01, 0x34, 0x10, 0xc3, 0x04, 0xd3,
1558 0x69, 0xa4, 0xd3, 0x5e, 0x11, 0x39, 0x46, 0x96, 0x40, 0x53, 0x44, 0xa4, 0x02, 0x59, 0x1a, 0xe5,
1559 0x97, 0x95, 0x68, 0x17, 0xd1, 0x80, 0x92, 0x77, 0xfd, 0x69, 0x34, 0x81, 0x83, 0x6d, 0x25, 0xe4,
1560 0xe1, 0x87, 0x0e, 0x3c, 0x48, 0x90, 0x6a, 0x0c, 0x89, 0x48, 0x10, 0x77, 0x74, 0x85, 0x44, 0x10,
1561 0x6e, 0x11, 0x4e, 0xd4, 0x9f, 0x84, 0x2b, 0x10, 0x68, 0x97, 0x69, 0x10, 0x31, 0x27, 0xd0, 0x72,
1562 0x38, 0xe6, 0xa8, 0x63, 0x8e, 0x44, 0x4d, 0x74, 0xd4, 0x5d, 0x13, 0xa1, 0xe8, 0x13, 0x41, 0x31,
1563 0x60, 0xe4, 0x02, 0x7a, 0x22, 0xa9, 0xd5, 0xd1, 0x61, 0x35, 0x4e, 0x84, 0x80, 0x42, 0x0e, 0x5d,
1564 0x70, 0x83, 0x48, 0xac, 0xf5, 0xe8, 0xa3, 0x46, 0x2e, 0xac, 0x30, 0x9a, 0x48, 0x45, 0x66, 0xc4,
1565 0x80, 0x77, 0x01, 0x74, 0x69, 0x91, 0x75, 0x05, 0x0a, 0x80, 0xa4, 0x59, 0x5e, 0x92, 0x54, 0x92,
1566 0x94, 0x5f, 0x3d, 0xf9, 0x16, 0x09, 0x59, 0x6d, 0x44, 0x03, 0x98, 0x31, 0xfd, 0x48, 0x58, 0x56,
1567 0x20, 0x20, 0x45, 0x90, 0x71, 0xe2, 0xf5, 0x39, 0xde, 0x44, 0xe6, 0x05, 0xea, 0xdf, 0x4e, 0x1c,
1568 0x90, 0xe0, 0x40, 0x95, 0x7e, 0xf2, 0x45, 0x9e, 0xa0, 0xe6, 0x75, 0xc0, 0x80, 0x04, 0x00, 0x0a,
1569 0x85, 0x00, 0x82, 0x89, 0x86, 0xb7, 0x28, 0xa3, 0x82, 0x4e, 0x40, 0x27, 0x41, 0x94, 0x56, 0x2a,
1570 0xde, 0xa5, 0x98, 0x32, 0x5a, 0x58, 0x6a, 0x7d, 0xed, 0x90, 0x10, 0x93, 0x9e, 0x02, 0x00, 0x2a,
1571 0x47, 0x2e, 0x78, 0x14, 0x2a, 0x53, 0xb6, 0x75, 0xff, 0x0a, 0x91, 0x03, 0x53, 0xc6, 0x84, 0x00,
1572 0x09, 0x7c, 0x5d, 0x70, 0x82, 0x7b, 0x29, 0x21, 0x25, 0xc1, 0xa6, 0x03, 0x35, 0x90, 0x61, 0x46,
1573 0x2e, 0x48, 0x18, 0xec, 0xb0, 0x16, 0xb1, 0x45, 0x62, 0x44, 0x70, 0x92, 0xb5, 0x58, 0x49, 0x0a,
1574 0x0a, 0xb5, 0x91, 0xb1, 0x31, 0xa1, 0x79, 0x11, 0xb5, 0x03, 0x69, 0xc9, 0x51, 0x0c, 0x50, 0x3e,
1575 0x74, 0x01, 0xaf, 0x05, 0x9d, 0x80, 0xaa, 0x0a, 0x36, 0x0a, 0x24, 0x2b, 0x00, 0xdf, 0xa2, 0xb4,
1576 0x82, 0x04, 0x13, 0x4c, 0x00, 0x02, 0x80, 0x96, 0xa1, 0xb4, 0x5d, 0xbb, 0x20, 0xd0, 0xa9, 0xe4,
1577 0x98, 0x3e, 0xd2, 0x46, 0x43, 0x03, 0x76, 0x76, 0x24, 0x17, 0x41, 0xea, 0x31, 0x3b, 0x11, 0x9f,
1578 0xe8, 0xa2, 0xe4, 0xc2, 0x46, 0x2c, 0x0a, 0x30, 0xc2, 0x44, 0x06, 0x1c, 0xac, 0x21, 0xc3, 0xd7,
1579 0x4e, 0x24, 0xe6, 0x8c, 0x02, 0x2f, 0xe8, 0x64, 0x43, 0xcd, 0x36, 0x67, 0xd7, 0x44, 0xda, 0x72,
1580 0x64, 0x21, 0x41, 0x68, 0xea, 0x96, 0xd2, 0x76, 0x74, 0xd1, 0xf8, 0x50, 0xb9, 0x16, 0xff, 0xc4,
1581 0x50, 0xb9, 0xfd, 0x32, 0xe5, 0x42, 0x90, 0x74, 0x5d, 0x69, 0xd1, 0xc2, 0x3b, 0x21, 0x6b, 0x91,
1582 0xc9, 0x0e, 0x65, 0x2c, 0x10, 0xaa, 0xe2, 0x4d, 0xc1, 0x71, 0x60, 0x32, 0xb3, 0xea, 0x59, 0x46,
1583 0x20, 0x6d, 0x6a, 0xb3, 0x00, 0x38, 0x37, 0xb4, 0x83, 0x48, 0xdd, 0x46, 0x09, 0x62, 0x42, 0x4a,
1584 0x8b, 0xd4, 0x31, 0xb1, 0x18, 0x89, 0x1c, 0x2c, 0x47, 0xbe, 0x01, 0x7a, 0xde, 0xd0, 0x18, 0x31,
1585 0xd0, 0x74, 0x43, 0x0e, 0xa0, 0x34, 0x85, 0x0a, 0x87, 0x39, 0x40, 0x02, 0xb8, 0x02, 0xe1, 0xea,
1586 0x50, 0xd8, 0x49, 0x4a, 0x00, 0x1b, 0x0d, 0x9d, 0x71, 0x96, 0xe4, 0x04, 0x53, 0x75, 0x00, 0x37,
1587 0x4a, 0x05, 0x42, 0xa5, 0x9f, 0xdb, 0x15, 0x8d, 0x61, 0x2a, 0xd0, 0xd1, 0x0c, 0x2c, 0x0b, 0x51,
1588 0xad, 0x6d, 0xf2, 0xec, 0xd0, 0x70, 0x35, 0x61, 0x69, 0x71, 0xcb, 0x7a, 0x0b, 0x65, 0x2d, 0x46,
1589 0x21, 0x11, 0x0c, 0x91, 0xce, 0x29, 0x41, 0x80, 0x68, 0x4b, 0x0e, 0xa0, 0xac, 0x35, 0x96, 0xd8,
1590 0x96, 0xd5, 0x51, 0xe7, 0x8f, 0x63, 0x44, 0x73, 0x00, 0x6e, 0xc5, 0xa5, 0x02, 0x09, 0xa8, 0x93,
1591 0xf0, 0xc2, 0xe5, 0x7e, 0xae, 0x1a, 0xd6, 0x08, 0x12, 0xc4, 0x2e, 0x01, 0x85, 0xaf, 0x66, 0x64,
1592 0x75, 0x41, 0x5f, 0xa7, 0xaa, 0xe8, 0xe6, 0xb5, 0x0b, 0x3a, 0x3a, 0x4a, 0x37, 0xe4, 0xae, 0xfb,
1593 0xbf, 0x1a, 0xf7, 0x3e, 0x18, 0x0d, 0x91, 0x0e, 0x14, 0x10, 0x00, 0x3b
1596 CYG_HTTPD_DATA( cyg_monitor_ecos_logo_data,
1598 sizeof(ecos_logo_gif), ecos_logo_gif );
1600 CYG_HTTPD_TABLE_ENTRY( cyg_monitor_ecos_logo,
1601 "/monitor/ecos.gif",
1602 cyg_httpd_send_data,
1603 &cyg_monitor_ecos_logo_data );
1605 /*------------------------------------------------------------------ */
1606 /* end of monitor.c */