Some quick code to use UDP-only (no TCP) with mBed. Echos received packets and sends packets when a button is pressed

Dependencies:   mbed

Committer:
pehrhovey
Date:
Sun Mar 14 00:54:12 2010 +0000
Revision:
0:a548a085de55

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pehrhovey 0:a548a085de55 1 #include "mbed.h"
pehrhovey 0:a548a085de55 2
pehrhovey 0:a548a085de55 3 using namespace mbed;
pehrhovey 0:a548a085de55 4
pehrhovey 0:a548a085de55 5 Ethernet *eth;
pehrhovey 0:a548a085de55 6 #ifdef __cplusplus
pehrhovey 0:a548a085de55 7 extern "C" {
pehrhovey 0:a548a085de55 8 #endif
pehrhovey 0:a548a085de55 9
pehrhovey 0:a548a085de55 10 #include "lwip/opt.h"
pehrhovey 0:a548a085de55 11
pehrhovey 0:a548a085de55 12 #include "lwip/def.h"
pehrhovey 0:a548a085de55 13 #include "lwip/pbuf.h"
pehrhovey 0:a548a085de55 14 #include "lwip/sys.h"
pehrhovey 0:a548a085de55 15 #include "lwip/stats.h"
pehrhovey 0:a548a085de55 16 #include "netif/etharp.h"
pehrhovey 0:a548a085de55 17 #include "string.h"
pehrhovey 0:a548a085de55 18
pehrhovey 0:a548a085de55 19 #define IFNAME0 'E'
pehrhovey 0:a548a085de55 20 #define IFNAME1 'X'
pehrhovey 0:a548a085de55 21
pehrhovey 0:a548a085de55 22 #define min(x,y) (((x)<(y))?(x):(y))
pehrhovey 0:a548a085de55 23
pehrhovey 0:a548a085de55 24 struct netif *gnetif;
pehrhovey 0:a548a085de55 25
pehrhovey 0:a548a085de55 26 static err_t device_output(struct netif *netif, struct pbuf *p) {
pehrhovey 0:a548a085de55 27 #if ETH_PAD_SIZE
pehrhovey 0:a548a085de55 28 pbuf_header(p, -ETH_PAD_SIZE); /* drop the padding word */
pehrhovey 0:a548a085de55 29 #endif
pehrhovey 0:a548a085de55 30
pehrhovey 0:a548a085de55 31 do {
pehrhovey 0:a548a085de55 32 eth->write((const char *)p->payload, p->len);
pehrhovey 0:a548a085de55 33 } while((p = p->next)!=NULL);
pehrhovey 0:a548a085de55 34
pehrhovey 0:a548a085de55 35 eth->send();
pehrhovey 0:a548a085de55 36
pehrhovey 0:a548a085de55 37 #if ETH_PAD_SIZE
pehrhovey 0:a548a085de55 38 pbuf_header(p, ETH_PAD_SIZE); /* reclaim the padding word */
pehrhovey 0:a548a085de55 39 #endif
pehrhovey 0:a548a085de55 40
pehrhovey 0:a548a085de55 41 LINK_STATS_INC(link.xmit);
pehrhovey 0:a548a085de55 42 return ERR_OK;
pehrhovey 0:a548a085de55 43 }
pehrhovey 0:a548a085de55 44
pehrhovey 0:a548a085de55 45 void device_poll() {
pehrhovey 0:a548a085de55 46 struct eth_hdr *ethhdr;
pehrhovey 0:a548a085de55 47 struct pbuf *frame, *p;
pehrhovey 0:a548a085de55 48 int len, read;
pehrhovey 0:a548a085de55 49
pehrhovey 0:a548a085de55 50 while((len = eth->receive()) != 0) {
pehrhovey 0:a548a085de55 51 frame = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);
pehrhovey 0:a548a085de55 52 if(frame == NULL) {
pehrhovey 0:a548a085de55 53 return;
pehrhovey 0:a548a085de55 54 }
pehrhovey 0:a548a085de55 55 p = frame;
pehrhovey 0:a548a085de55 56 do {
pehrhovey 0:a548a085de55 57 read = eth->read((char *)p->payload, p->len);
pehrhovey 0:a548a085de55 58 p = p->next;
pehrhovey 0:a548a085de55 59 } while(p != NULL && read != 0);
pehrhovey 0:a548a085de55 60
pehrhovey 0:a548a085de55 61 #if ETH_PAD_SIZE
pehrhovey 0:a548a085de55 62 pbuf_header(p, ETH_PAD_SIZE);
pehrhovey 0:a548a085de55 63 #endif
pehrhovey 0:a548a085de55 64
pehrhovey 0:a548a085de55 65 ethhdr = (struct eth_hdr *)(frame->payload);
pehrhovey 0:a548a085de55 66
pehrhovey 0:a548a085de55 67 switch(htons(ethhdr->type)) {
pehrhovey 0:a548a085de55 68
pehrhovey 0:a548a085de55 69 case ETHTYPE_IP:
pehrhovey 0:a548a085de55 70 etharp_ip_input(gnetif, frame);
pehrhovey 0:a548a085de55 71 pbuf_header(frame, -((s16_t) sizeof(struct eth_hdr)));
pehrhovey 0:a548a085de55 72 gnetif->input(frame, gnetif);
pehrhovey 0:a548a085de55 73 break;
pehrhovey 0:a548a085de55 74
pehrhovey 0:a548a085de55 75 case ETHTYPE_ARP:
pehrhovey 0:a548a085de55 76 etharp_arp_input(gnetif, (struct eth_addr *)(gnetif->hwaddr), frame);
pehrhovey 0:a548a085de55 77 break;
pehrhovey 0:a548a085de55 78
pehrhovey 0:a548a085de55 79 default:
pehrhovey 0:a548a085de55 80 break;
pehrhovey 0:a548a085de55 81 }
pehrhovey 0:a548a085de55 82 pbuf_free(frame);
pehrhovey 0:a548a085de55 83 }
pehrhovey 0:a548a085de55 84 }
pehrhovey 0:a548a085de55 85
pehrhovey 0:a548a085de55 86 err_t device_init(struct netif *netif) {
pehrhovey 0:a548a085de55 87 printf("device_init\r\n");
pehrhovey 0:a548a085de55 88 LWIP_ASSERT("netif != NULL", (netif != NULL));
pehrhovey 0:a548a085de55 89
pehrhovey 0:a548a085de55 90 NETIF_INIT_SNMP(netif, snmp_ifType_ethernet_csmacd, 0x2EA);
pehrhovey 0:a548a085de55 91
pehrhovey 0:a548a085de55 92 /* maximum transfer unit */
pehrhovey 0:a548a085de55 93 netif->mtu = 0x2EA;
pehrhovey 0:a548a085de55 94
pehrhovey 0:a548a085de55 95 /* device capabilities */
pehrhovey 0:a548a085de55 96 /* don't set NETIF_FLAG_ETHARP if this device is not an ethernet one */
pehrhovey 0:a548a085de55 97 netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP;
pehrhovey 0:a548a085de55 98
pehrhovey 0:a548a085de55 99 netif->state = NULL;
pehrhovey 0:a548a085de55 100 gnetif = netif;
pehrhovey 0:a548a085de55 101
pehrhovey 0:a548a085de55 102 netif->name[0] = IFNAME0;
pehrhovey 0:a548a085de55 103 netif->name[1] = IFNAME1;
pehrhovey 0:a548a085de55 104
pehrhovey 0:a548a085de55 105 /* We directly use etharp_output() here to save a function call.
pehrhovey 0:a548a085de55 106 * You can instead declare your own function an call etharp_output()
pehrhovey 0:a548a085de55 107 * from it if you have to do some checks before sending (e.g. if link
pehrhovey 0:a548a085de55 108 * is available...) */
pehrhovey 0:a548a085de55 109 netif->output = etharp_output;
pehrhovey 0:a548a085de55 110 netif->linkoutput = device_output;
pehrhovey 0:a548a085de55 111
pehrhovey 0:a548a085de55 112 eth = new Ethernet();
pehrhovey 0:a548a085de55 113
pehrhovey 0:a548a085de55 114 return ERR_OK;
pehrhovey 0:a548a085de55 115 }
pehrhovey 0:a548a085de55 116
pehrhovey 0:a548a085de55 117 void device_address(char *mac) {
pehrhovey 0:a548a085de55 118 eth->address(mac);
pehrhovey 0:a548a085de55 119 }
pehrhovey 0:a548a085de55 120
pehrhovey 0:a548a085de55 121 #ifdef __cplusplus
pehrhovey 0:a548a085de55 122 };
pehrhovey 0:a548a085de55 123 #endif