Sorry about not getting back to you earlier as I was on a vacation. Find the code attached to this email.
Sathya
On 1/16/06, Gian Paolo Stoppani <[EMAIL PROTECTED]> wrote:
Hi Sathya,have you find a TCP client application wherein the client connects to a server and sends data?If someone have a TCP client application that uses lwip for microblaze processor, could send it to my e-mail address please that is [EMAIL PROTECTED]Thank you very muchGian Paolo
_______________________________________________
lwip-users mailing list
lwip-users@nongnu.org
http://lists.nongnu.org/mailman/listinfo/lwip-users
/* * XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" * SOLELY FOR USE IN DEVELOPING PROGRAMS AND SOLUTIONS FOR * XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION * AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION * OR STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS * IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT, * AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE * FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY * WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE * IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR * REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF * INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE. * * (c) Copyright 2002, 2003 Xilinx, Inc. * All rights reserved. * */
/* * Copyright (c) 2001, 2002, 2003 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* Xilinx Includes */ #include "xuartlite.h" #include "xparameters.h" #include "xintc.h" #include "xtmrctr_l.h" /* lwIP Includes */ #include "netif/xemacif.h" #include "lwip/tcp.h" #include "lwip/memp.h" #include "netif/etharp.h" #include "TxTest.h" #define LWIP_TIMER_CYCLES (XPAR_CPU_PPC405_CORE_CLOCK_FREQ_HZ / 1000 \ * TCP_TMR_INTERVAL ) // Upper 6 bytes of MAC - Xilinx Ethernet OUI = 00-0A-35 #define XILINX_MAC_OUI0 0x00 #define XILINX_MAC_OUI1 0x00 #define XILINX_MAC_OUI2 0x00 static void show_dotted_decimal( char * address_array); static void show_dashed_hex( int bytes, char *address_array); // Static Global Variables static u8_t my_timer = 0; static int waiting_for_timer = 1; // External Global Variables /* defined in lwip/src/core/tcp.c */ extern u32_t tcp_ticks; /* defined in EDK generated xemacif_g.c file */ extern XEmacIf_Config XEmacIf_ConfigTable[]; /*---------------------------------------------------------------------------*/ // show dotted decimal prints a dotted decimal address to the UART */ /*---------------------------------------------------------------------------*/ static void show_dotted_decimal( char *address_array) { int bb; unsigned char temp; for(bb=0;bb<4;bb++) { temp = address_array[bb]; if(bb!=0) xil_printf("."); xil_printf("%d", temp); } } /*---------------------------------------------------------------------------*/ /* show dashed hex prints a dashed hex address to the UART */ /*---------------------------------------------------------------------------*/ static void show_dashed_hex( int bytes, char *address_array) { //Assumes the caller passes the correct number of bytes int bb; for(bb=0;bb<bytes;bb++) { if(bb !=0) xil_printf("-"); xil_printf("%02X", (int) address_array[bb]); } } /*---------------------------------------------------------------------------*/ /* my_tmr - Called Periodically to dispatch TCP and ARP timers */ /*---------------------------------------------------------------------------*/ void my_tmr(void) { ++my_timer; if(my_timer == 10) { my_timer = 0; } if(my_timer & 1) { /* Call tcp_fasttmr() every 2 ms, i.e., * every other timer my_tmr() is called. */ tcp_fasttmr(); } if(my_timer == 0 || my_timer == 5) { /* Call tcp_slowtmr() every 5 ms, i.e., * every fifth timer my_tmr() is called. */ tcp_slowtmr(); if (tcp_ticks%2000 == 0) /* Call etharp_tmr() every 20th call to tcp_slowtmr(). * tcp_ticks is a global var defined in core/tcp.c */ etharp_tmr(); } } /*---------------------------------------------------------------------------*/ /* new_my_tmr - Called Periodically to dispatch TCP and ARP timers */ /*---------------------------------------------------------------------------*/ void new_my_tmr(void) { tcp_tmr(); etharp_tmr(); } /*---------------------------------------------------------------------------*/ /* print_app_header - prints the legal header */ /*---------------------------------------------------------------------------*/ void print_app_header() { xil_printf("\n\n\n\n\n\n\n\n\r\n"); xil_printf("####################################################################\r\n"); xil_printf("# Xilinx TCP/IP Demo Application (TXTEST Server) #\r\n"); xil_printf("# #\r\n"); xil_printf("# XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION \"AS IS\" #\r\n"); xil_printf("# SOLELY FOR USE IN DEVELOPING PROGRAMS AND SOLUTIONS FOR #\r\n"); xil_printf("# XILINX DEVICES. #\r\n"); xil_printf("# #\r\n"); xil_printf("# (c) Copyright 2003, 2003 Xilinx, Inc. #\r\n"); xil_printf("# All rights reserved. #\r\n"); xil_printf("# #\r\n"); xil_printf("####################################################################\r\n"); } /*---------------------------------------------------------------------------*/ /* main function */ /*---------------------------------------------------------------------------*/ int main_main () { struct ip_addr ipaddr, netmask, gw; struct netif *default_netif; char menu_select = 0; char low_mac[3] = {0x00,0x22,0x38}; char fullmac[6] = {XILINX_MAC_OUI0, XILINX_MAC_OUI1, XILINX_MAC_OUI2, low_mac[0], low_mac[2], low_mac[3]}; char ip[4] = {1,2,3,4}; char subnet[4] = {255,255,255,0}; char gateway[4] = {149,199,6,254}; unsigned int init_wait = 15000000; XEmacIf_Config *xemacif_ptr = &XEmacIf_ConfigTable[0]; /* * Enable and initialize cache */ microblaze_init_icache_range(0, XPAR_MICROBLAZE_0_CACHE_BYTE_SIZE); microblaze_enable_icache(); microblaze_init_dcache_range(0, XPAR_MICROBLAZE_0_DCACHE_BYTE_SIZE); microblaze_enable_dcache(); /*------------------------------- * Enable microblaze interrupts *-------------------------------*/ microblaze_enable_interrupts(); /*------------------------------------------------------------------------- * Timer and Intc Init * * Set the Timer to interrupt for every 100ms *------------------------------------------------------------------------*/ /* set the number of cycles the timer counts before interrupting */ /* 100 Mhz clock => .01us for 1 clk tick. For 100ms, 10000000 clk ticks need to elapse */ XTmrCtr_mSetLoadReg(XPAR_OPB_TIMER_1_BASEADDR, 0, 100000000); /* reset the timers, and clear interrupts */ XTmrCtr_mSetControlStatusReg(XPAR_OPB_TIMER_1_BASEADDR, 0, XTC_CSR_INT_OCCURED_MASK | XTC_CSR_LOAD_MASK ); /* start the timers */ XTmrCtr_mSetControlStatusReg(XPAR_OPB_TIMER_1_BASEADDR, 0, XTC_CSR_ENABLE_TMR_MASK | XTC_CSR_ENABLE_INT_MASK | XTC_CSR_AUTO_RELOAD_MASK | XTC_CSR_DOWN_COUNT_MASK); xil_printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\r\n"); xil_printf("Starting Up...\r\n"); /*-----------------------------------------------------------------------*/ /* Do LWIP System Inits */ /*-----------------------------------------------------------------------*/ #ifdef STATS stats_init(); #endif /* STATS */ xil_printf("Initializing Memory Structures."); sys_init(); mem_init(); xil_printf("."); memp_init(); xil_printf("."); pbuf_init(); xil_printf(" done.\r\n"); /*-----------------------------------------------------------------------*/ /* Initial Header and Menus. Do this before the netif_init() so we can */ /* change the MAC Address and IP addresses if needed */ /*-----------------------------------------------------------------------*/ while(init_wait--); print_app_header(); fullmac[0] = XILINX_MAC_OUI0; fullmac[1] = XILINX_MAC_OUI1; fullmac[2] = XILINX_MAC_OUI2; fullmac[3] = low_mac[0]; fullmac[4] = low_mac[1]; fullmac[5] = low_mac[2]; /*-----------------------------------------------------------------------*/ /* Set host addresses */ /*-----------------------------------------------------------------------*/ xemacif_setmac(0, (u8_t *) fullmac); //Set MAC IP4_ADDR(&gw, gateway[0],gateway[1],gateway[2],gateway[3]); //Set gateway IP4_ADDR(&ipaddr, ip[0],ip[1],ip[2],ip[3]); //Set ip IP4_ADDR(&netmask,subnet[0],subnet[1],subnet[2],subnet[3]); //Set subnet msk /*-----------------------------------------------------------------------*/ /* Show some host boot stuff and parameters */ /*-----------------------------------------------------------------------*/ xil_printf("\r\nStarting Network Interface...\r\n"); xil_printf(" MAC Address: "); show_dashed_hex(6, fullmac); xil_printf("\r\n"); xil_printf(" IP Address: "); show_dotted_decimal(ip); xil_printf("\r\n"); xil_printf(" Subnet Mask: "); show_dotted_decimal(subnet); xil_printf("\r\n"); xil_printf(" Gateway IP: "); show_dotted_decimal(gateway); xil_printf("\r\n"); xil_printf(" TxTest Port: 2000 \r\n"); /*-----------------------------------------------------------------------*/ /* Initialize netif */ /*-----------------------------------------------------------------------*/ netif_init(); /*-----------------------------------------------------------------------*/ /* Initialize TCP Stack */ /*-----------------------------------------------------------------------*/ tcp_init(); /*-----------------------------------------------------------------------*/ /* Set up the lwIP network interface... */ /*-----------------------------------------------------------------------*/ /* allocate netif structure */ default_netif = mem_malloc(sizeof(struct netif)); if (default_netif == NULL) { print(NETIF_DEBUG, ("netif_add(): out of memory for default_netif\n")); return 1; } default_netif = netif_add( default_netif, &ipaddr, &netmask, &gw, &XEmacIf_ConfigTable[0], xemacif_init, ip_input ); netif_set_default(default_netif); /* Register XEmacHandler with interrupt controller and enable interrupts */ XIntc_RegisterHandler(XPAR_OPB_INTC_0_BASEADDR, XPAR_OPB_INTC_0_ETHERNET_MAC_IP2INTC_IRPT_INTR, #ifdef SGDMA_MODE (XInterruptHandler)XEmac_IntrHandlerDma, #else (XInterruptHandler)XEmac_IntrHandlerFifo, #endif xemacif_ptr->instance_ptr); /* Start the interrupt controller */ XIntc_mMasterEnable(XPAR_OPB_INTC_0_BASEADDR); /* Enable timer and EMAC interrupts in the interrupt controller */ XIntc_mEnableIntr(XPAR_OPB_INTC_0_BASEADDR, XPAR_ETHERNET_MAC_IP2INTC_IRPT_MASK); /*-----------------------------------------------------------------------*/ /* create new tcp pcb and start applications */ /*-----------------------------------------------------------------------*/ // Start the Client xil_printf("TxTest Client Running ... "); xil_printf("\r\n"); TxTest_init(); while (1) { while (waiting_for_timer) { // Call to check if there are any packets xemacif_input(default_netif); send_data(tx_pcb, ps); } // Call my_tmr() new_my_tmr(); waiting_for_timer = 1; } /* * Disable cache and reinitialize it so that other * applications can be run with no problems */ microblaze_disable_dcache(); microblaze_init_dcache_range(0, XPAR_MICROBLAZE_0_DCACHE_BYTE_SIZE); microblaze_disable_icache(); microblaze_init_icache_range(0, XPAR_MICROBLAZE_0_CACHE_BYTE_SIZE); return (1); } int main () { return main_main(); } void mytimer_int_handler (void* baseaddr_p) { int baseaddr = *(int *)baseaddr_p; unsigned int csr; // unsigned int gpio_data; /* Read timer 0 CSR to see if it raised the interrupt */ csr = XTmrCtr_mGetControlStatusReg(XPAR_OPB_TIMER_1_BASEADDR, 0); if (csr & XTC_CSR_INT_OCCURED_MASK) { //xil_printf("Timer Handler ...\n\t"); waiting_for_timer = 0; /* Clear the timer interrupt */ XTmrCtr_mSetControlStatusReg(XPAR_OPB_TIMER_1_BASEADDR, 0, csr); } } void exc_illegal_op(void* arg) { print ("Illegal Opcode Exception\r\n"); } void exc_iopb(void* arg) { print ("IOPB Exception \r\n"); } void exc_dopb(void* arg) { print ("DOPB Exception \r\n"); } void _stack_overflow_exit() { print ("Stack Overflow Error \r\n"); }
#ifndef LWIP_TXTEST_H #define LWIP_TXTEST_H #include "lwip/tcp.h" #define TXTEST_SERVER_PORT 2000 #define TXTEST_PKT_SIZE 64 struct TxTest_state { char *buf_p; int left; #define FAILED_MAX 8 }; /* Defined in TxTest.c */ extern struct tcp_pcb *tx_pcb; extern struct TxTest_state *ps; void send_data(struct tcp_pcb *pcb, struct TxTest_state *ps); void TxTest_init(void); #endif
/* * Copyright (c) 2001-2003 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels <[EMAIL PROTECTED]> * */ #include "lwip/debug.h" #include "lwip/stats.h" #include "lwip/tcp.h" #include "TxTest.h" struct tcp_pcb *tx_pcb; struct TxTest_state *ps = NULL; int totsent = 0; char data_buf[TXTEST_PKT_SIZE] __attribute__((aligned (4))); /*---------------------------------------------------------------------------*/ static void TxTest_err(void *arg, err_t err) { //struct TxTest_state *ps = arg; xil_printf("TxTest_err\r\n"); if(arg != NULL) { //mem_free(ps->buf_p); mem_free(ps); } } /*---------------------------------------------------------------------------*/ static void close_conn(struct tcp_pcb *pcb, struct TxTest_state *ps) { tcp_arg(pcb, NULL); tcp_sent(pcb, NULL); tcp_recv(pcb, NULL); if(ps != NULL) { //mem_free(ps->buf_p); mem_free(ps); } if (tcp_close(pcb) != ERR_OK) print("[TxTest could not close] \r\n"); else print("[TxTest_closed] \r\n"); } /*-----------------------------------------------------------------------------------*/ void send_data(struct tcp_pcb *pcb, struct TxTest_state *ps) { err_t err = ERR_OK; u16_t len; /* We cannot send more data than space available in the send buffer. */ if (tcp_sndbuf(pcb) < ps->left) { len = tcp_sndbuf(pcb); } else { len = ps->left; } //xil_printf("Len: %d \r\n", len); if (len > 0) { err = tcp_write(pcb, ps->buf_p, len, 1); //err = tcp_write(pcb, ps->buf_p, len, 0); } /* if (err != ERR_MEM) { if (len > 0 ) { ps->buf_p += len; ps->left -= len; } else { ps->buf_p = data_buf; ps->left = TXTEST_PKT_SIZE; } } */ } /*---------------------------------------------------------------------------*/ static err_t TxTest_sent(void *arg, struct tcp_pcb *pcb, int rcvlen) { struct TxTest_state *ps = (struct TxTest_state *)arg; int buflen, len; int stat; /* if (ps->left > 0) { send_data(pcb, ps); } else { //close_conn(pcb, ps); ps->buf_p = data_buf; ps->left = TXTEST_PKT_SIZE; send_data(pcb, ps); } */ if (rcvlen > 0 ) { ps->buf_p += len; ps->left -= len; } if (ps->left <= 0) { ps->buf_p = data_buf; ps->left = TXTEST_PKT_SIZE; } //print("[TxTest_sent] \r\n"); return ERR_OK; } /*---------------------------------------------------------------------------*/ static err_t TxTest_connected(void *arg, struct tcp_pcb *pcb, err_t error) { char *buf_p; int i, len; int stat, buflen; xil_printf("[TxTest_connected]\r\n"); tcp_setprio(pcb, TCP_PRIO_MIN); ps = mem_malloc(sizeof(struct TxTest_state)); if (ps == NULL){ xil_printf("could not malloc memory for TxTest_state\r\n"); return ERR_MEM; } len = TXTEST_PKT_SIZE; for (i=0;i<TXTEST_PKT_SIZE;++i){ data_buf[i] = i; } /* Initialize the structure. */ ps->left = len; ps->buf_p = data_buf; /* Tell TCP that this is the structure we wish to be passed for our callbacks. */ tcp_arg(pcb, ps); tcp_err(pcb, TxTest_err); tcp_sent(pcb, TxTest_sent); /* We cannot send more data than space available in the send buffer. */ send_data(pcb, ps); return ERR_OK; } /*---------------------------------------------------------------------------*/ void TxTest_init(void) { struct ip_addr ipaddr; char ip[4] = {1,2,3,5}; int port; int stat; int i; xil_printf("[TxTest_init]\r\n"); IP4_ADDR(&ipaddr, ip[0],ip[1],ip[2],ip[3]); port = 2000; tx_pcb = tcp_new(); if ( !tx_pcb){ xil_printf("tcp_new fails\r\n"); return; } stat = tcp_connect(tx_pcb, &ipaddr, port, TxTest_connected); if (stat == ERR_MEM) print("[TxTest_connect] memory error \r\n"); } /*---------------------------------------------------------------------------*/
_______________________________________________ lwip-users mailing list lwip-users@nongnu.org http://lists.nongnu.org/mailman/listinfo/lwip-users