diff -urw --new-file net-1.0b1-orig/net/tcpip/v1_0b1/cdl/net.cdl net-1.0b1/net/tcpip/v1_0b1/cdl/net.cdl --- net-1.0b1-orig/net/tcpip/v1_0b1/cdl/net.cdl Mon May 29 12:32:37 2000 +++ net-1.0b1/net/tcpip/v1_0b1/cdl/net.cdl Mon May 29 12:55:33 2000 @@ -259,7 +259,7 @@ display "Build networking tests (demo programs)" flavor bool no_define - default_value 0 + default_value 1 description " This option enables the building of the network tests which at this time are just demos." @@ -276,7 +276,13 @@ tests/nc_test_master \ tests/nc_test_slave \ tests/tcp_echo \ - tests/ping_test" : "" } + tests/tcp_source \ + tests/tcp_sink \ + tests/ping_test \ + tests/ping_lo_test \ + tests/tcp_lo_test \ + tests/udp_lo_test \ + tests/tcp_lo_select" : "" } description " This option specifies the set of tests for the networking package." } diff -urw --new-file net-1.0b1-orig/net/tcpip/v1_0b1/include/network.h net-1.0b1/net/tcpip/v1_0b1/include/network.h --- net-1.0b1-orig/net/tcpip/v1_0b1/include/network.h Mon May 29 12:32:41 2000 +++ net-1.0b1/net/tcpip/v1_0b1/include/network.h Mon May 29 12:42:24 2000 @@ -42,7 +42,7 @@ //#####DESCRIPTIONBEGIN#### // // Author(s): gthomas -// Contributors: gthomas +// Contributors: gthomas,sorin // Date: 2000-01-10 // Purpose: // Description: @@ -86,6 +86,7 @@ #endif extern void init_all_network_interfaces(void); +extern cyg_bool_t init_loopback_interface(void); /* Added by sorin@netappi.com */ extern void route_reinit(void); extern void perror(const char *); diff -urw --new-file net-1.0b1-orig/net/tcpip/v1_0b1/src/lib/network_support.c net-1.0b1/net/tcpip/v1_0b1/src/lib/network_support.c --- net-1.0b1-orig/net/tcpip/v1_0b1/src/lib/network_support.c Mon May 29 12:32:42 2000 +++ net-1.0b1/net/tcpip/v1_0b1/src/lib/network_support.c Mon May 29 12:43:15 2000 @@ -42,7 +42,7 @@ //#####DESCRIPTIONBEGIN#### // // Author(s): gthomas -// Contributors: gthomas +// Contributors: gthomas, sorin@netappi.com // Date: 2000-01-10 // Purpose: // Description: @@ -89,7 +89,7 @@ #define string(s) _string(s) #if defined(CYGHWR_NET_DRIVER_ETH0_ADDRS_IP) \ - || defined(CYGHWR_NET_DRIVER_ETH1_ADDRS_IP) + || defined(CYGHWR_NET_DRIVER_ETH1_ADDRS_IP) || 1 // // Internal function which builds up a fake BOOTP database for // an interface. @@ -218,4 +218,80 @@ } #endif #endif +} + +// +// Initialize loopback interface ---------- Added by sorin@netappi.com +// + +cyg_bool_t init_loopback_interface(void) +{ +struct sockaddr_in *addrp; +struct ifreq ifr; +int s; +int one = 1; +struct ecos_rtentry route; +struct in_addr netmask, gateway; + +diag_printf("Init_loopback_interface\n"); + s = socket(AF_INET, SOCK_DGRAM, 0); + if (s < 0) { + perror("socket"); + return false; + } + if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, &one, sizeof(one))) { + perror("setsockopt"); + return false; + } + + addrp = (struct sockaddr_in *) &ifr.ifr_addr; + memset(addrp, 0, sizeof(*addrp)); + addrp->sin_family = AF_INET; + addrp->sin_len = sizeof(*addrp); + addrp->sin_port = 0; + addrp->sin_addr.s_addr = htonl(INADDR_LOOPBACK) ; + + strcpy(ifr.ifr_name, "los0"); + if (ioctl(s, SIOCSIFADDR, &ifr)) { + perror("SIOCIFADDR"); + return false; + } + + netmask.s_addr = 0xffffff00; + if (ioctl(s, SIOCSIFNETMASK, &ifr)) { + perror("SIOCSIFNETMASK"); + return false; + } + ifr.ifr_flags = IFF_UP | IFF_BROADCAST | IFF_RUNNING; + if (ioctl(s, SIOCSIFFLAGS, &ifr)) { + perror("SIOCSIFFLAGS"); + return false; + } + + gateway.s_addr = htonl(INADDR_LOOPBACK); + memset(&route, 0, sizeof(route)); + addrp->sin_family = AF_INET; + addrp->sin_port = 0; + addrp->sin_addr.s_addr = 0x7f000001 & *(unsigned int *)&netmask; + memcpy(&route.rt_dst, addrp, sizeof(*addrp)); + addrp->sin_addr = netmask; + memcpy(&route.rt_genmask, addrp, sizeof(*addrp)); + addrp->sin_addr = gateway; + memcpy(&route.rt_gateway, addrp, sizeof(*addrp)); + + route.rt_dev = ifr.ifr_name; + route.rt_flags = RTF_UP|RTF_GATEWAY; + route.rt_metric = 0; + + if (ioctl(s, SIOCADDRT, &route)) { +diag_printf("Route - dst: %s", inet_ntoa(((struct sockaddr_in *)&route.rt_dst)->sin_addr)); +diag_printf(", mask: %s", inet_ntoa(((struct sockaddr_in *)&route.rt_genmask)->sin_addr)); +diag_printf(", gateway: %s\n", inet_ntoa(((struct sockaddr_in *)&route.rt_gateway)->sin_addr)); + if (errno != EEXIST) { + perror("SIOCADDRT 3"); + return false; + } + } + close(s); + return true; } diff -urw --new-file net-1.0b1-orig/net/tcpip/v1_0b1/src/sys/net/if_loop.c net-1.0b1/net/tcpip/v1_0b1/src/sys/net/if_loop.c --- net-1.0b1-orig/net/tcpip/v1_0b1/src/sys/net/if_loop.c Mon May 29 12:32:43 2000 +++ net-1.0b1/net/tcpip/v1_0b1/src/sys/net/if_loop.c Mon May 29 12:42:18 2000 @@ -199,6 +199,20 @@ #include #endif +#include + +int loioctl (register struct ifnet *, u_long, caddr_t); +void lortrequest (int, struct rtentry *, struct sockaddr *); + +void loopattach (int); +bool loop_init (struct cyg_netdevtab_entry *); + +int looutput (struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, struct rtentry *rt); + +int if_simloop( struct ifnet *, register struct mbuf *, struct sockaddr *, register struct rtentry *); + + + #if defined(LARGE_LOMTU) #define LOMTU (131072 + MHLEN + MLEN) #else @@ -211,16 +225,25 @@ struct ifnet loif[NLOOP]; +NETDEVTAB_ENTRY(loop_netdev,"los0",loop_init,&loif); + +bool +loop_init(tab) + struct cyg_netdevtab_entry *tab; +{ +loopattach(1); +return true; +} + void loopattach(n) int n; { register int i; register struct ifnet *ifp; - for (i = NLOOP; i--; ) { ifp = &loif[i]; - sprintf(ifp->if_xname, "lo%d", i); + sprintf(ifp->if_xname, "los%d", i); ifp->if_softc = NULL; ifp->if_mtu = LOMTU; ifp->if_flags = IFF_LOOPBACK | IFF_MULTICAST; @@ -243,6 +266,41 @@ struct sockaddr *dst; register struct rtentry *rt; { + if ((m->m_flags & M_PKTHDR) == 0) + panic("looutput no HDR"); + + if (rt && rt->rt_flags & (RTF_REJECT|RTF_BLACKHOLE)) { + m_freem(m); + return (rt->rt_flags & RTF_BLACKHOLE ? 0 : + rt->rt_flags & RTF_HOST ? EHOSTUNREACH : ENETUNREACH); + } + ifp->if_opackets++; + ifp->if_obytes += m->m_pkthdr.len; +#if 1 /* XXX */ + switch (dst->sa_family) { + case AF_INET: + case AF_IPX: + case AF_NS: + case AF_ISO: + case AF_APPLETALK: + break; + default: + printf("looutput: af=%d unexpected", dst->sa_family); + m_freem(m); + return (EAFNOSUPPORT); + } +#endif + return(if_simloop(ifp, m, dst, 0)); +} + + +int +if_simloop(ifp, m, dst, rt) + struct ifnet *ifp; + register struct mbuf *m; + struct sockaddr *dst; + register struct rtentry *rt; +{ int s, isr; register struct ifqueue *ifq = 0; @@ -406,7 +464,6 @@ struct rtentry *rt; struct sockaddr *sa; { - if (rt) rt->rt_rmx.rmx_mtu = LOMTU; } diff -urw --new-file net-1.0b1-orig/net/tcpip/v1_0b1/src/sys/netinet/if_ether.c net-1.0b1/net/tcpip/v1_0b1/src/sys/netinet/if_ether.c --- net-1.0b1-orig/net/tcpip/v1_0b1/src/sys/netinet/if_ether.c Mon May 29 12:32:43 2000 +++ net-1.0b1/net/tcpip/v1_0b1/src/sys/netinet/if_ether.c Mon May 29 12:42:18 2000 @@ -148,7 +148,7 @@ static struct llinfo_arp *arplookup __P((u_int32_t, int, int)); static void in_arpinput __P((struct mbuf *)); -extern struct ifnet loif; +extern struct ifnet loif[]; LIST_HEAD(, llinfo_arp) llinfo_arp; struct ifqueue arpintrq = {0, 0, 0, 50}; int arp_inuse, arp_allocated, arp_intimer; diff -urw --new-file net-1.0b1-orig/net/tcpip/v1_0b1/src/sys/netinet/ip_input.c net-1.0b1/net/tcpip/v1_0b1/src/sys/netinet/ip_input.c --- net-1.0b1-orig/net/tcpip/v1_0b1/src/sys/netinet/ip_input.c Mon May 29 12:32:43 2000 +++ net-1.0b1/net/tcpip/v1_0b1/src/sys/netinet/ip_input.c Mon May 29 12:42:18 2000 @@ -260,7 +260,6 @@ register int i; const u_int16_t defbaddynamicports_tcp[] = DEFBADDYNAMICPORTS_TCP; const u_int16_t defbaddynamicports_udp[] = DEFBADDYNAMICPORTS_UDP; - pr = pffindproto(PF_INET, IPPROTO_RAW, SOCK_RAW); if (pr == 0) panic("ip_init"); diff -urw --new-file net-1.0b1-orig/net/tcpip/v1_0b1/tests/ping_lo_test.c net-1.0b1/net/tcpip/v1_0b1/tests/ping_lo_test.c --- net-1.0b1-orig/net/tcpip/v1_0b1/tests/ping_lo_test.c Thu Jan 1 02:00:00 1970 +++ net-1.0b1/net/tcpip/v1_0b1/tests/ping_lo_test.c Mon May 29 12:42:19 2000 @@ -0,0 +1,257 @@ +//========================================================================== +// +// tests/ping_test.c +// +// Simple test of PING (ICMP) and networking support +// +//========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//####BSDCOPYRIGHTBEGIN#### +// +// ------------------------------------------- +// +// Portions of this software may have been derived from OpenBSD or other sources, +// and are covered by the appropriate copyright disclaimers included herein. +// +// ------------------------------------------- +// +//####BSDCOPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): gthomas, sorin@netappi.com +// Contributors: gthomas, sorin@netappi.com +// Date: 2000-01-10 +// Purpose: +// Description: +// +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +// PING test code + +#include + +#define STACK_SIZE CYGNUM_HAL_STACK_SIZE_TYPICAL +static char stack[STACK_SIZE]; +static cyg_thread thread_data; +static cyg_handle_t thread_handle; + +#define NUM_PINGS 16 +#define MAX_PACKET 4096 +static unsigned char pkt1[MAX_PACKET], pkt2[MAX_PACKET]; + +#define UNIQUEID 0x1234 + +void +cyg_test_exit(void) +{ + diag_printf("... Done\n"); + while (1) ; +} + +void +pexit(char *s) +{ + perror(s); + cyg_test_exit(); +} + +// Compute INET checksum +int +inet_cksum(u_short *addr, int len) +{ + register int nleft = len; + register u_short *w = addr; + register u_short answer; + register u_int sum = 0; + u_short odd_byte = 0; + + /* + * Our algorithm is simple, using a 32 bit accumulator (sum), + * we add sequential 16 bit words to it, and at the end, fold + * back all the carry bits from the top 16 bits into the lower + * 16 bits. + */ + while( nleft > 1 ) { + sum += *w++; + nleft -= 2; + } + + /* mop up an odd byte, if necessary */ + if( nleft == 1 ) { + *(u_char *)(&odd_byte) = *(u_char *)w; + sum += odd_byte; + } + + /* + * add back carry outs from top 16 bits to low 16 bits + */ + sum = (sum >> 16) + (sum & 0x0000ffff); /* add hi 16 to low 16 */ + sum += (sum >> 16); /* add carry */ + answer = ~sum; /* truncate to 16 bits */ + return (answer); +} + +static int +show_icmp(unsigned char *pkt, int len, + struct sockaddr_in *from, struct sockaddr_in *to) +{ + cyg_tick_count_t *tp, tv; + struct ip *ip; + struct icmp *icmp; + tv = cyg_current_time(); + ip = (struct ip *)pkt; + if ((len < sizeof(*ip)) || ip->ip_v != IPVERSION) { + diag_printf("%s: Short packet or not IP! - Len: %d, Version: %d\n", + inet_ntoa(from->sin_addr), len, ip->ip_v); + return 0; + } + icmp = (struct icmp *)(pkt + sizeof(*ip)); + len -= (sizeof(*ip) + 8); + tp = (cyg_tick_count_t *)&icmp->icmp_data; + if (icmp->icmp_type != ICMP_ECHOREPLY) { + diag_printf("%s: Invalid ICMP - type: %d\n", + inet_ntoa(from->sin_addr), icmp->icmp_type); + return 0; + } + if (icmp->icmp_id != UNIQUEID) { + diag_printf("%s: ICMP received for wrong id - sent: %x, recvd: %x\n", + inet_ntoa(from->sin_addr), UNIQUEID, icmp->icmp_id); + } + diag_printf("%d bytes from %s: ", len, inet_ntoa(from->sin_addr)); + diag_printf("icmp_seq=%d", icmp->icmp_seq); + diag_printf(", time=%dms\n", (int)(tv - *tp)*10); + return (from->sin_addr.s_addr == to->sin_addr.s_addr); +} + +static void +ping_host(int s, struct sockaddr_in *host) +{ + struct icmp *icmp = (struct icmp *)pkt1; + int icmp_len = 64; + int seq, ok_recv, bogus_recv; + cyg_tick_count_t *tp; + long *dp; + struct sockaddr_in from; + int i, len, fromlen; + + ok_recv = 0; + bogus_recv = 0; + diag_printf("PING server %s\n", inet_ntoa(host->sin_addr)); + for (seq = 0; seq < NUM_PINGS; seq++) { + // Build ICMP packet + icmp->icmp_type = ICMP_ECHO; + icmp->icmp_code = 0; + icmp->icmp_cksum = 0; + icmp->icmp_seq = seq; + icmp->icmp_id = 0x1234; + // Set up ping data + tp = (cyg_tick_count_t *)&icmp->icmp_data; + *tp++ = cyg_current_time(); + dp = (long *)tp; + for (i = sizeof(*tp); i < icmp_len; i += sizeof(*dp)) { + *dp++ = i; + } + // Add checksum + icmp->icmp_cksum = inet_cksum( (u_short *)icmp, icmp_len+8); + // Send it off + if (sendto(s, icmp, icmp_len+8, 0, (struct sockaddr *)host, sizeof(*host)) < 0) { + perror("sendto"); + continue; + } + // Wait for a response + fromlen = sizeof(from); + len = recvfrom(s, pkt2, sizeof(pkt2), 0, (struct sockaddr *)&from, &fromlen); + if (len < 0) { + perror("recvfrom"); + } else { + if (show_icmp(pkt2, len, &from, host)) { + ok_recv++; + } else { + bogus_recv++; + } + } + } + diag_printf("Sent %d packets, received %d OK, %d bad\n", NUM_PINGS, ok_recv, bogus_recv); +} + +static void +ping_test_loopback(void) +{ + struct protoent *p; + struct timeval tv; + struct sockaddr_in host; + int s; + + if ((p = getprotobyname("icmp")) == (struct protoent *)0) { + perror("getprotobyname"); + return; + } + s = socket(AF_INET, SOCK_RAW, p->p_proto); + if (s < 0) { + perror("socket"); + return; + } + tv.tv_sec = 1; + tv.tv_usec = 0; + setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); + // Set up host address + host.sin_family = AF_INET; + host.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + host.sin_port = 0; + ping_host(s, &host); + // Now try a bogus host + host.sin_addr.s_addr = htonl(ntohl(host.sin_addr.s_addr) + 32); + ping_host(s, &host); +} + +void +net_test(cyg_addrword_t p) +{ + diag_printf("Start PING test\n"); + init_loopback_interface(); + ping_test_loopback(); + cyg_test_exit(); +} + +void +cyg_start(void) +{ + // Create a main thread, so we can run the scheduler and have time 'pass' + cyg_thread_create(10, // Priority - just a number + net_test, // entry + 0, // entry parameter + "Network test", // Name + &stack[0], // Stack + STACK_SIZE, // Size + &thread_handle, // Handle + &thread_data // Thread data structure + ); + cyg_thread_resume(thread_handle); // Start it + cyg_scheduler_start(); +} diff -urw --new-file net-1.0b1-orig/net/tcpip/v1_0b1/tests/tcp_lo_select.c net-1.0b1/net/tcpip/v1_0b1/tests/tcp_lo_select.c --- net-1.0b1-orig/net/tcpip/v1_0b1/tests/tcp_lo_select.c Thu Jan 1 02:00:00 1970 +++ net-1.0b1/net/tcpip/v1_0b1/tests/tcp_lo_select.c Mon May 29 12:42:19 2000 @@ -0,0 +1,305 @@ +//========================================================================== +// +// tests/tcp_lo_test.c +// +// Simple TCP throughput test +// +//========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//####BSDCOPYRIGHTBEGIN#### +// +// ------------------------------------------- +// +// Portions of this software may have been derived from OpenBSD or other sources +// and are covered by the appropriate copyright disclaimers included herein. +// +// ------------------------------------------- +// +//####BSDCOPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): sorin@netappi.com +// Contributors: gthomas,sorin@netappi.com +// Date: 2000-05-24 + + +// Network throughput test code + +#include + +#define SOURCE_PORT1 9990 +#define SOURCE_PORT2 9991 + +#define NUM_BUF 1024 +#define MAX_BUF 8192 +static unsigned char data_buf1[MAX_BUF]; +static unsigned char data_buf2[MAX_BUF]; +static unsigned char data_buf_write1[MAX_BUF]="Client 1 is alive. You may continue ...."; +static unsigned char data_buf_write2[MAX_BUF]="Client 2 is alive. You may continue ...."; + + + +#define STACK_SIZE CYGNUM_HAL_STACK_SIZE_TYPICAL +static char stack_server[STACK_SIZE]; +static cyg_thread server_thread_data; +static cyg_handle_t server_thread_handle; + +static char stack_client1[STACK_SIZE]; +static cyg_thread client1_thread_data; +static cyg_handle_t client1_thread_handle; + +static char stack_client2[STACK_SIZE]; +static cyg_thread client2_thread_data; +static cyg_handle_t client2_thread_handle; + + +#define MAIN_THREAD_PRIORITY CYGPKG_NET_THREAD_PRIORITY-2 + +void +cyg_test_exit(void) +{ + diag_printf("... Done\n"); + while (1) ; +} + +void +pexit(char *s) +{ + perror(s); + cyg_test_exit(); +} + + +void server(void) +{ + int s_s1, e_s1, s_s2, e_s2; + struct sockaddr_in e_s1_addr,e_s2_addr,local; + fd_set in_fds; + int len; + int num; + + char *hello_string=" Hello eCos network \n"; + diag_printf("TCP SERVER:"); + diag_printf(hello_string); + + s_s1 = socket(AF_INET, SOCK_STREAM, 0); + if (s_s1 < 0) { + pexit("stream socket"); + } + memset(&local, 0, sizeof(local)); + local.sin_family = AF_INET; + local.sin_len = sizeof(local); + local.sin_port = ntohs(SOURCE_PORT1); + local.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + if(bind(s_s1, (struct sockaddr *) &local, sizeof(local)) < 0) { + pexit("bind /source_1/ error"); + } + listen(s_s1, SOMAXCONN); + + s_s2 = socket(AF_INET, SOCK_STREAM, 0); + if (s_s2 < 0) { + pexit("stream socket"); + } + memset(&local, 0, sizeof(local)); + local.sin_family = AF_INET; + local.sin_len = sizeof(local); + local.sin_port = ntohs(SOURCE_PORT2); + local.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + if(bind(s_s2, (struct sockaddr *) &local, sizeof(local)) < 0) { + pexit("bind /source_2/ error"); + } + listen(s_s2, SOMAXCONN); + + + e_s1 = 0; e_s2 = 0; + + + while (true) { + FD_ZERO(&in_fds); + FD_SET(s_s1, &in_fds); + FD_SET(s_s2, &in_fds); + num = select ( max(s_s1,s_s2)+1, &in_fds,0,0,0); + if (FD_ISSET(s_s1,&in_fds)) { + len = sizeof(e_s1_addr); + if ((e_s1 = accept(s_s1,(struct sockaddr *)&e_s1_addr,&len))<0) + { + pexit("accept /source_1/"); + } + diag_printf("TCP SERVER connection from %s: %d\n", + inet_ntoa(e_s1_addr.sin_addr),ntohs(e_s1_addr.sin_port)); + } + if (FD_ISSET(s_s2,&in_fds)) { + len = sizeof(e_s2_addr); + if ((e_s2 = accept(s_s2,(struct sockaddr *)&e_s2_addr,&len))<0) + { + pexit("accept /source_2/"); + } + diag_printf("TCP SERVER connection from %s:%d\n", + inet_ntoa(e_s2_addr.sin_addr), ntohs(e_s2_addr.sin_port)); + } + + if ((e_s1 != 0) && ( e_s2 != 0)) { + break; + } + + } /* while (true) */ + + if ((len = read(e_s1, data_buf1, MAX_BUF)) < 0 ) + { + perror("I/O error"); + } + diag_printf("SERVER : %s\n",data_buf1); + + if ((len = read(e_s2, data_buf2, MAX_BUF)) < 0 ) + { + perror("I/O error"); + } + diag_printf("SERVER : %s\n",data_buf2); + +} + +void client1(void) +{ + int s_source; + struct sockaddr_in local; + int len; + + diag_printf("client 1 :started\n"); + + s_source = socket(AF_INET, SOCK_STREAM, 0); + if (s_source < 0) { + pexit("stream socket"); + } + memset(&local, 0, sizeof(local)); + local.sin_family = AF_INET; + local.sin_port = htons(SOURCE_PORT1); + local.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + + if (connect(s_source, (struct sockaddr *)&local, sizeof(local)) < 0) { + pexit("Can't connect to target"); + } + + if ((len = write(s_source,data_buf_write1,40)) < 0) + { + diag_printf("Error writing buffer\n"); + } +} + +void client2(void) +{ + int s_source; + struct sockaddr_in local; + int len; + + diag_printf("client 2 :started\n"); + + s_source = socket(AF_INET, SOCK_STREAM, 0); + if (s_source < 0) { + pexit("stream socket"); + } + memset(&local, 0, sizeof(local)); + local.sin_family = AF_INET; + local.sin_port = htons(SOURCE_PORT2); + local.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + + if (connect(s_source, (struct sockaddr *)&local, sizeof(local)) < 0) { + pexit("Can't connect to target"); + } + + if ((len = write(s_source,data_buf_write2,40)) < 0) + { + diag_printf("Error writing buffer\n"); + } +} + + +void +tcp_server(cyg_addrword_t param) +{ + diag_printf("Start TCP server - test\n"); + server(); + cyg_test_exit(); +} + +void +tcp_client_1(cyg_addrword_t param) +{ + diag_printf("Start TCP client 1 - test\n"); + client1(); +} + +void +tcp_client_2(cyg_addrword_t param) +{ + diag_printf("Start TCP client 2 - test\n"); + client2(); +} + + +void +cyg_start(void) +{ + int i; + init_loopback_interface(); + cyg_thread_create(MAIN_THREAD_PRIORITY, // Priority + tcp_server, // entry + 0, // entry parameter + "Network TCP test", // Name + &stack_server[0], // Stack + STACK_SIZE, // Size + &server_thread_handle, // Handle + &server_thread_data // Thread data structure + ); + cyg_thread_resume(server_thread_handle); // Start it + + cyg_thread_create(MAIN_THREAD_PRIORITY, // Priority + tcp_client_1, // entry + 0, // entry parameter + "Network TCP test", // Name + &stack_client1[0], // Stack + STACK_SIZE, // Size + &client1_thread_handle, // Handle + &client1_thread_data // Thread data structure + ); + cyg_thread_resume(client1_thread_handle); // Start it + + cyg_thread_create(MAIN_THREAD_PRIORITY, // Priority + tcp_client_2, // entry + 0, // entry parameter + "Network TCP test", // Name + &stack_client2[0], // Stack + STACK_SIZE, // Size + &client2_thread_handle, // Handle + &client2_thread_data // Thread data structure + ); + cyg_thread_resume(client2_thread_handle); // Start it + + + cyg_scheduler_start(); +} + + + diff -urw --new-file net-1.0b1-orig/net/tcpip/v1_0b1/tests/tcp_lo_test.c net-1.0b1/net/tcpip/v1_0b1/tests/tcp_lo_test.c --- net-1.0b1-orig/net/tcpip/v1_0b1/tests/tcp_lo_test.c Thu Jan 1 02:00:00 1970 +++ net-1.0b1/net/tcpip/v1_0b1/tests/tcp_lo_test.c Mon May 29 12:42:19 2000 @@ -0,0 +1,218 @@ +//========================================================================== +// +// tests/tcp_lo_test.c +// +// Simple TCP throughput test +// +//========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//####BSDCOPYRIGHTBEGIN#### +// +// ------------------------------------------- +// +// Portions of this software may have been derived from OpenBSD or other sources +// and are covered by the appropriate copyright disclaimers included herein. +// +// ------------------------------------------- +// +//####BSDCOPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): sorin@netappi.com +// Contributors: gthomas,sorin@netappi.com +// Date: 2000-05-24 + + +// Network throughput test code + +#include + +#define SOURCE_PORT 9990 +#define SINK_PORT 9991 + +#define NUM_BUF 1024 +#define MAX_BUF 8192 +static unsigned char data_buf[MAX_BUF]; +static unsigned char data_buf_write[MAX_BUF]="Client is alive. You may continue ...."; + +#define STACK_SIZE CYGNUM_HAL_STACK_SIZE_TYPICAL +static char stack_server[STACK_SIZE]; +static cyg_thread server_thread_data; +static cyg_handle_t server_thread_handle; + +static char stack_client[STACK_SIZE]; +static cyg_thread client_thread_data; +static cyg_handle_t client_thread_handle; + + +#define MAIN_THREAD_PRIORITY CYGPKG_NET_THREAD_PRIORITY-2 + +void +cyg_test_exit(void) +{ + diag_printf("... Done\n"); + while (1) ; +} + +void +pexit(char *s) +{ + perror(s); + cyg_test_exit(); +} + + +void server(void) +{ + int s_source, e_source; + struct sockaddr_in e_source_addr, local; + int one = 1; + fd_set in_fds; + int len; + + char *hello_string=" Hello eCos network \n"; + diag_printf("TCP SERVER:"); + diag_printf(hello_string); + + s_source = socket(AF_INET, SOCK_STREAM, 0); + if (s_source < 0) { + pexit("stream socket"); + } + memset(&local, 0, sizeof(local)); + local.sin_family = AF_INET; + local.sin_len = sizeof(local); + local.sin_port = ntohs(SOURCE_PORT); + local.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + if(bind(s_source, (struct sockaddr *) &local, sizeof(local)) < 0) { + pexit("bind /source/ error"); + } + if (setsockopt(s_source, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one))) { + pexit("setsockopt /source/ SO_REUSEADDR"); + } + if (setsockopt(s_source, SOL_SOCKET, SO_REUSEPORT, &one, sizeof(one))) { + pexit("setsockopt /source/ SO_REUSEPORT"); + } + listen(s_source, SOMAXCONN); + + e_source = 0; + while (true) { + FD_ZERO(&in_fds); + FD_SET(s_source, &in_fds); + if ((e_source = accept(s_source,(struct sockaddr *)&e_source_addr,&len))<0) { + pexit("accept /source/"); + } + diag_printf("TCP SERVER connection from %s: %d\n", + inet_ntoa(e_source_addr.sin_addr),ntohs(e_source_addr.sin_port)); + + if (e_source != 0) { + break; + } + } /* while (true) */ + + if ((len = read(e_source, data_buf, MAX_BUF)) < 0 ) + { + perror("I/O error"); + } + diag_printf("SERVER : %s\n",data_buf); + +} + +void client(void) +{ + int s_source; + struct sockaddr_in local; + int one = 1; + int len; + + diag_printf("client:started\n"); + + s_source = socket(AF_INET, SOCK_STREAM, 0); + if (s_source < 0) { + pexit("stream socket"); + } + memset(&local, 0, sizeof(local)); + local.sin_family = AF_INET; + local.sin_port = htons(SOURCE_PORT); + local.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + + if (connect(s_source, (struct sockaddr *)&local, sizeof(local)) < 0) { + pexit("Can't connect to target"); + } + + if ((len = write(s_source,data_buf_write,40)) < 0) + { + diag_printf("Error writing buffer\n"); + } +} + +void +tcp_server(cyg_addrword_t param) +{ + diag_printf("Start TCP server - test\n"); + server(); + cyg_test_exit(); +} + +void +tcp_client(cyg_addrword_t param) +{ + diag_printf("Start TCP client - test\n"); + client(); +} + + + +void +cyg_start(void) +{ + int i; + init_loopback_interface(); + cyg_thread_create(MAIN_THREAD_PRIORITY, // Priority + tcp_server, // entry + 0, // entry parameter + "Network TCP test", // Name + &stack_server[0], // Stack + STACK_SIZE, // Size + &server_thread_handle, // Handle + &server_thread_data // Thread data structure + ); + cyg_thread_resume(server_thread_handle); // Start it + + cyg_thread_create(MAIN_THREAD_PRIORITY, // Priority + tcp_client, // entry + 0, // entry parameter + "Network TCP test", // Name + &stack_client[0], // Stack + STACK_SIZE, // Size + &client_thread_handle, // Handle + &client_thread_data // Thread data structure + ); + cyg_thread_resume(client_thread_handle); // Start it + cyg_scheduler_start(); +} + + + diff -urw --new-file net-1.0b1-orig/net/tcpip/v1_0b1/tests/udp_lo_test.c net-1.0b1/net/tcpip/v1_0b1/tests/udp_lo_test.c --- net-1.0b1-orig/net/tcpip/v1_0b1/tests/udp_lo_test.c Thu Jan 1 02:00:00 1970 +++ net-1.0b1/net/tcpip/v1_0b1/tests/udp_lo_test.c Mon May 29 12:42:19 2000 @@ -0,0 +1,191 @@ +//========================================================================== +// +// tests/udp_lo_test.c +// +// Simple UDP throughput test +// +//========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//####BSDCOPYRIGHTBEGIN#### +// +// ------------------------------------------- +// +// Portions of this software may have been derived from OpenBSD or other sources +// and are covered by the appropriate copyright disclaimers included herein. +// +// ------------------------------------------- +// +//####BSDCOPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): sorin@netappi.com +// Contributors: gthomas,sorin@netappi.com +// Date: 2000-05-24 + + +// Network throughput test code + +#include + +#define SOURCE_PORT 9990 +#define SINK_PORT 9991 + +#define NUM_BUF 1024 +#define MAX_BUF 8192 +static unsigned char data_buf[MAX_BUF]; +static unsigned char data_buf_write[MAX_BUF]="Client UDP is alive. You may continue ...."; + +#define STACK_SIZE CYGNUM_HAL_STACK_SIZE_TYPICAL +static char stack_server[STACK_SIZE]; +static cyg_thread server_thread_data; +static cyg_handle_t server_thread_handle; + +static char stack_client[STACK_SIZE]; +static cyg_thread client_thread_data; +static cyg_handle_t client_thread_handle; + + +#define MAIN_THREAD_PRIORITY CYGPKG_NET_THREAD_PRIORITY-2 + +void +cyg_test_exit(void) +{ + diag_printf("... Done\n"); + while (1) ; +} + +void +pexit(char *s) +{ + perror(s); + cyg_test_exit(); +} + + +void server(void) +{ + int s_source; + struct sockaddr_in local,c_addr; + int one = 1, c_len; + int len; + + char *hello_string=" Hello eCos network \n"; + diag_printf("UDP SERVER:"); + diag_printf(hello_string); + + s_source = socket(AF_INET, SOCK_DGRAM, 0); + if (s_source < 0) { + pexit("stream socket"); + } + memset(&local, 0, sizeof(local)); + local.sin_family = AF_INET; + local.sin_len = sizeof(local); + local.sin_port = ntohs(SOURCE_PORT); + local.sin_addr.s_addr = htonl(INADDR_ANY); //accepts everyone... + if(bind(s_source, (struct sockaddr *) &local, sizeof(local)) < 0) { + pexit("bind /source/ error"); + } + c_len = sizeof(c_addr); + + if ((len = recvfrom(s_source, data_buf, sizeof(data_buf),0,(struct sockaddr *)&c_addr,&c_len)) < 0 ) + { + perror("I/O error"); + } + diag_printf("SERVER : message arrived from %s\n",inet_ntoa(c_addr.sin_addr)); + diag_printf("SERVER : Message : %s\n",data_buf); + close(s_source); +} + +void client(void) +{ + int s_source; + struct sockaddr_in local; + int len; + + diag_printf("client:started\n"); + + s_source = socket(AF_INET, SOCK_DGRAM, 0); + if (s_source < 0) { + pexit("stream socket"); + } + memset(&local, 0, sizeof(local)); + local.sin_family = AF_INET; + local.sin_port = htons(SOURCE_PORT); + local.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + if ( (len= sendto(s_source,data_buf_write,sizeof(data_buf_write),0,(struct sockaddr *)&local,sizeof(local))) < 0 ) + { + diag_printf("Error writing buffer\n"); + } + close(s_source); +} + +void +udp_server(cyg_addrword_t param) +{ + diag_printf("Start UDP server - test\n"); + server(); + cyg_test_exit(); +} + +void +udp_client(cyg_addrword_t param) +{ + diag_printf("Start UDP client - test\n"); + client(); +} + + + +void +cyg_start(void) +{ + init_loopback_interface(); + cyg_thread_create(MAIN_THREAD_PRIORITY, // Priority + udp_server, // entry + 0, // entry parameter + "Network UDP test", // Name + &stack_server[0], // Stack + STACK_SIZE, // Size + &server_thread_handle, // Handle + &server_thread_data // Thread data structure + ); + cyg_thread_resume(server_thread_handle); // Start it + + cyg_thread_create(MAIN_THREAD_PRIORITY, // Priority + udp_client, // entry + 0, // entry parameter + "Network UDP test", // Name + &stack_client[0], // Stack + STACK_SIZE, // Size + &client_thread_handle, // Handle + &client_thread_data // Thread data structure + ); + cyg_thread_resume(client_thread_handle); // Start it + cyg_scheduler_start(); +} + + +