Example program with HTTPServer and sensor data streaming over TCPSockets, using Donatien Garnier's Net APIs and services code on top of LWIP. Files StreamServer.h and .cpp encapsulate streaming over TCPSockets. Broadcast is done by sendToAll(), and all incoming data is echoed back to the client. Echo code can be replaced with some remote control of the streaming interface. See main() that shows how to periodically send some data to all subscribed clients. To subscribe, a client should open a socket at <mbed_ip> port 123. I used few lines in TCL code to set up a quick sink for the data. HTTP files are served on port 80 concurrently to the streaming.

Dependencies:   mbed

Committer:
iva2k
Date:
Sat Jun 12 06:01:50 2010 +0000
Revision:
0:e614f7875b60

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
iva2k 0:e614f7875b60 1 /*
iva2k 0:e614f7875b60 2 * Copyright (c) 2001-2003 Swedish Institute of Computer Science.
iva2k 0:e614f7875b60 3 * Copyright (c) 2003-2004 Leon Woestenberg <leon.woestenberg@axon.tv>
iva2k 0:e614f7875b60 4 * Copyright (c) 2003-2004 Axon Digital Design B.V., The Netherlands.
iva2k 0:e614f7875b60 5 * All rights reserved.
iva2k 0:e614f7875b60 6 *
iva2k 0:e614f7875b60 7 * Redistribution and use in source and binary forms, with or without modification,
iva2k 0:e614f7875b60 8 * are permitted provided that the following conditions are met:
iva2k 0:e614f7875b60 9 *
iva2k 0:e614f7875b60 10 * 1. Redistributions of source code must retain the above copyright notice,
iva2k 0:e614f7875b60 11 * this list of conditions and the following disclaimer.
iva2k 0:e614f7875b60 12 * 2. Redistributions in binary form must reproduce the above copyright notice,
iva2k 0:e614f7875b60 13 * this list of conditions and the following disclaimer in the documentation
iva2k 0:e614f7875b60 14 * and/or other materials provided with the distribution.
iva2k 0:e614f7875b60 15 * 3. The name of the author may not be used to endorse or promote products
iva2k 0:e614f7875b60 16 * derived from this software without specific prior written permission.
iva2k 0:e614f7875b60 17 *
iva2k 0:e614f7875b60 18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
iva2k 0:e614f7875b60 19 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
iva2k 0:e614f7875b60 20 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
iva2k 0:e614f7875b60 21 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
iva2k 0:e614f7875b60 22 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
iva2k 0:e614f7875b60 23 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
iva2k 0:e614f7875b60 24 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
iva2k 0:e614f7875b60 25 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
iva2k 0:e614f7875b60 26 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
iva2k 0:e614f7875b60 27 * OF SUCH DAMAGE.
iva2k 0:e614f7875b60 28 *
iva2k 0:e614f7875b60 29 * This file is part of the lwIP TCP/IP stack.
iva2k 0:e614f7875b60 30 *
iva2k 0:e614f7875b60 31 * Author: Adam Dunkels <adam@sics.se>
iva2k 0:e614f7875b60 32 *
iva2k 0:e614f7875b60 33 */
iva2k 0:e614f7875b60 34
iva2k 0:e614f7875b60 35 #ifndef __NETIF_ETHARP_H__
iva2k 0:e614f7875b60 36 #define __NETIF_ETHARP_H__
iva2k 0:e614f7875b60 37
iva2k 0:e614f7875b60 38 #include "lwip/opt.h"
iva2k 0:e614f7875b60 39
iva2k 0:e614f7875b60 40 #if LWIP_ARP || LWIP_ETHERNET /* don't build if not configured for use in lwipopts.h */
iva2k 0:e614f7875b60 41
iva2k 0:e614f7875b60 42 #include "lwip/pbuf.h"
iva2k 0:e614f7875b60 43 #include "lwip/ip_addr.h"
iva2k 0:e614f7875b60 44 #include "lwip/netif.h"
iva2k 0:e614f7875b60 45 #include "lwip/ip.h"
iva2k 0:e614f7875b60 46
iva2k 0:e614f7875b60 47 #ifdef __cplusplus
iva2k 0:e614f7875b60 48 extern "C" {
iva2k 0:e614f7875b60 49 #endif
iva2k 0:e614f7875b60 50
iva2k 0:e614f7875b60 51 #ifndef ETHARP_HWADDR_LEN
iva2k 0:e614f7875b60 52 #define ETHARP_HWADDR_LEN 6
iva2k 0:e614f7875b60 53 #endif
iva2k 0:e614f7875b60 54
iva2k 0:e614f7875b60 55 #ifdef PACK_STRUCT_USE_INCLUDES
iva2k 0:e614f7875b60 56 # include "arch/bpstruct.h"
iva2k 0:e614f7875b60 57 #endif
iva2k 0:e614f7875b60 58 PACK_STRUCT_BEGIN
iva2k 0:e614f7875b60 59 struct eth_addr {
iva2k 0:e614f7875b60 60 PACK_STRUCT_FIELD(u8_t addr[ETHARP_HWADDR_LEN]);
iva2k 0:e614f7875b60 61 } PACK_STRUCT_STRUCT;
iva2k 0:e614f7875b60 62 PACK_STRUCT_END
iva2k 0:e614f7875b60 63 #ifdef PACK_STRUCT_USE_INCLUDES
iva2k 0:e614f7875b60 64 # include "arch/epstruct.h"
iva2k 0:e614f7875b60 65 #endif
iva2k 0:e614f7875b60 66
iva2k 0:e614f7875b60 67 #ifdef PACK_STRUCT_USE_INCLUDES
iva2k 0:e614f7875b60 68 # include "arch/bpstruct.h"
iva2k 0:e614f7875b60 69 #endif
iva2k 0:e614f7875b60 70 PACK_STRUCT_BEGIN
iva2k 0:e614f7875b60 71 /** Ethernet header */
iva2k 0:e614f7875b60 72 struct eth_hdr {
iva2k 0:e614f7875b60 73 #if ETH_PAD_SIZE
iva2k 0:e614f7875b60 74 PACK_STRUCT_FIELD(u8_t padding[ETH_PAD_SIZE]);
iva2k 0:e614f7875b60 75 #endif
iva2k 0:e614f7875b60 76 PACK_STRUCT_FIELD(struct eth_addr dest);
iva2k 0:e614f7875b60 77 PACK_STRUCT_FIELD(struct eth_addr src);
iva2k 0:e614f7875b60 78 PACK_STRUCT_FIELD(u16_t type);
iva2k 0:e614f7875b60 79 } PACK_STRUCT_STRUCT;
iva2k 0:e614f7875b60 80 PACK_STRUCT_END
iva2k 0:e614f7875b60 81 #ifdef PACK_STRUCT_USE_INCLUDES
iva2k 0:e614f7875b60 82 # include "arch/epstruct.h"
iva2k 0:e614f7875b60 83 #endif
iva2k 0:e614f7875b60 84
iva2k 0:e614f7875b60 85 #define SIZEOF_ETH_HDR (14 + ETH_PAD_SIZE)
iva2k 0:e614f7875b60 86
iva2k 0:e614f7875b60 87 #if ETHARP_SUPPORT_VLAN
iva2k 0:e614f7875b60 88
iva2k 0:e614f7875b60 89 #ifdef PACK_STRUCT_USE_INCLUDES
iva2k 0:e614f7875b60 90 # include "arch/bpstruct.h"
iva2k 0:e614f7875b60 91 #endif
iva2k 0:e614f7875b60 92 PACK_STRUCT_BEGIN
iva2k 0:e614f7875b60 93 /** VLAN header inserted between ethernet header and payload
iva2k 0:e614f7875b60 94 * if 'type' in ethernet header is ETHTYPE_VLAN.
iva2k 0:e614f7875b60 95 * See IEEE802.Q */
iva2k 0:e614f7875b60 96 struct eth_vlan_hdr {
iva2k 0:e614f7875b60 97 PACK_STRUCT_FIELD(u16_t tpid);
iva2k 0:e614f7875b60 98 PACK_STRUCT_FIELD(u16_t prio_vid);
iva2k 0:e614f7875b60 99 } PACK_STRUCT_STRUCT;
iva2k 0:e614f7875b60 100 PACK_STRUCT_END
iva2k 0:e614f7875b60 101 #ifdef PACK_STRUCT_USE_INCLUDES
iva2k 0:e614f7875b60 102 # include "arch/epstruct.h"
iva2k 0:e614f7875b60 103 #endif
iva2k 0:e614f7875b60 104
iva2k 0:e614f7875b60 105 #define SIZEOF_VLAN_HDR 4
iva2k 0:e614f7875b60 106 #define VLAN_ID(vlan_hdr) (htons((vlan_hdr)->prio_vid) & 0xFFF)
iva2k 0:e614f7875b60 107
iva2k 0:e614f7875b60 108 #endif /* ETHARP_SUPPORT_VLAN */
iva2k 0:e614f7875b60 109
iva2k 0:e614f7875b60 110 #ifdef PACK_STRUCT_USE_INCLUDES
iva2k 0:e614f7875b60 111 # include "arch/bpstruct.h"
iva2k 0:e614f7875b60 112 #endif
iva2k 0:e614f7875b60 113 PACK_STRUCT_BEGIN
iva2k 0:e614f7875b60 114 /** the ARP message, see RFC 826 ("Packet format") */
iva2k 0:e614f7875b60 115 struct etharp_hdr {
iva2k 0:e614f7875b60 116 PACK_STRUCT_FIELD(u16_t hwtype);
iva2k 0:e614f7875b60 117 PACK_STRUCT_FIELD(u16_t proto);
iva2k 0:e614f7875b60 118 PACK_STRUCT_FIELD(u16_t _hwlen_protolen);
iva2k 0:e614f7875b60 119 PACK_STRUCT_FIELD(u16_t opcode);
iva2k 0:e614f7875b60 120 PACK_STRUCT_FIELD(struct eth_addr shwaddr);
iva2k 0:e614f7875b60 121 PACK_STRUCT_FIELD(struct ip_addr2 sipaddr);
iva2k 0:e614f7875b60 122 PACK_STRUCT_FIELD(struct eth_addr dhwaddr);
iva2k 0:e614f7875b60 123 PACK_STRUCT_FIELD(struct ip_addr2 dipaddr);
iva2k 0:e614f7875b60 124 } PACK_STRUCT_STRUCT;
iva2k 0:e614f7875b60 125 PACK_STRUCT_END
iva2k 0:e614f7875b60 126 #ifdef PACK_STRUCT_USE_INCLUDES
iva2k 0:e614f7875b60 127 # include "arch/epstruct.h"
iva2k 0:e614f7875b60 128 #endif
iva2k 0:e614f7875b60 129
iva2k 0:e614f7875b60 130 #define SIZEOF_ETHARP_HDR 28
iva2k 0:e614f7875b60 131 #define SIZEOF_ETHARP_PACKET (SIZEOF_ETH_HDR + SIZEOF_ETHARP_HDR)
iva2k 0:e614f7875b60 132
iva2k 0:e614f7875b60 133 /** 5 seconds period */
iva2k 0:e614f7875b60 134 #define ARP_TMR_INTERVAL 5000
iva2k 0:e614f7875b60 135
iva2k 0:e614f7875b60 136 #define ETHTYPE_ARP 0x0806
iva2k 0:e614f7875b60 137 #define ETHTYPE_IP 0x0800
iva2k 0:e614f7875b60 138 #define ETHTYPE_VLAN 0x8100
iva2k 0:e614f7875b60 139 #define ETHTYPE_PPPOEDISC 0x8863 /* PPP Over Ethernet Discovery Stage */
iva2k 0:e614f7875b60 140 #define ETHTYPE_PPPOE 0x8864 /* PPP Over Ethernet Session Stage */
iva2k 0:e614f7875b60 141
iva2k 0:e614f7875b60 142 #if LWIP_ARP /* don't build if not configured for use in lwipopts.h */
iva2k 0:e614f7875b60 143
iva2k 0:e614f7875b60 144 /** ARP message types (opcodes) */
iva2k 0:e614f7875b60 145 #define ARP_REQUEST 1
iva2k 0:e614f7875b60 146 #define ARP_REPLY 2
iva2k 0:e614f7875b60 147
iva2k 0:e614f7875b60 148 #if ARP_QUEUEING
iva2k 0:e614f7875b60 149 /** struct for queueing outgoing packets for unknown address
iva2k 0:e614f7875b60 150 * defined here to be accessed by memp.h
iva2k 0:e614f7875b60 151 */
iva2k 0:e614f7875b60 152 struct etharp_q_entry {
iva2k 0:e614f7875b60 153 struct etharp_q_entry *next;
iva2k 0:e614f7875b60 154 struct pbuf *p;
iva2k 0:e614f7875b60 155 };
iva2k 0:e614f7875b60 156 #endif /* ARP_QUEUEING */
iva2k 0:e614f7875b60 157
iva2k 0:e614f7875b60 158 #define etharp_init() /* Compatibility define, not init needed. */
iva2k 0:e614f7875b60 159 void etharp_tmr(void);
iva2k 0:e614f7875b60 160 s8_t etharp_find_addr(struct netif *netif, ip_addr_t *ipaddr,
iva2k 0:e614f7875b60 161 struct eth_addr **eth_ret, ip_addr_t **ip_ret);
iva2k 0:e614f7875b60 162 err_t etharp_output(struct netif *netif, struct pbuf *q, ip_addr_t *ipaddr);
iva2k 0:e614f7875b60 163 err_t etharp_query(struct netif *netif, ip_addr_t *ipaddr, struct pbuf *q);
iva2k 0:e614f7875b60 164 err_t etharp_request(struct netif *netif, ip_addr_t *ipaddr);
iva2k 0:e614f7875b60 165 /** For Ethernet network interfaces, we might want to send "gratuitous ARP";
iva2k 0:e614f7875b60 166 * this is an ARP packet sent by a node in order to spontaneously cause other
iva2k 0:e614f7875b60 167 * nodes to update an entry in their ARP cache.
iva2k 0:e614f7875b60 168 * From RFC 3220 "IP Mobility Support for IPv4" section 4.6. */
iva2k 0:e614f7875b60 169 #define etharp_gratuitous(netif) etharp_request((netif), &(netif)->ip_addr)
iva2k 0:e614f7875b60 170
iva2k 0:e614f7875b60 171 #if LWIP_AUTOIP
iva2k 0:e614f7875b60 172 err_t etharp_raw(struct netif *netif, const struct eth_addr *ethsrc_addr,
iva2k 0:e614f7875b60 173 const struct eth_addr *ethdst_addr,
iva2k 0:e614f7875b60 174 const struct eth_addr *hwsrc_addr, const ip_addr_t *ipsrc_addr,
iva2k 0:e614f7875b60 175 const struct eth_addr *hwdst_addr, const ip_addr_t *ipdst_addr,
iva2k 0:e614f7875b60 176 const u16_t opcode);
iva2k 0:e614f7875b60 177 #endif /* LWIP_AUTOIP */
iva2k 0:e614f7875b60 178
iva2k 0:e614f7875b60 179
iva2k 0:e614f7875b60 180 #endif /* LWIP_ARP */
iva2k 0:e614f7875b60 181
iva2k 0:e614f7875b60 182 err_t ethernet_input(struct pbuf *p, struct netif *netif);
iva2k 0:e614f7875b60 183
iva2k 0:e614f7875b60 184 #define eth_addr_cmp(addr1, addr2) (memcmp((addr1)->addr, (addr2)->addr, ETHARP_HWADDR_LEN) == 0)
iva2k 0:e614f7875b60 185
iva2k 0:e614f7875b60 186 extern const struct eth_addr ethbroadcast, ethzero;
iva2k 0:e614f7875b60 187
iva2k 0:e614f7875b60 188 #ifdef __cplusplus
iva2k 0:e614f7875b60 189 }
iva2k 0:e614f7875b60 190 #endif
iva2k 0:e614f7875b60 191
iva2k 0:e614f7875b60 192 #endif /* LWIP_ARP || LWIP_ETHERNET */
iva2k 0:e614f7875b60 193
iva2k 0:e614f7875b60 194 #endif /* __NETIF_ARP_H__ */