<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Lwip Client Echo Application [SOLVED] in MCUXpresso General</title>
    <link>https://community.nxp.com/t5/MCUXpresso-General/Lwip-Client-Echo-Application-SOLVED/m-p/963702#M2579</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi. I use lpc1769 custom board and MCUxpresso.&lt;/P&gt;&lt;P&gt;I&amp;nbsp;need to convert Lwip_tcpecho_sa server application to client application or&amp;nbsp; get new lwip client echo application.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Is there any lwip client application.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;How can ı do ?&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Mon, 09 Sep 2019 10:46:25 GMT</pubDate>
    <dc:creator>ramazan_kurban3</dc:creator>
    <dc:date>2019-09-09T10:46:25Z</dc:date>
    <item>
      <title>Lwip Client Echo Application [SOLVED]</title>
      <link>https://community.nxp.com/t5/MCUXpresso-General/Lwip-Client-Echo-Application-SOLVED/m-p/963702#M2579</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi. I use lpc1769 custom board and MCUxpresso.&lt;/P&gt;&lt;P&gt;I&amp;nbsp;need to convert Lwip_tcpecho_sa server application to client application or&amp;nbsp; get new lwip client echo application.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Is there any lwip client application.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;How can ı do ?&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 09 Sep 2019 10:46:25 GMT</pubDate>
      <guid>https://community.nxp.com/t5/MCUXpresso-General/Lwip-Client-Echo-Application-SOLVED/m-p/963702#M2579</guid>
      <dc:creator>ramazan_kurban3</dc:creator>
      <dc:date>2019-09-09T10:46:25Z</dc:date>
    </item>
    <item>
      <title>Re: Lwip Client Echo Application</title>
      <link>https://community.nxp.com/t5/MCUXpresso-General/Lwip-Client-Echo-Application-SOLVED/m-p/963703#M2580</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Ramazan,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;At code level there's not much differences between a client and server application, usually the first one that make the connection is considered a client.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;So you could base your application in the lwip_tcpecho_sa/freertos.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Best Regards,&lt;/P&gt;&lt;P&gt;Alexis Andlaon&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 11 Sep 2019 20:41:00 GMT</pubDate>
      <guid>https://community.nxp.com/t5/MCUXpresso-General/Lwip-Client-Echo-Application-SOLVED/m-p/963703#M2580</guid>
      <dc:creator>Alexis_A</dc:creator>
      <dc:date>2019-09-11T20:41:00Z</dc:date>
    </item>
    <item>
      <title>Re: Lwip Client Echo Application</title>
      <link>https://community.nxp.com/t5/MCUXpresso-General/Lwip-Client-Echo-Application-SOLVED/m-p/963704#M2581</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I changed echo_init(); function with&amp;nbsp; tcp_echoclient_connect();&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;now ı can send data to server but cant get data from server. When ı send data from hercules (server application), hercules shutdown.&lt;/P&gt;&lt;P&gt;When client connect to hercules(server),client count i set -1 and if ı reset my board, this number increse to -2 -3 -4 ....&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;How can ı get data from server ? What is other problems ?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;BLOCKQUOTE class="jive_macro_quote jive-quote jive_text_macro"&gt;&lt;P&gt;void tcp_echoclient_connect(void)&lt;BR /&gt;{&lt;BR /&gt; struct ip_addr DestIPaddr;&lt;BR /&gt;&lt;BR /&gt; /* create new tcp pcb */&lt;BR /&gt; echoclient_pcb = tcp_new();&lt;BR /&gt;&lt;BR /&gt; if (echoclient_pcb != NULL)&lt;BR /&gt; {&lt;BR /&gt; IP4_ADDR( &amp;amp;DestIPaddr, DEST_IP_ADDR0, DEST_IP_ADDR1, DEST_IP_ADDR2, DEST_IP_ADDR3 );&lt;BR /&gt;&lt;BR /&gt; /* connect to destination address/port */&lt;BR /&gt; tcp_connect(echoclient_pcb,&amp;amp;DestIPaddr,DEST_PORT,tcp_echoclient_connected);&lt;BR /&gt; }&lt;BR /&gt; else&lt;BR /&gt; {&lt;BR /&gt; /* deallocate the pcb */&lt;BR /&gt; memp_free(MEMP_TCP_PCB, echoclient_pcb);&lt;BR /&gt;#ifdef SERIAL_DEBUG&lt;BR /&gt; printf("\n\r can not create tcp pcb");&lt;BR /&gt;#endif &lt;BR /&gt; }&lt;BR /&gt;}&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 15 Sep 2019 15:44:49 GMT</pubDate>
      <guid>https://community.nxp.com/t5/MCUXpresso-General/Lwip-Client-Echo-Application-SOLVED/m-p/963704#M2581</guid>
      <dc:creator>ramazan_kurban3</dc:creator>
      <dc:date>2019-09-15T15:44:49Z</dc:date>
    </item>
    <item>
      <title>Re: Lwip Client Echo Application [SOLVED]</title>
      <link>https://community.nxp.com/t5/MCUXpresso-General/Lwip-Client-Echo-Application-SOLVED/m-p/963705#M2582</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;ADD FOR CLIENT THIS CODES TO ECHO.C IN LPCOPEN LWIP_TCPECHO_SA EXAMPLE&lt;/P&gt;&lt;BLOCKQUOTE class="jive_macro_quote jive-quote jive_text_macro"&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;void tcp_echoclient_connect(void)&lt;BR /&gt;{&lt;BR /&gt; struct ip_addr DestIPaddr;&lt;/P&gt;&lt;P&gt;if (echo_pcb != NULL)&lt;BR /&gt; {&lt;BR /&gt; IP4_ADDR( &amp;amp;DestIPaddr, 192, 168, 1, 43 );&lt;/P&gt;&lt;P&gt;/* connect to destination address/port */&lt;BR /&gt; tcp_connect(echo_pcb,&amp;amp;DestIPaddr,7,echo_accept);&lt;BR /&gt; }&lt;BR /&gt; else&lt;BR /&gt; {&lt;BR /&gt; /* deallocate the pcb */&lt;BR /&gt; memp_free(MEMP_TCP_PCB, echo_pcb);&lt;BR /&gt; // DEBUGOUT("\n\r can not create tcp pcb");&lt;/P&gt;&lt;P&gt;}&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;void&lt;BR /&gt;echo_init(void)&lt;BR /&gt;{&lt;BR /&gt; echo_pcb = tcp_new();&lt;BR /&gt; if (echo_pcb != NULL)&lt;BR /&gt; {&lt;BR /&gt; err_t err;&lt;/P&gt;&lt;P&gt;err = tcp_bind(echo_pcb, IP_ADDR_ANY, 7);&lt;BR /&gt; if (err == ERR_OK)&lt;BR /&gt; {&lt;BR /&gt; // FOR SERVER&lt;BR /&gt; // echo_pcb = tcp_listen(echo_pcb);&lt;BR /&gt; // tcp_accept(echo_pcb, echo_accept);&lt;BR /&gt; &lt;BR /&gt; // FOR CLİENT&lt;BR /&gt; tcp_echoclient_connect();&lt;BR /&gt; }&lt;BR /&gt; else &lt;BR /&gt; {&lt;BR /&gt; /* abort? output diagnostic? */&lt;BR /&gt; }&lt;BR /&gt; }&lt;BR /&gt; else&lt;BR /&gt; {&lt;BR /&gt; /* abort? output diagnostic? */&lt;BR /&gt; }&lt;BR /&gt;}&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 16 Sep 2019 12:41:50 GMT</pubDate>
      <guid>https://community.nxp.com/t5/MCUXpresso-General/Lwip-Client-Echo-Application-SOLVED/m-p/963705#M2582</guid>
      <dc:creator>ramazan_kurban3</dc:creator>
      <dc:date>2019-09-16T12:41:50Z</dc:date>
    </item>
    <item>
      <title>Re: Lwip Client Echo Application</title>
      <link>https://community.nxp.com/t5/MCUXpresso-General/Lwip-Client-Echo-Application-SOLVED/m-p/1588484#M4842</link>
      <description>&lt;P&gt;Hello Alexis,&lt;/P&gt;&lt;P&gt;hope you doing well&amp;nbsp;&lt;/P&gt;&lt;P&gt;I am working on MK20DX256xxx7 I have Problem when I need to connect my code to server this the configration of lwip and the configuration of my project I don't Know exactly where the problem configuration seem good&amp;nbsp;&lt;/P&gt;&lt;P&gt;/**&lt;BR /&gt;* @file&lt;BR /&gt;* @defgroup altcp Application layered TCP Functions&lt;BR /&gt;* @ingroup altcp_api&lt;BR /&gt;*&lt;BR /&gt;* This file contains the common functions for altcp to work.&lt;BR /&gt;* For more details see @ref altcp_api.&lt;BR /&gt;*/&lt;/P&gt;&lt;P&gt;/**&lt;BR /&gt;* @defgroup altcp_api Application layered TCP Introduction&lt;BR /&gt;* @ingroup callbackstyle_api&lt;BR /&gt;*&lt;BR /&gt;* Overview&lt;BR /&gt;* --------&lt;BR /&gt;* altcp (application layered TCP connection API; to be used from TCPIP thread)&lt;BR /&gt;* is an abstraction layer that prevents applications linking hard against the&lt;BR /&gt;* @ref tcp.h functions while providing the same functionality. It is used to&lt;BR /&gt;* e.g. add SSL/TLS (see LWIP_ALTCP_TLS) or proxy-connect support to an application&lt;BR /&gt;* written for the tcp callback API without that application knowing the&lt;BR /&gt;* protocol details.&lt;BR /&gt;*&lt;BR /&gt;* * This interface mimics the tcp callback API to the application while preventing&lt;BR /&gt;* direct linking (much like virtual functions).&lt;BR /&gt;* * This way, an application can make use of other application layer protocols&lt;BR /&gt;* on top of TCP without knowing the details (e.g. TLS, proxy connection).&lt;BR /&gt;* * This is achieved by simply including "lwip/altcp.h" instead of "lwip/tcp.h",&lt;BR /&gt;* replacing "struct tcp_pcb" with "struct altcp_pcb" and prefixing all functions&lt;BR /&gt;* with "altcp_" instead of "tcp_".&lt;BR /&gt;*&lt;BR /&gt;* With altcp support disabled (LWIP_ALTCP==0), applications written against the&lt;BR /&gt;* altcp API can still be compiled but are directly linked against the tcp.h&lt;BR /&gt;* callback API and then cannot use layered protocols. To minimize code changes&lt;BR /&gt;* in this case, the use of altcp_allocators is strongly suggested.&lt;BR /&gt;*&lt;BR /&gt;* Usage&lt;BR /&gt;* -----&lt;BR /&gt;* To make use of this API from an existing tcp raw API application:&lt;BR /&gt;* * Include "lwip/altcp.h" instead of "lwip/tcp.h"&lt;BR /&gt;* * Replace "struct tcp_pcb" with "struct altcp_pcb"&lt;BR /&gt;* * Prefix all called tcp API functions with "altcp_" instead of "tcp_" to link&lt;BR /&gt;* against the altcp functions&lt;BR /&gt;* * @ref altcp_new (and @ref altcp_new_ip_type/@ref altcp_new_ip6) take&lt;BR /&gt;* an @ref altcp_allocator_t as an argument, whereas the original tcp API&lt;BR /&gt;* functions take no arguments.&lt;BR /&gt;* * An @ref altcp_allocator_t allocator is an object that holds a pointer to an&lt;BR /&gt;* allocator object and a corresponding state (e.g. for TLS, the corresponding&lt;BR /&gt;* state may hold certificates or keys). This way, the application does not&lt;BR /&gt;* even need to know if it uses TLS or pure TCP, this is handled at runtime&lt;BR /&gt;* by passing a specific allocator.&lt;BR /&gt;* * An application can alternatively bind hard to the altcp_tls API by calling&lt;BR /&gt;* @ref altcp_tls_new or @ref altcp_tls_wrap.&lt;BR /&gt;* * The TLS layer is not directly implemented by lwIP, but a port to mbedTLS is&lt;BR /&gt;* provided.&lt;BR /&gt;* * Another altcp layer is proxy-connect to use TLS behind a HTTP proxy (see&lt;BR /&gt;* @ref altcp_proxyconnect.h)&lt;BR /&gt;*&lt;BR /&gt;* altcp_allocator_t&lt;BR /&gt;* -----------------&lt;BR /&gt;* An altcp allocator is created by the application by combining an allocator&lt;BR /&gt;* callback function and a corresponding state, e.g.:\code{.c}&lt;BR /&gt;* static const unsigned char cert[] = {0x2D, ... (see mbedTLS doc for how to create this)};&lt;BR /&gt;* struct altcp_tls_config * conf = altcp_tls_create_config_client(cert, sizeof(cert));&lt;BR /&gt;* altcp_allocator_t tls_allocator = {&lt;BR /&gt;* altcp_tls_alloc, conf&lt;BR /&gt;* };&lt;BR /&gt;* \endcode&lt;BR /&gt;*&lt;BR /&gt;*&lt;BR /&gt;* struct altcp_tls_config&lt;BR /&gt;* -----------------------&lt;BR /&gt;* The struct altcp_tls_config holds state that is needed to create new TLS client&lt;BR /&gt;* or server connections (e.g. certificates and private keys).&lt;BR /&gt;*&lt;BR /&gt;* It is not defined by lwIP itself but by the TLS port (e.g. altcp_tls to mbedTLS&lt;BR /&gt;* adaption). However, the parameters used to create it are defined in @ref&lt;BR /&gt;* altcp_tls.h (see @ref altcp_tls_create_config_server_privkey_cert for servers&lt;BR /&gt;* and @ref altcp_tls_create_config_client/@ref altcp_tls_create_config_client_2wayauth&lt;BR /&gt;* for clients).&lt;BR /&gt;*&lt;BR /&gt;* For mbedTLS, ensure that certificates can be parsed by 'mbedtls_x509_crt_parse()' and&lt;BR /&gt;* private keys can be parsed by 'mbedtls_pk_parse_key()'.&lt;BR /&gt;*/&lt;/P&gt;&lt;P&gt;/*&lt;BR /&gt;* Copyright (c) 2017 Simon Goldschmidt&lt;BR /&gt;* All rights reserved.&lt;BR /&gt;*&lt;BR /&gt;* Redistribution and use in source and binary forms, with or without modification,&lt;BR /&gt;* are permitted provided that the following conditions are met:&lt;BR /&gt;*&lt;BR /&gt;* 1. Redistributions of source code must retain the above copyright notice,&lt;BR /&gt;* this list of conditions and the following disclaimer.&lt;BR /&gt;* 2. Redistributions in binary form must reproduce the above copyright notice,&lt;BR /&gt;* this list of conditions and the following disclaimer in the documentation&lt;BR /&gt;* and/or other materials provided with the distribution.&lt;BR /&gt;* 3. The name of the author may not be used to endorse or promote products&lt;BR /&gt;* derived from this software without specific prior written permission.&lt;BR /&gt;*&lt;BR /&gt;* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED&lt;BR /&gt;* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF&lt;BR /&gt;* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT&lt;BR /&gt;* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,&lt;BR /&gt;* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT&lt;BR /&gt;* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS&lt;BR /&gt;* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN&lt;BR /&gt;* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING&lt;BR /&gt;* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY&lt;BR /&gt;* OF SUCH DAMAGE.&lt;BR /&gt;*&lt;BR /&gt;* This file is part of the lwIP TCP/IP stack.&lt;BR /&gt;*&lt;BR /&gt;* Author: Simon Goldschmidt &amp;lt;goldsimon@gmx.de&amp;gt;&lt;BR /&gt;*&lt;BR /&gt;*/&lt;/P&gt;&lt;P&gt;#include "lwip/opt.h"&lt;/P&gt;&lt;P&gt;#if LWIP_ALTCP /* don't build if not configured for use in lwipopts.h */&lt;/P&gt;&lt;P&gt;#include "lwip/altcp.h"&lt;BR /&gt;#include "lwip/priv/altcp_priv.h"&lt;BR /&gt;#include "lwip/altcp_tcp.h"&lt;BR /&gt;#include "lwip/tcp.h"&lt;BR /&gt;#include "lwip/mem.h"&lt;/P&gt;&lt;P&gt;#include &amp;lt;string.h&amp;gt;&lt;/P&gt;&lt;P&gt;extern const struct altcp_functions altcp_tcp_functions;&lt;/P&gt;&lt;P&gt;/**&lt;BR /&gt;* For altcp layer implementations only: allocate a new struct altcp_pcb from the pool&lt;BR /&gt;* and zero the memory&lt;BR /&gt;*/&lt;BR /&gt;struct altcp_pcb *&lt;BR /&gt;altcp_alloc(void)&lt;BR /&gt;{&lt;BR /&gt;struct altcp_pcb *ret = (struct altcp_pcb *)memp_malloc(MEMP_ALTCP_PCB);&lt;BR /&gt;if (ret != NULL) {&lt;BR /&gt;memset(ret, 0, sizeof(struct altcp_pcb));&lt;BR /&gt;}&lt;BR /&gt;return ret;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;/**&lt;BR /&gt;* For altcp layer implementations only: return a struct altcp_pcb to the pool&lt;BR /&gt;*/&lt;BR /&gt;void&lt;BR /&gt;altcp_free(struct altcp_pcb *conn)&lt;BR /&gt;{&lt;BR /&gt;if (conn) {&lt;BR /&gt;if (conn-&amp;gt;fns &amp;amp;&amp;amp; conn-&amp;gt;fns-&amp;gt;dealloc) {&lt;BR /&gt;conn-&amp;gt;fns-&amp;gt;dealloc(conn);&lt;BR /&gt;}&lt;BR /&gt;memp_free(MEMP_ALTCP_PCB, conn);&lt;BR /&gt;}&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;/**&lt;BR /&gt;* @ingroup altcp&lt;BR /&gt;* altcp_new_ip6: @ref altcp_new for IPv6&lt;BR /&gt;*/&lt;BR /&gt;struct altcp_pcb *&lt;BR /&gt;altcp_new_ip6(altcp_allocator_t *allocator)&lt;BR /&gt;{&lt;BR /&gt;return altcp_new_ip_type(allocator, IPADDR_TYPE_V6);&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;/**&lt;BR /&gt;* @ingroup altcp&lt;BR /&gt;* altcp_new: @ref altcp_new for IPv4&lt;BR /&gt;*/&lt;BR /&gt;struct altcp_pcb *&lt;BR /&gt;altcp_new(altcp_allocator_t *allocator)&lt;BR /&gt;{&lt;BR /&gt;return altcp_new_ip_type(allocator, IPADDR_TYPE_V4);&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;/**&lt;BR /&gt;* @ingroup altcp&lt;BR /&gt;* altcp_new_ip_type: called by applications to allocate a new pcb with the help of an&lt;BR /&gt;* allocator function.&lt;BR /&gt;*&lt;BR /&gt;* &lt;a href="https://community.nxp.com/t5/user/viewprofilepage/user-id/197964"&gt;@Param&lt;/a&gt; allocator allocator function and argument&lt;BR /&gt;* &lt;a href="https://community.nxp.com/t5/user/viewprofilepage/user-id/197964"&gt;@Param&lt;/a&gt; ip_type IP version of the pcb (@ref lwip_ip_addr_type)&lt;BR /&gt;* @return a new altcp_pcb or NULL on error&lt;BR /&gt;*/&lt;BR /&gt;struct altcp_pcb *&lt;BR /&gt;altcp_new_ip_type(altcp_allocator_t *allocator, u8_t ip_type)&lt;BR /&gt;{&lt;BR /&gt;struct altcp_pcb *conn;&lt;BR /&gt;if (allocator == NULL) {&lt;BR /&gt;/* no allocator given, create a simple TCP connection */&lt;BR /&gt;return altcp_tcp_new_ip_type(ip_type);&lt;BR /&gt;}&lt;BR /&gt;if (allocator-&amp;gt;alloc == NULL) {&lt;BR /&gt;/* illegal allocator */&lt;BR /&gt;return NULL;&lt;BR /&gt;}&lt;BR /&gt;conn = allocator-&amp;gt;alloc(allocator-&amp;gt;arg, ip_type);&lt;BR /&gt;if (conn == NULL) {&lt;BR /&gt;/* allocation failed */&lt;BR /&gt;return NULL;&lt;BR /&gt;}&lt;BR /&gt;return conn;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;/**&lt;BR /&gt;* @ingroup altcp&lt;BR /&gt;* &lt;a href="https://community.nxp.com/t5/user/viewprofilepage/user-id/7226"&gt;@see&lt;/a&gt; tcp_arg()&lt;BR /&gt;*/&lt;BR /&gt;void&lt;BR /&gt;altcp_arg(struct altcp_pcb *conn, void *arg)&lt;BR /&gt;{&lt;BR /&gt;if (conn) {&lt;BR /&gt;conn-&amp;gt;arg = arg;&lt;BR /&gt;}&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;/**&lt;BR /&gt;* @ingroup altcp&lt;BR /&gt;* &lt;a href="https://community.nxp.com/t5/user/viewprofilepage/user-id/7226"&gt;@see&lt;/a&gt; tcp_accept()&lt;BR /&gt;*/&lt;BR /&gt;void&lt;BR /&gt;altcp_accept(struct altcp_pcb *conn, altcp_accept_fn accept)&lt;BR /&gt;{&lt;BR /&gt;if (conn != NULL) {&lt;BR /&gt;conn-&amp;gt;accept = accept;&lt;BR /&gt;}&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;/**&lt;BR /&gt;* @ingroup altcp&lt;BR /&gt;* &lt;a href="https://community.nxp.com/t5/user/viewprofilepage/user-id/7226"&gt;@see&lt;/a&gt; tcp_recv()&lt;BR /&gt;*/&lt;BR /&gt;void&lt;BR /&gt;altcp_recv(struct altcp_pcb *conn, altcp_recv_fn recv)&lt;BR /&gt;{&lt;BR /&gt;if (conn) {&lt;BR /&gt;conn-&amp;gt;recv = recv;&lt;BR /&gt;}&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;/**&lt;BR /&gt;* @ingroup altcp&lt;BR /&gt;* &lt;a href="https://community.nxp.com/t5/user/viewprofilepage/user-id/7226"&gt;@see&lt;/a&gt; tcp_sent()&lt;BR /&gt;*/&lt;BR /&gt;void&lt;BR /&gt;altcp_sent(struct altcp_pcb *conn, altcp_sent_fn sent)&lt;BR /&gt;{&lt;BR /&gt;if (conn) {&lt;BR /&gt;conn-&amp;gt;sent = sent;&lt;BR /&gt;}&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;/**&lt;BR /&gt;* @ingroup altcp&lt;BR /&gt;* &lt;a href="https://community.nxp.com/t5/user/viewprofilepage/user-id/7226"&gt;@see&lt;/a&gt; tcp_poll()&lt;BR /&gt;*/&lt;BR /&gt;void&lt;BR /&gt;altcp_poll(struct altcp_pcb *conn, altcp_poll_fn poll, u8_t interval)&lt;BR /&gt;{&lt;BR /&gt;if (conn) {&lt;BR /&gt;conn-&amp;gt;poll = poll;&lt;BR /&gt;conn-&amp;gt;pollinterval = interval;&lt;BR /&gt;if (conn-&amp;gt;fns &amp;amp;&amp;amp; conn-&amp;gt;fns-&amp;gt;set_poll) {&lt;BR /&gt;conn-&amp;gt;fns-&amp;gt;set_poll(conn, interval);&lt;BR /&gt;}&lt;BR /&gt;}&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;/**&lt;BR /&gt;* @ingroup altcp&lt;BR /&gt;* &lt;a href="https://community.nxp.com/t5/user/viewprofilepage/user-id/7226"&gt;@see&lt;/a&gt; tcp_err()&lt;BR /&gt;*/&lt;BR /&gt;void&lt;BR /&gt;altcp_err(struct altcp_pcb *conn, altcp_err_fn err)&lt;BR /&gt;{&lt;BR /&gt;if (conn) {&lt;BR /&gt;conn-&amp;gt;err = err;&lt;BR /&gt;}&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;/* Generic functions calling the "virtual" ones */&lt;/P&gt;&lt;P&gt;/**&lt;BR /&gt;* @ingroup altcp&lt;BR /&gt;* &lt;a href="https://community.nxp.com/t5/user/viewprofilepage/user-id/7226"&gt;@see&lt;/a&gt; tcp_recved()&lt;BR /&gt;*/&lt;BR /&gt;void&lt;BR /&gt;altcp_recved(struct altcp_pcb *conn, u16_t len)&lt;BR /&gt;{&lt;BR /&gt;if (conn &amp;amp;&amp;amp; conn-&amp;gt;fns &amp;amp;&amp;amp; conn-&amp;gt;fns-&amp;gt;recved) {&lt;BR /&gt;conn-&amp;gt;fns-&amp;gt;recved(conn, len);&lt;BR /&gt;}&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;/**&lt;BR /&gt;* @ingroup altcp&lt;BR /&gt;* &lt;a href="https://community.nxp.com/t5/user/viewprofilepage/user-id/7226"&gt;@see&lt;/a&gt; tcp_bind()&lt;BR /&gt;*/&lt;BR /&gt;err_t&lt;BR /&gt;altcp_bind(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port)&lt;BR /&gt;{&lt;BR /&gt;if (conn &amp;amp;&amp;amp; conn-&amp;gt;fns &amp;amp;&amp;amp; conn-&amp;gt;fns-&amp;gt;bind) {&lt;BR /&gt;return conn-&amp;gt;fns-&amp;gt;bind(conn, ipaddr, port);&lt;BR /&gt;}&lt;BR /&gt;return ERR_LWIP_VAL;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;/**&lt;BR /&gt;* @ingroup altcp&lt;BR /&gt;* &lt;a href="https://community.nxp.com/t5/user/viewprofilepage/user-id/7226"&gt;@see&lt;/a&gt; tcp_connect()&lt;BR /&gt;*/&lt;BR /&gt;err_t&lt;BR /&gt;altcp_connect(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port, altcp_connected_fn connected)&lt;BR /&gt;{&lt;BR /&gt;if (conn &amp;amp;&amp;amp; conn-&amp;gt;fns &amp;amp;&amp;amp; conn-&amp;gt;fns-&amp;gt;connect) {&lt;BR /&gt;return conn-&amp;gt;fns-&amp;gt;connect(conn, ipaddr, port, connected);&lt;BR /&gt;}&lt;BR /&gt;return ERR_LWIP_VAL;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;/**&lt;BR /&gt;* @ingroup altcp&lt;BR /&gt;* &lt;a href="https://community.nxp.com/t5/user/viewprofilepage/user-id/7226"&gt;@see&lt;/a&gt; tcp_listen_with_backlog_and_err()&lt;BR /&gt;*/&lt;BR /&gt;struct altcp_pcb *&lt;BR /&gt;altcp_listen_with_backlog_and_err(struct altcp_pcb *conn, u8_t backlog, err_t *err)&lt;BR /&gt;{&lt;BR /&gt;if (conn &amp;amp;&amp;amp; conn-&amp;gt;fns &amp;amp;&amp;amp; conn-&amp;gt;fns-&amp;gt;listen) {&lt;BR /&gt;return conn-&amp;gt;fns-&amp;gt;listen(conn, backlog, err);&lt;BR /&gt;}&lt;BR /&gt;return NULL;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;/**&lt;BR /&gt;* @ingroup altcp&lt;BR /&gt;* &lt;a href="https://community.nxp.com/t5/user/viewprofilepage/user-id/7226"&gt;@see&lt;/a&gt; tcp_abort()&lt;BR /&gt;*/&lt;BR /&gt;void&lt;BR /&gt;altcp_abort(struct altcp_pcb *conn)&lt;BR /&gt;{&lt;BR /&gt;if (conn &amp;amp;&amp;amp; conn-&amp;gt;fns &amp;amp;&amp;amp; conn-&amp;gt;fns-&amp;gt;abort) {&lt;BR /&gt;conn-&amp;gt;fns-&amp;gt;abort(conn);&lt;BR /&gt;}&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;/**&lt;BR /&gt;* @ingroup altcp&lt;BR /&gt;* &lt;a href="https://community.nxp.com/t5/user/viewprofilepage/user-id/7226"&gt;@see&lt;/a&gt; tcp_close()&lt;BR /&gt;*/&lt;BR /&gt;err_t&lt;BR /&gt;altcp_close(struct altcp_pcb *conn)&lt;BR /&gt;{&lt;BR /&gt;if (conn &amp;amp;&amp;amp; conn-&amp;gt;fns &amp;amp;&amp;amp; conn-&amp;gt;fns-&amp;gt;close) {&lt;BR /&gt;return conn-&amp;gt;fns-&amp;gt;close(conn);&lt;BR /&gt;}&lt;BR /&gt;return ERR_LWIP_VAL;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;/**&lt;BR /&gt;* @ingroup altcp&lt;BR /&gt;* &lt;a href="https://community.nxp.com/t5/user/viewprofilepage/user-id/7226"&gt;@see&lt;/a&gt; tcp_shutdown()&lt;BR /&gt;*/&lt;BR /&gt;err_t&lt;BR /&gt;altcp_shutdown(struct altcp_pcb *conn, int shut_rx, int shut_tx)&lt;BR /&gt;{&lt;BR /&gt;if (conn &amp;amp;&amp;amp; conn-&amp;gt;fns &amp;amp;&amp;amp; conn-&amp;gt;fns-&amp;gt;shutdown) {&lt;BR /&gt;return conn-&amp;gt;fns-&amp;gt;shutdown(conn, shut_rx, shut_tx);&lt;BR /&gt;}&lt;BR /&gt;return ERR_LWIP_VAL;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;/**&lt;BR /&gt;* @ingroup altcp&lt;BR /&gt;* &lt;a href="https://community.nxp.com/t5/user/viewprofilepage/user-id/7226"&gt;@see&lt;/a&gt; tcp_write()&lt;BR /&gt;*/&lt;BR /&gt;err_t&lt;BR /&gt;altcp_write(struct altcp_pcb *conn, const void *dataptr, u16_t len, u8_t apiflags)&lt;BR /&gt;{&lt;BR /&gt;if (conn &amp;amp;&amp;amp; conn-&amp;gt;fns &amp;amp;&amp;amp; conn-&amp;gt;fns-&amp;gt;write) {&lt;BR /&gt;return conn-&amp;gt;fns-&amp;gt;write(conn, dataptr, len, apiflags);&lt;BR /&gt;}&lt;BR /&gt;return ERR_LWIP_VAL;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;/**&lt;BR /&gt;* @ingroup altcp&lt;BR /&gt;* &lt;a href="https://community.nxp.com/t5/user/viewprofilepage/user-id/7226"&gt;@see&lt;/a&gt; tcp_output()&lt;BR /&gt;*/&lt;BR /&gt;err_t&lt;BR /&gt;altcp_output(struct altcp_pcb *conn)&lt;BR /&gt;{&lt;BR /&gt;if (conn &amp;amp;&amp;amp; conn-&amp;gt;fns &amp;amp;&amp;amp; conn-&amp;gt;fns-&amp;gt;output) {&lt;BR /&gt;return conn-&amp;gt;fns-&amp;gt;output(conn);&lt;BR /&gt;}&lt;BR /&gt;return ERR_LWIP_VAL;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;/**&lt;BR /&gt;* @ingroup altcp&lt;BR /&gt;* &lt;a href="https://community.nxp.com/t5/user/viewprofilepage/user-id/7226"&gt;@see&lt;/a&gt; tcp_mss()&lt;BR /&gt;*/&lt;BR /&gt;u16_t&lt;BR /&gt;altcp_mss(struct altcp_pcb *conn)&lt;BR /&gt;{&lt;BR /&gt;if (conn &amp;amp;&amp;amp; conn-&amp;gt;fns &amp;amp;&amp;amp; conn-&amp;gt;fns-&amp;gt;mss) {&lt;BR /&gt;return conn-&amp;gt;fns-&amp;gt;mss(conn);&lt;BR /&gt;}&lt;BR /&gt;return 0;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;/**&lt;BR /&gt;* @ingroup altcp&lt;BR /&gt;* &lt;a href="https://community.nxp.com/t5/user/viewprofilepage/user-id/7226"&gt;@see&lt;/a&gt; tcp_sndbuf()&lt;BR /&gt;*/&lt;BR /&gt;u16_t&lt;BR /&gt;altcp_sndbuf(struct altcp_pcb *conn)&lt;BR /&gt;{&lt;BR /&gt;if (conn &amp;amp;&amp;amp; conn-&amp;gt;fns &amp;amp;&amp;amp; conn-&amp;gt;fns-&amp;gt;sndbuf) {&lt;BR /&gt;return conn-&amp;gt;fns-&amp;gt;sndbuf(conn);&lt;BR /&gt;}&lt;BR /&gt;return 0;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;/**&lt;BR /&gt;* @ingroup altcp&lt;BR /&gt;* &lt;a href="https://community.nxp.com/t5/user/viewprofilepage/user-id/7226"&gt;@see&lt;/a&gt; tcp_sndqueuelen()&lt;BR /&gt;*/&lt;BR /&gt;u16_t&lt;BR /&gt;altcp_sndqueuelen(struct altcp_pcb *conn)&lt;BR /&gt;{&lt;BR /&gt;if (conn &amp;amp;&amp;amp; conn-&amp;gt;fns &amp;amp;&amp;amp; conn-&amp;gt;fns-&amp;gt;sndqueuelen) {&lt;BR /&gt;return conn-&amp;gt;fns-&amp;gt;sndqueuelen(conn);&lt;BR /&gt;}&lt;BR /&gt;return 0;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;void&lt;BR /&gt;altcp_nagle_disable(struct altcp_pcb *conn)&lt;BR /&gt;{&lt;BR /&gt;if (conn &amp;amp;&amp;amp; conn-&amp;gt;fns &amp;amp;&amp;amp; conn-&amp;gt;fns-&amp;gt;nagle_disable) {&lt;BR /&gt;conn-&amp;gt;fns-&amp;gt;nagle_disable(conn);&lt;BR /&gt;}&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;void&lt;BR /&gt;altcp_nagle_enable(struct altcp_pcb *conn)&lt;BR /&gt;{&lt;BR /&gt;if (conn &amp;amp;&amp;amp; conn-&amp;gt;fns &amp;amp;&amp;amp; conn-&amp;gt;fns-&amp;gt;nagle_enable) {&lt;BR /&gt;conn-&amp;gt;fns-&amp;gt;nagle_enable(conn);&lt;BR /&gt;}&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;int&lt;BR /&gt;altcp_nagle_disabled(struct altcp_pcb *conn)&lt;BR /&gt;{&lt;BR /&gt;if (conn &amp;amp;&amp;amp; conn-&amp;gt;fns &amp;amp;&amp;amp; conn-&amp;gt;fns-&amp;gt;nagle_disabled) {&lt;BR /&gt;return conn-&amp;gt;fns-&amp;gt;nagle_disabled(conn);&lt;BR /&gt;}&lt;BR /&gt;return 0;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;/**&lt;BR /&gt;* @ingroup altcp&lt;BR /&gt;* &lt;a href="https://community.nxp.com/t5/user/viewprofilepage/user-id/7226"&gt;@see&lt;/a&gt; tcp_setprio()&lt;BR /&gt;*/&lt;BR /&gt;void&lt;BR /&gt;altcp_setprio(struct altcp_pcb *conn, u8_t prio)&lt;BR /&gt;{&lt;BR /&gt;if (conn &amp;amp;&amp;amp; conn-&amp;gt;fns &amp;amp;&amp;amp; conn-&amp;gt;fns-&amp;gt;setprio) {&lt;BR /&gt;conn-&amp;gt;fns-&amp;gt;setprio(conn, prio);&lt;BR /&gt;}&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;err_t&lt;BR /&gt;altcp_get_tcp_addrinfo(struct altcp_pcb *conn, int local, ip_addr_t *addr, u16_t *port)&lt;BR /&gt;{&lt;BR /&gt;if (conn &amp;amp;&amp;amp; conn-&amp;gt;fns &amp;amp;&amp;amp; conn-&amp;gt;fns-&amp;gt;addrinfo) {&lt;BR /&gt;return conn-&amp;gt;fns-&amp;gt;addrinfo(conn, local, addr, port);&lt;BR /&gt;}&lt;BR /&gt;return ERR_LWIP_VAL;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;ip_addr_t *&lt;BR /&gt;altcp_get_ip(struct altcp_pcb *conn, int local)&lt;BR /&gt;{&lt;BR /&gt;if (conn &amp;amp;&amp;amp; conn-&amp;gt;fns &amp;amp;&amp;amp; conn-&amp;gt;fns-&amp;gt;getip) {&lt;BR /&gt;return conn-&amp;gt;fns-&amp;gt;getip(conn, local);&lt;BR /&gt;}&lt;BR /&gt;return NULL;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;u16_t&lt;BR /&gt;altcp_get_port(struct altcp_pcb *conn, int local)&lt;BR /&gt;{&lt;BR /&gt;if (conn &amp;amp;&amp;amp; conn-&amp;gt;fns &amp;amp;&amp;amp; conn-&amp;gt;fns-&amp;gt;getport) {&lt;BR /&gt;return conn-&amp;gt;fns-&amp;gt;getport(conn, local);&lt;BR /&gt;}&lt;BR /&gt;return 0;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;#ifdef LWIP_DEBUG&lt;BR /&gt;enum tcp_state&lt;BR /&gt;altcp_dbg_get_tcp_state(struct altcp_pcb *conn)&lt;BR /&gt;{&lt;BR /&gt;if (conn &amp;amp;&amp;amp; conn-&amp;gt;fns &amp;amp;&amp;amp; conn-&amp;gt;fns-&amp;gt;dbg_get_tcp_state) {&lt;BR /&gt;return conn-&amp;gt;fns-&amp;gt;dbg_get_tcp_state(conn);&lt;BR /&gt;}&lt;BR /&gt;return CLOSED;&lt;BR /&gt;}&lt;BR /&gt;#endif&lt;/P&gt;&lt;P&gt;/* Default implementations for the "virtual" functions */&lt;/P&gt;&lt;P&gt;void&lt;BR /&gt;altcp_default_set_poll(struct altcp_pcb *conn, u8_t interval)&lt;BR /&gt;{&lt;BR /&gt;if (conn &amp;amp;&amp;amp; conn-&amp;gt;inner_conn) {&lt;BR /&gt;altcp_poll(conn-&amp;gt;inner_conn, conn-&amp;gt;poll, interval);&lt;BR /&gt;}&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;void&lt;BR /&gt;altcp_default_recved(struct altcp_pcb *conn, u16_t len)&lt;BR /&gt;{&lt;BR /&gt;if (conn &amp;amp;&amp;amp; conn-&amp;gt;inner_conn) {&lt;BR /&gt;altcp_recved(conn-&amp;gt;inner_conn, len);&lt;BR /&gt;}&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;err_t&lt;BR /&gt;altcp_default_bind(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port)&lt;BR /&gt;{&lt;BR /&gt;if (conn &amp;amp;&amp;amp; conn-&amp;gt;inner_conn) {&lt;BR /&gt;return altcp_bind(conn-&amp;gt;inner_conn, ipaddr, port);&lt;BR /&gt;}&lt;BR /&gt;return ERR_LWIP_VAL;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;err_t&lt;BR /&gt;altcp_default_shutdown(struct altcp_pcb *conn, int shut_rx, int shut_tx)&lt;BR /&gt;{&lt;BR /&gt;if (conn) {&lt;BR /&gt;if (shut_rx &amp;amp;&amp;amp; shut_tx &amp;amp;&amp;amp; conn-&amp;gt;fns &amp;amp;&amp;amp; conn-&amp;gt;fns-&amp;gt;close) {&lt;BR /&gt;/* default shutdown for both sides is close */&lt;BR /&gt;return conn-&amp;gt;fns-&amp;gt;close(conn);&lt;BR /&gt;}&lt;BR /&gt;if (conn-&amp;gt;inner_conn) {&lt;BR /&gt;return altcp_shutdown(conn-&amp;gt;inner_conn, shut_rx, shut_tx);&lt;BR /&gt;}&lt;BR /&gt;}&lt;BR /&gt;return ERR_LWIP_VAL;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;err_t&lt;BR /&gt;altcp_default_write(struct altcp_pcb *conn, const void *dataptr, u16_t len, u8_t apiflags)&lt;BR /&gt;{&lt;BR /&gt;if (conn &amp;amp;&amp;amp; conn-&amp;gt;inner_conn) {&lt;BR /&gt;return altcp_write(conn-&amp;gt;inner_conn, dataptr, len, apiflags);&lt;BR /&gt;}&lt;BR /&gt;return ERR_LWIP_VAL;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;err_t&lt;BR /&gt;altcp_default_output(struct altcp_pcb *conn)&lt;BR /&gt;{&lt;BR /&gt;if (conn &amp;amp;&amp;amp; conn-&amp;gt;inner_conn) {&lt;BR /&gt;return altcp_output(conn-&amp;gt;inner_conn);&lt;BR /&gt;}&lt;BR /&gt;return ERR_LWIP_VAL;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;u16_t&lt;BR /&gt;altcp_default_mss(struct altcp_pcb *conn)&lt;BR /&gt;{&lt;BR /&gt;if (conn &amp;amp;&amp;amp; conn-&amp;gt;inner_conn) {&lt;BR /&gt;return altcp_mss(conn-&amp;gt;inner_conn);&lt;BR /&gt;}&lt;BR /&gt;return 0;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;u16_t&lt;BR /&gt;altcp_default_sndbuf(struct altcp_pcb *conn)&lt;BR /&gt;{&lt;BR /&gt;if (conn &amp;amp;&amp;amp; conn-&amp;gt;inner_conn) {&lt;BR /&gt;return altcp_sndbuf(conn-&amp;gt;inner_conn);&lt;BR /&gt;}&lt;BR /&gt;return 0;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;u16_t&lt;BR /&gt;altcp_default_sndqueuelen(struct altcp_pcb *conn)&lt;BR /&gt;{&lt;BR /&gt;if (conn &amp;amp;&amp;amp; conn-&amp;gt;inner_conn) {&lt;BR /&gt;return altcp_sndqueuelen(conn-&amp;gt;inner_conn);&lt;BR /&gt;}&lt;BR /&gt;return 0;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;void&lt;BR /&gt;altcp_default_nagle_disable(struct altcp_pcb *conn)&lt;BR /&gt;{&lt;BR /&gt;if (conn &amp;amp;&amp;amp; conn-&amp;gt;inner_conn) {&lt;BR /&gt;altcp_nagle_disable(conn-&amp;gt;inner_conn);&lt;BR /&gt;}&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;void&lt;BR /&gt;altcp_default_nagle_enable(struct altcp_pcb *conn)&lt;BR /&gt;{&lt;BR /&gt;if (conn &amp;amp;&amp;amp; conn-&amp;gt;inner_conn) {&lt;BR /&gt;altcp_nagle_enable(conn-&amp;gt;inner_conn);&lt;BR /&gt;}&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;int&lt;BR /&gt;altcp_default_nagle_disabled(struct altcp_pcb *conn)&lt;BR /&gt;{&lt;BR /&gt;if (conn &amp;amp;&amp;amp; conn-&amp;gt;inner_conn) {&lt;BR /&gt;return altcp_nagle_disabled(conn-&amp;gt;inner_conn);&lt;BR /&gt;}&lt;BR /&gt;return 0;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;void&lt;BR /&gt;altcp_default_setprio(struct altcp_pcb *conn, u8_t prio)&lt;BR /&gt;{&lt;BR /&gt;if (conn &amp;amp;&amp;amp; conn-&amp;gt;inner_conn) {&lt;BR /&gt;altcp_setprio(conn-&amp;gt;inner_conn, prio);&lt;BR /&gt;}&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;void&lt;BR /&gt;altcp_default_dealloc(struct altcp_pcb *conn)&lt;BR /&gt;{&lt;BR /&gt;LWIP_UNUSED_ARG(conn);&lt;BR /&gt;/* nothing to do */&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;err_t&lt;BR /&gt;altcp_default_get_tcp_addrinfo(struct altcp_pcb *conn, int local, ip_addr_t *addr, u16_t *port)&lt;BR /&gt;{&lt;BR /&gt;if (conn &amp;amp;&amp;amp; conn-&amp;gt;inner_conn) {&lt;BR /&gt;return altcp_get_tcp_addrinfo(conn-&amp;gt;inner_conn, local, addr, port);&lt;BR /&gt;}&lt;BR /&gt;return ERR_LWIP_VAL;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;ip_addr_t *&lt;BR /&gt;altcp_default_get_ip(struct altcp_pcb *conn, int local)&lt;BR /&gt;{&lt;BR /&gt;if (conn &amp;amp;&amp;amp; conn-&amp;gt;inner_conn) {&lt;BR /&gt;return altcp_get_ip(conn-&amp;gt;inner_conn, local);&lt;BR /&gt;}&lt;BR /&gt;return NULL;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;u16_t&lt;BR /&gt;altcp_default_get_port(struct altcp_pcb *conn, int local)&lt;BR /&gt;{&lt;BR /&gt;if (conn &amp;amp;&amp;amp; conn-&amp;gt;inner_conn) {&lt;BR /&gt;return altcp_get_port(conn-&amp;gt;inner_conn, local);&lt;BR /&gt;}&lt;BR /&gt;return 0;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;#ifdef LWIP_DEBUG&lt;BR /&gt;enum tcp_state&lt;BR /&gt;altcp_default_dbg_get_tcp_state(struct altcp_pcb *conn)&lt;BR /&gt;{&lt;BR /&gt;if (conn &amp;amp;&amp;amp; conn-&amp;gt;inner_conn) {&lt;BR /&gt;return altcp_dbg_get_tcp_state(conn-&amp;gt;inner_conn);&lt;BR /&gt;}&lt;BR /&gt;return CLOSED;&lt;BR /&gt;}&lt;BR /&gt;#endif&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;#endif /* LWIP_ALTCP */&lt;/P&gt;&lt;P&gt;/* ###################################################################&lt;BR /&gt;** Filename : qoconfig.c&lt;BR /&gt;** Project : Qometer&lt;BR /&gt;** Processor : MK20DX256VLH7&lt;BR /&gt;** Component :&lt;BR /&gt;** Version : Driver 01.00&lt;BR /&gt;** Compiler : GNU C Compiler&lt;BR /&gt;** Date/Time : 2020-03-20, 12:16, # CodeGen: 0&lt;BR /&gt;** Abstract :&lt;BR /&gt;** Interface to update the config from the server&lt;BR /&gt;** Contents :&lt;BR /&gt;**&lt;BR /&gt;** ###################################################################*/&lt;BR /&gt;/*!&lt;BR /&gt;** @file qoconfig.c&lt;BR /&gt;** @version 01.00&lt;BR /&gt;** @brief&lt;BR /&gt;** Interface to update the config from the server&lt;BR /&gt;*/&lt;BR /&gt;/*!&lt;BR /&gt;** @{&lt;BR /&gt;*/&lt;BR /&gt;/* MODULE qoconfig */&lt;BR /&gt;/*====================================================================*&lt;BR /&gt;* system header files;&lt;BR /&gt;*--------------------------------------------------------------------*/&lt;BR /&gt;#include &amp;lt;stddef.h&amp;gt;&lt;BR /&gt;#include &amp;lt;stdint.h&amp;gt;&lt;BR /&gt;#include &amp;lt;string.h&amp;gt;&lt;BR /&gt;/*====================================================================*&lt;BR /&gt;* qometer header files;&lt;BR /&gt;*--------------------------------------------------------------------*/&lt;BR /&gt;#include "qometer.h"&lt;BR /&gt;#include "qonetif.h"&lt;BR /&gt;#include "qoconfig.h"&lt;BR /&gt;/*====================================================================*&lt;BR /&gt;* lwip header files;&lt;BR /&gt;*--------------------------------------------------------------------*/&lt;BR /&gt;#include "lwip/opt.h"&lt;BR /&gt;#include "lwip/netif.h"&lt;BR /&gt;#include "lwip/def.h"&lt;BR /&gt;#include "lwip/ip_addr.h"&lt;BR /&gt;#include "lwip/err.h"&lt;BR /&gt;#include "lwip/apps/http_client.h"&lt;BR /&gt;/*====================================================================*&lt;BR /&gt;* constante;&lt;BR /&gt;*--------------------------------------------------------------------*/&lt;BR /&gt;&lt;BR /&gt;#define URL "qometer-1a797-default-rtdb.firebaseio.com"&lt;/P&gt;&lt;P&gt;#define PING "/ping/"&lt;/P&gt;&lt;P&gt;#define MAX_SIZE_MSG 300&lt;BR /&gt;#define TOTAL_POWER "totalPower"&lt;BR /&gt;#define FIRMWARE_URL "firmwareUrl"&lt;BR /&gt;#define FIRMWARE_VERSION "firmwareVersion"&lt;BR /&gt;#define FIRMWARE_CRC "firmwareCrc"&lt;BR /&gt;#define MODE_POWER_LIMIT "mode"&lt;BR /&gt;#define POWER_LIMIT_SHEDDER "availablePower"&lt;BR /&gt;#define THRESHOLD "threshold"&lt;BR /&gt;#define LOAD_SHEDDER "LOAD_SHEDDER"&lt;BR /&gt;#define REGULATOR "REGULATOR"&lt;BR /&gt;/*====================================================================*&lt;BR /&gt;* static variable;&lt;BR /&gt;*--------------------------------------------------------------------*/&lt;BR /&gt;static struct ip4_addr ip_server;&lt;BR /&gt;static struct qoconfigResult result;&lt;BR /&gt;static httpc_connection_t connSettingsConfig;&lt;BR /&gt;/*====================================================================*&lt;BR /&gt;* static function;&lt;BR /&gt;*--------------------------------------------------------------------*/&lt;BR /&gt;static uint8_t qoconfigGetUrl(uint8_t *url, uint32_t sizeUrl);&lt;/P&gt;&lt;P&gt;static err_t RecvHttpHeaderCallbackConfig (httpc_state_t *connection,&lt;BR /&gt;void *arg,&lt;BR /&gt;struct pbuf *hdr,&lt;BR /&gt;uint16_t hdr_len,&lt;BR /&gt;uint32_t content_len);&lt;/P&gt;&lt;P&gt;static err_t HttpClientResultCallbackConfig (void *arg,&lt;BR /&gt;struct tcp_pcb *tpcb,&lt;BR /&gt;struct pbuf *p,&lt;BR /&gt;err_t err) ;&lt;/P&gt;&lt;P&gt;/*====================================================================*&lt;BR /&gt;* qoupdate functions;&lt;BR /&gt;*--------------------------------------------------------------------*/&lt;/P&gt;&lt;P&gt;/**&lt;BR /&gt;*&lt;BR /&gt;* @brief Function to get thr url for the get config&lt;BR /&gt;* &lt;a href="https://community.nxp.com/t5/user/viewprofilepage/user-id/197964"&gt;@Param&lt;/a&gt; url to store thr url&lt;BR /&gt;* &lt;a href="https://community.nxp.com/t5/user/viewprofilepage/user-id/197964"&gt;@Param&lt;/a&gt; sizeUrl the size max of the url&lt;BR /&gt;* @retval FALSE on success&lt;BR /&gt;* @retval TRUE when an error occurs or the space is not enough&lt;BR /&gt;*&lt;BR /&gt;*/&lt;BR /&gt;static uint8_t qoconfigGetUrl(uint8_t *url, uint32_t sizeUrl) {&lt;BR /&gt;if(url == NULL)&lt;BR /&gt;return TRUE;&lt;/P&gt;&lt;P&gt;uint8_t macAddress[6] = {0};&lt;BR /&gt;uint8_t macAddresStr[13] = {0};&lt;/P&gt;&lt;P&gt;/* the ping url format is : /ping/macAddress?crc=0x0000&amp;amp;status=AVAILABLE&lt;BR /&gt;mac address : the qometer's mac address&lt;BR /&gt;crc : the crc32 of the last answer of the ping&lt;BR /&gt;status : status of the qometer*/&lt;/P&gt;&lt;P&gt;/* check if the space is enough */&lt;BR /&gt;if(strlen(url) + strlen(PING)&amp;gt;sizeUrl)&lt;BR /&gt;return TRUE;&lt;/P&gt;&lt;P&gt;strcat(url,PING);&lt;/P&gt;&lt;P&gt;/* get the mac address */&lt;BR /&gt;if(qoflashGetValShared(MAC_ADDRESS,(uint32_t*) macAddress))&lt;BR /&gt;return TRUE;&lt;BR /&gt;//macAddress[0] = 0x00;&lt;BR /&gt;//macAddress[1] = 0x01;&lt;BR /&gt;//macAddress[2] = 0x87;&lt;BR /&gt;//macAddress[3] = 0x10;&lt;BR /&gt;//macAddress[4] = 0x88;&lt;BR /&gt;// macAddress[5] = 0xAA;&lt;BR /&gt;/*convert the mac in str */&lt;BR /&gt;for(uint32_t i=0; i&amp;lt;6; i++){&lt;BR /&gt;if(!sprintf((macAddresStr+i*2), "%02x", macAddress[i]))&lt;BR /&gt;return TRUE;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;/* check if the space is enough */&lt;BR /&gt;if(strlen(url) + strlen(macAddresStr) + 1 &amp;gt;sizeUrl)&lt;BR /&gt;return TRUE;&lt;/P&gt;&lt;P&gt;strcat(url,macAddresStr);&lt;/P&gt;&lt;P&gt;/* check if the space is enough */&lt;BR /&gt;if(strlen(url) + strlen("?crc=0x0000&amp;amp;status=AVAILABLE")&amp;gt;sizeUrl)&lt;BR /&gt;return TRUE;&lt;BR /&gt;&lt;BR /&gt;strcat(url,"?crc=0x0000&amp;amp;status=AVAILABLE");&lt;/P&gt;&lt;P&gt;return FALSE;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/**&lt;BR /&gt;*&lt;BR /&gt;* @brief Send the request HTTP to get the config&lt;BR /&gt;* &lt;a href="https://community.nxp.com/t5/user/viewprofilepage/user-id/197964"&gt;@Param&lt;/a&gt; serverName the DNS server name&lt;BR /&gt;* &lt;a href="https://community.nxp.com/t5/user/viewprofilepage/user-id/197964"&gt;@Param&lt;/a&gt; port port TCP&lt;BR /&gt;* &lt;a href="https://community.nxp.com/t5/user/viewprofilepage/user-id/197964"&gt;@Param&lt;/a&gt; uri uri to get from the server, remember leading "/"!&lt;BR /&gt;* @retval QOCONFIG_OK on success&lt;BR /&gt;* @retval QOCONFIG_FAILED when failed to send the request HTTP&lt;BR /&gt;*&lt;BR /&gt;*&lt;BR /&gt;*/&lt;BR /&gt;enum qoconfigErr qoconfigGetConfigDns(struct qoconfigResult* result) {&lt;BR /&gt;int16_t err;&lt;BR /&gt;httpc_state_t *connection;&lt;BR /&gt;uint8_t url[MAX_SIZE_MSG] = {0};&lt;BR /&gt;connSettingsConfig.use_proxy = 0;&lt;BR /&gt;connSettingsConfig.result_fn = NULL;&lt;BR /&gt;connSettingsConfig.headers_done_fn = RecvHttpHeaderCallbackConfig;&lt;/P&gt;&lt;P&gt;/* Get the URL */&lt;BR /&gt;qoconfigGetUrl(url,MAX_SIZE_MSG);&lt;BR /&gt;&lt;BR /&gt;if(!httpc_get_file_dns(QOVOLTIS_SERVER_NAME,&lt;BR /&gt;PORT_HTTP,&lt;BR /&gt;url,&lt;BR /&gt;&amp;amp;connSettingsConfig,&lt;BR /&gt;HttpClientResultCallbackConfig,&lt;BR /&gt;(void*) result,&lt;BR /&gt;&amp;amp;connection)){&lt;BR /&gt;result-&amp;gt;state = START_GET_CONFIG;&lt;BR /&gt;return QOCONFIG_OK;&lt;BR /&gt;}&lt;BR /&gt;return QOCONFIG_FAILED;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;/**&lt;BR /&gt;* @brief callback : called when the headers are received&lt;BR /&gt;* &lt;a href="https://community.nxp.com/t5/user/viewprofilepage/user-id/197964"&gt;@Param&lt;/a&gt; input are definies by lwip&lt;BR /&gt;*/&lt;BR /&gt;static err_t RecvHttpHeaderCallbackConfig (httpc_state_t *connection,&lt;BR /&gt;void *arg,&lt;BR /&gt;struct pbuf *hdr,&lt;BR /&gt;uint16_t hdr_len,&lt;BR /&gt;uint32_t content_len) {&lt;BR /&gt;if((hdr == NULL) || (connection == NULL) || (arg == NULL))&lt;BR /&gt;return ERR_LWIP_ARG;&lt;BR /&gt;struct qoconfigResult* result = (struct qoconfigResult*) arg;&lt;BR /&gt;/* Check the answer is OK from server */&lt;BR /&gt;if(strstr(hdr-&amp;gt;payload,HTTP_OK)) {&lt;BR /&gt;result-&amp;gt;state = HEADER_OK_GET_CONFIG;&lt;BR /&gt;return ERR_LWIP_OK;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;return ERR_LWIP_ABRT;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;/**&lt;BR /&gt;* @brief callback : called when the data are received&lt;BR /&gt;* &lt;a href="https://community.nxp.com/t5/user/viewprofilepage/user-id/197964"&gt;@Param&lt;/a&gt; input are definies by lwip&lt;BR /&gt;*/&lt;BR /&gt;static err_t HttpClientResultCallbackConfig (void *arg,&lt;BR /&gt;struct tcp_pcb *tpcb,&lt;BR /&gt;struct pbuf *p,&lt;BR /&gt;err_t err) {&lt;BR /&gt;struct pbuf *data = (struct pbuf*) p;&lt;BR /&gt;char* positionInData = NULL;&lt;BR /&gt;struct qoconfigResult* result = (struct qoconfigResult*) arg;&lt;BR /&gt;if((data == NULL) || (arg == NULL))&lt;BR /&gt;return;&lt;/P&gt;&lt;P&gt;if(result-&amp;gt;state != HEADER_OK_GET_CONFIG)&lt;BR /&gt;return;&lt;BR /&gt;/* parse the parameter : total power */&lt;BR /&gt;if(positionInData = strstr((char*)data-&amp;gt;payload,TOTAL_POWER)) {&lt;BR /&gt;while((*positionInData != '=') &amp;amp;&amp;amp; (positionInData != (data-&amp;gt;payload + data-&amp;gt;tot_len)))&lt;BR /&gt;positionInData++;&lt;BR /&gt;positionInData++;&lt;BR /&gt;result-&amp;gt;totalPower = strtol(positionInData,&amp;amp;positionInData,BASE10);&lt;BR /&gt;}&lt;BR /&gt;else&lt;BR /&gt;result-&amp;gt;totalPower = 0;&lt;BR /&gt;&lt;BR /&gt;/* Set the new value in the FALSH */&lt;BR /&gt;qoflashSetValShared(POWER_LIMIT_CONFIG,result-&amp;gt;totalPower);&lt;/P&gt;&lt;P&gt;/* parse the url for firmware update */&lt;BR /&gt;if(positionInData = strstr((char*)data-&amp;gt;payload,FIRMWARE_URL)) {&lt;BR /&gt;while((*positionInData != '/') &amp;amp;&amp;amp;&lt;BR /&gt;(positionInData != (data-&amp;gt;payload + data-&amp;gt;tot_len)))&lt;BR /&gt;positionInData ++;&lt;/P&gt;&lt;P&gt;/* parse the server name */&lt;BR /&gt;positionInData = positionInData + 2;&lt;BR /&gt;uint16_t lenght = 0;&lt;BR /&gt;uint32_t index = 0;&lt;BR /&gt;while((index&amp;lt;LENGHT_MAX) &amp;amp;&amp;amp; ((uint32_t*) positionInData &amp;lt;&lt;BR /&gt;(uint32_t*) (data-&amp;gt;payload + data-&amp;gt;tot_len))&lt;BR /&gt;&amp;amp;&amp;amp; (*positionInData != '/')&lt;BR /&gt;&amp;amp;&amp;amp; (*positionInData != ':')) {&lt;BR /&gt;result-&amp;gt;serverName[index++] = *positionInData;&lt;BR /&gt;lenght++;&lt;BR /&gt;positionInData++;&lt;BR /&gt;}&lt;BR /&gt;result-&amp;gt;serverName[index + 1] = '\0';&lt;BR /&gt;result-&amp;gt;lenghtServerName = lenght;&lt;BR /&gt;/* drop the port */&lt;BR /&gt;if(*positionInData == ':'){&lt;BR /&gt;while(*positionInData != '/')&lt;BR /&gt;positionInData ++;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;/* parse the url */&lt;BR /&gt;lenght = 0;&lt;BR /&gt;index = 0;&lt;BR /&gt;while((index&amp;lt;LENGHT_MAX) &amp;amp;&amp;amp; (*positionInData != '\0') &amp;amp;&amp;amp; (*positionInData != '|')&lt;BR /&gt;&amp;amp;&amp;amp; ((uint32_t*) positionInData &amp;lt; (uint32_t*) (data-&amp;gt;payload + data-&amp;gt;tot_len))){&lt;BR /&gt;result-&amp;gt;uri[index++] = *positionInData;&lt;BR /&gt;lenght++;&lt;BR /&gt;positionInData ++;&lt;BR /&gt;}&lt;BR /&gt;result-&amp;gt;uri[index + 1] = '\0';&lt;BR /&gt;result-&amp;gt;lenghtUri = lenght;&lt;BR /&gt;}&lt;BR /&gt;else&lt;BR /&gt;result-&amp;gt;lenghtServerName = 0;&lt;BR /&gt;/* parse the firmware version */&lt;BR /&gt;if(positionInData = strstr((char*)data-&amp;gt;payload,FIRMWARE_VERSION)) {&lt;BR /&gt;while((*positionInData != '=') &amp;amp;&amp;amp; (positionInData != (data-&amp;gt;payload + data-&amp;gt;tot_len)))&lt;BR /&gt;positionInData++;&lt;BR /&gt;positionInData++;&lt;BR /&gt;uint32_t index = 0;&lt;BR /&gt;while((index&amp;lt;LENGHT_MAX) &amp;amp;&amp;amp; (*positionInData != '\0') &amp;amp;&amp;amp; (*positionInData != '|')&lt;BR /&gt;&amp;amp;&amp;amp; ((uint32_t*) positionInData &amp;lt; (uint32_t*) (data-&amp;gt;payload + data-&amp;gt;tot_len))){&lt;BR /&gt;result-&amp;gt;firmwareVersion[index++] = *positionInData;&lt;BR /&gt;positionInData ++;&lt;BR /&gt;}&lt;BR /&gt;result-&amp;gt;firmwareVersion[index + 1] = '\0';&lt;BR /&gt;}&lt;BR /&gt;else {&lt;BR /&gt;result-&amp;gt;firmwareVersion[0] = "-";&lt;BR /&gt;result-&amp;gt;firmwareVersion[1] = "1";&lt;BR /&gt;}&lt;BR /&gt;/* parse the CRC firmware */&lt;BR /&gt;if(positionInData = strstr((char*)data-&amp;gt;payload,FIRMWARE_CRC)) {&lt;BR /&gt;while((*positionInData != '=') &amp;amp;&amp;amp; (positionInData != (data-&amp;gt;payload + data-&amp;gt;tot_len)))&lt;BR /&gt;positionInData++;&lt;BR /&gt;positionInData++;&lt;BR /&gt;result-&amp;gt;firmwareCrc = strtoul(positionInData,&amp;amp;positionInData,0);&lt;BR /&gt;}&lt;BR /&gt;/* parse the power mode */&lt;BR /&gt;if(positionInData = strstr((char*)data-&amp;gt;payload,MODE_POWER_LIMIT)) {&lt;BR /&gt;while((*positionInData != '=') &amp;amp;&amp;amp; (positionInData != (data-&amp;gt;payload + data-&amp;gt;tot_len)))&lt;BR /&gt;positionInData++;&lt;BR /&gt;positionInData++;&lt;BR /&gt;// if(strstr((char*)data-&amp;gt;payload,LOAD_SHEDDER))&lt;BR /&gt;// result-&amp;gt;powerMode = POWER_MODE_LOAD_SHEDDER;&lt;BR /&gt;//else&lt;BR /&gt;result-&amp;gt;powerMode = POWER_MODE_REGULATOR;&lt;BR /&gt;}&lt;BR /&gt;/* parse the power limit load shedder */&lt;BR /&gt;/*if(positionInData = strstr((char*)data-&amp;gt;payload,POWER_LIMIT_SHEDDER)) {&lt;BR /&gt;while((*positionInData != '=') &amp;amp;&amp;amp; (positionInData != (data-&amp;gt;payload + data-&amp;gt;tot_len)))&lt;BR /&gt;positionInData++;&lt;BR /&gt;positionInData++;&lt;BR /&gt;result-&amp;gt;powerLimitLoadShedder = strtoul(positionInData,&amp;amp;positionInData,0);&lt;BR /&gt;}*/&lt;BR /&gt;/* parse threshold */&lt;BR /&gt;if(positionInData = strstr((char*)data-&amp;gt;payload,THRESHOLD)) {&lt;BR /&gt;while((*positionInData != '=') &amp;amp;&amp;amp; (positionInData != (data-&amp;gt;payload + data-&amp;gt;tot_len)))&lt;BR /&gt;positionInData++;&lt;BR /&gt;positionInData++;&lt;BR /&gt;result-&amp;gt;threshold = strtoul(positionInData,&amp;amp;positionInData,0);&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;result-&amp;gt;state = DONE_GET_CONFIG;&lt;BR /&gt;return FALSE;&lt;BR /&gt;}&lt;/P&gt;</description>
      <pubDate>Thu, 26 Jan 2023 18:48:48 GMT</pubDate>
      <guid>https://community.nxp.com/t5/MCUXpresso-General/Lwip-Client-Echo-Application-SOLVED/m-p/1588484#M4842</guid>
      <dc:creator>Roua</dc:creator>
      <dc:date>2023-01-26T18:48:48Z</dc:date>
    </item>
  </channel>
</rss>

