Donatien Garnier / MiniTLS-GPL

Dependents:   MiniTLS-HTTPS-Example

Committer:
MiniTLS
Date:
Fri Jun 06 10:49:02 2014 +0000
Revision:
0:35aa5be3b78d
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MiniTLS 0:35aa5be3b78d 1 /*
MiniTLS 0:35aa5be3b78d 2 MuTLS - A super trimmed down TLS/SSL Library for embedded devices
MiniTLS 0:35aa5be3b78d 3 Author: Donatien Garnier
MiniTLS 0:35aa5be3b78d 4 Copyright (C) 2013-2014 AppNearMe Ltd
MiniTLS 0:35aa5be3b78d 5
MiniTLS 0:35aa5be3b78d 6 This program is free software; you can redistribute it and/or
MiniTLS 0:35aa5be3b78d 7 modify it under the terms of the GNU General Public License
MiniTLS 0:35aa5be3b78d 8 as published by the Free Software Foundation; either version 2
MiniTLS 0:35aa5be3b78d 9 of the License, or (at your option) any later version.
MiniTLS 0:35aa5be3b78d 10
MiniTLS 0:35aa5be3b78d 11 This program is distributed in the hope that it will be useful,
MiniTLS 0:35aa5be3b78d 12 but WITHOUT ANY WARRANTY; without even the implied warranty of
MiniTLS 0:35aa5be3b78d 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
MiniTLS 0:35aa5be3b78d 14 GNU General Public License for more details.
MiniTLS 0:35aa5be3b78d 15
MiniTLS 0:35aa5be3b78d 16 You should have received a copy of the GNU General Public License
MiniTLS 0:35aa5be3b78d 17 along with this program; if not, write to the Free Software
MiniTLS 0:35aa5be3b78d 18 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
MiniTLS 0:35aa5be3b78d 19 *//**
MiniTLS 0:35aa5be3b78d 20 * \file mbed_net.c
MiniTLS 0:35aa5be3b78d 21 * \copyright Copyright (c) AppNearMe Ltd 2013
MiniTLS 0:35aa5be3b78d 22 * \author Donatien Garnier
MiniTLS 0:35aa5be3b78d 23 */
MiniTLS 0:35aa5be3b78d 24
MiniTLS 0:35aa5be3b78d 25 #define __DEBUG__ 4
MiniTLS 0:35aa5be3b78d 26 #ifndef __MODULE__
MiniTLS 0:35aa5be3b78d 27 #define __MODULE__ "mbed_net.c"
MiniTLS 0:35aa5be3b78d 28 #endif
MiniTLS 0:35aa5be3b78d 29
MiniTLS 0:35aa5be3b78d 30 #include "core/fwk.h"
MiniTLS 0:35aa5be3b78d 31 #include "stdio.h"
MiniTLS 0:35aa5be3b78d 32
MiniTLS 0:35aa5be3b78d 33 #include "LPC17xx.h"
MiniTLS 0:35aa5be3b78d 34
MiniTLS 0:35aa5be3b78d 35 #include "lwip/inet.h"
MiniTLS 0:35aa5be3b78d 36 #include "lwip/netif.h"
MiniTLS 0:35aa5be3b78d 37 #include "netif/etharp.h"
MiniTLS 0:35aa5be3b78d 38 #include "lwip/dhcp.h"
MiniTLS 0:35aa5be3b78d 39 #include "arch/lpc17_emac.h"
MiniTLS 0:35aa5be3b78d 40 #include "lpc_phy.h"
MiniTLS 0:35aa5be3b78d 41 #include "lwip/tcpip.h"
MiniTLS 0:35aa5be3b78d 42
MiniTLS 0:35aa5be3b78d 43 #include "mbed_interface.h"
MiniTLS 0:35aa5be3b78d 44
MiniTLS 0:35aa5be3b78d 45 #include "rtos/cmsis_os.h"
MiniTLS 0:35aa5be3b78d 46
MiniTLS 0:35aa5be3b78d 47 #include "net/socket/bsd_socket.h"
MiniTLS 0:35aa5be3b78d 48
MiniTLS 0:35aa5be3b78d 49 /* TCP/IP and Network Interface Initialisation */
MiniTLS 0:35aa5be3b78d 50 static struct netif lpcNetif;
MiniTLS 0:35aa5be3b78d 51
MiniTLS 0:35aa5be3b78d 52 static char mac_addr[19];
MiniTLS 0:35aa5be3b78d 53 static char ip_addr[17] = "\0";
MiniTLS 0:35aa5be3b78d 54 static bool use_dhcp = false;
MiniTLS 0:35aa5be3b78d 55
MiniTLS 0:35aa5be3b78d 56 static osSemaphoreId tcpip_inited_sem_id;
MiniTLS 0:35aa5be3b78d 57 static osSemaphoreDef_t tcpip_inited_sem_def;
MiniTLS 0:35aa5be3b78d 58 static uint32_t tcpip_inited_sem_buffer[2];
MiniTLS 0:35aa5be3b78d 59
MiniTLS 0:35aa5be3b78d 60 static osSemaphoreId netif_linked_sem_id;
MiniTLS 0:35aa5be3b78d 61 static osSemaphoreDef_t netif_linked_sem_def;
MiniTLS 0:35aa5be3b78d 62 static uint32_t netif_linked_sem_buffer[2];
MiniTLS 0:35aa5be3b78d 63
MiniTLS 0:35aa5be3b78d 64 static osSemaphoreId netif_up_sem_id;
MiniTLS 0:35aa5be3b78d 65 static osSemaphoreDef_t netif_up_sem_def;
MiniTLS 0:35aa5be3b78d 66 static uint32_t netif_up_sem_buffer[2];
MiniTLS 0:35aa5be3b78d 67
MiniTLS 0:35aa5be3b78d 68 static void tcpip_init_done(void *arg) {
MiniTLS 0:35aa5be3b78d 69 DBG("TCP/IP started");
MiniTLS 0:35aa5be3b78d 70 osSemaphoreRelease(tcpip_inited_sem_id);
MiniTLS 0:35aa5be3b78d 71 }
MiniTLS 0:35aa5be3b78d 72
MiniTLS 0:35aa5be3b78d 73 static void netif_link_callback(struct netif *netif) {
MiniTLS 0:35aa5be3b78d 74 DBG("Link change");
MiniTLS 0:35aa5be3b78d 75 if (netif_is_link_up(netif)) {
MiniTLS 0:35aa5be3b78d 76 osSemaphoreRelease(netif_linked_sem_id);
MiniTLS 0:35aa5be3b78d 77 }
MiniTLS 0:35aa5be3b78d 78 }
MiniTLS 0:35aa5be3b78d 79
MiniTLS 0:35aa5be3b78d 80 static void netif_status_callback(struct netif *netif) {
MiniTLS 0:35aa5be3b78d 81 DBG("netif change");
MiniTLS 0:35aa5be3b78d 82 if (netif_is_up(netif)) {
MiniTLS 0:35aa5be3b78d 83 strcpy(ip_addr, inet_ntoa(netif->ip_addr));
MiniTLS 0:35aa5be3b78d 84 osSemaphoreRelease(netif_up_sem_id);
MiniTLS 0:35aa5be3b78d 85 }
MiniTLS 0:35aa5be3b78d 86 }
MiniTLS 0:35aa5be3b78d 87
MiniTLS 0:35aa5be3b78d 88 static void init_netif(ip_addr_t *ipaddr, ip_addr_t *netmask, ip_addr_t *gw) {
MiniTLS 0:35aa5be3b78d 89 tcpip_init(tcpip_init_done, NULL);
MiniTLS 0:35aa5be3b78d 90 osSemaphoreWait(tcpip_inited_sem_id, -1);
MiniTLS 0:35aa5be3b78d 91
MiniTLS 0:35aa5be3b78d 92 memset((void*) &lpcNetif, 0, sizeof(lpcNetif));
MiniTLS 0:35aa5be3b78d 93 netif_add(&lpcNetif, ipaddr, netmask, gw, NULL, lpc_enetif_init, tcpip_input);
MiniTLS 0:35aa5be3b78d 94 netif_set_default(&lpcNetif);
MiniTLS 0:35aa5be3b78d 95
MiniTLS 0:35aa5be3b78d 96 netif_set_link_callback (&lpcNetif, netif_link_callback);
MiniTLS 0:35aa5be3b78d 97 netif_set_status_callback(&lpcNetif, netif_status_callback);
MiniTLS 0:35aa5be3b78d 98 }
MiniTLS 0:35aa5be3b78d 99
MiniTLS 0:35aa5be3b78d 100 static void set_mac_address(void) {
MiniTLS 0:35aa5be3b78d 101 #if (MBED_MAC_ADDRESS_SUM != MBED_MAC_ADDR_INTERFACE)
MiniTLS 0:35aa5be3b78d 102 snprintf(mac_addr, 19, "%02x:%02x:%02x:%02x:%02x:%02x", MBED_MAC_ADDR_0, MBED_MAC_ADDR_1, MBED_MAC_ADDR_2,
MiniTLS 0:35aa5be3b78d 103 MBED_MAC_ADDR_3, MBED_MAC_ADDR_4, MBED_MAC_ADDR_5);
MiniTLS 0:35aa5be3b78d 104 #else
MiniTLS 0:35aa5be3b78d 105 char mac[6];
MiniTLS 0:35aa5be3b78d 106 mbed_mac_address(mac);
MiniTLS 0:35aa5be3b78d 107 snprintf(mac_addr, 19, "%02x:%02x:%02x:%02x:%02x:%02x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
MiniTLS 0:35aa5be3b78d 108 #endif
MiniTLS 0:35aa5be3b78d 109 }
MiniTLS 0:35aa5be3b78d 110
MiniTLS 0:35aa5be3b78d 111 void mbed_net_init(const char* ip, const char* mask, const char* gateway)
MiniTLS 0:35aa5be3b78d 112 {
MiniTLS 0:35aa5be3b78d 113 // DBG("Buffers @ %p %p %p", netif_linked_sem_buffer, netif_linked_sem_buffer, netif_up_sem_buffer); return;
MiniTLS 0:35aa5be3b78d 114
MiniTLS 0:35aa5be3b78d 115 /* Init semaphores */
MiniTLS 0:35aa5be3b78d 116 memset(tcpip_inited_sem_buffer, 0, sizeof(tcpip_inited_sem_buffer));
MiniTLS 0:35aa5be3b78d 117 tcpip_inited_sem_def.semaphore = tcpip_inited_sem_buffer;
MiniTLS 0:35aa5be3b78d 118 tcpip_inited_sem_id = osSemaphoreCreate(&tcpip_inited_sem_def, 1);
MiniTLS 0:35aa5be3b78d 119 osSemaphoreWait(tcpip_inited_sem_id, 0);
MiniTLS 0:35aa5be3b78d 120
MiniTLS 0:35aa5be3b78d 121 memset(netif_linked_sem_buffer, 0, sizeof(netif_linked_sem_buffer));
MiniTLS 0:35aa5be3b78d 122 netif_linked_sem_def.semaphore = netif_linked_sem_buffer;
MiniTLS 0:35aa5be3b78d 123 netif_linked_sem_id = osSemaphoreCreate(&netif_linked_sem_def, 1);
MiniTLS 0:35aa5be3b78d 124 osSemaphoreWait(netif_linked_sem_id, 0);
MiniTLS 0:35aa5be3b78d 125
MiniTLS 0:35aa5be3b78d 126 memset(netif_up_sem_buffer, 0, sizeof(netif_up_sem_buffer));
MiniTLS 0:35aa5be3b78d 127 netif_up_sem_def.semaphore = netif_up_sem_buffer;
MiniTLS 0:35aa5be3b78d 128 netif_up_sem_id = osSemaphoreCreate(&netif_up_sem_def, 1);
MiniTLS 0:35aa5be3b78d 129 osSemaphoreWait(netif_up_sem_id, 0);
MiniTLS 0:35aa5be3b78d 130
MiniTLS 0:35aa5be3b78d 131 set_mac_address();
MiniTLS 0:35aa5be3b78d 132
MiniTLS 0:35aa5be3b78d 133 if(ip == NULL)
MiniTLS 0:35aa5be3b78d 134 {
MiniTLS 0:35aa5be3b78d 135 use_dhcp = true;
MiniTLS 0:35aa5be3b78d 136 init_netif(NULL, NULL, NULL);
MiniTLS 0:35aa5be3b78d 137 }
MiniTLS 0:35aa5be3b78d 138 else
MiniTLS 0:35aa5be3b78d 139 {
MiniTLS 0:35aa5be3b78d 140 use_dhcp = false;
MiniTLS 0:35aa5be3b78d 141 strcpy(ip_addr, ip);
MiniTLS 0:35aa5be3b78d 142 ip_addr_t ip_n, mask_n, gateway_n;
MiniTLS 0:35aa5be3b78d 143 inet_aton(ip, &ip_n);
MiniTLS 0:35aa5be3b78d 144 inet_aton(mask, &mask_n);
MiniTLS 0:35aa5be3b78d 145 inet_aton(gateway, &gateway_n);
MiniTLS 0:35aa5be3b78d 146 init_netif(&ip_n, &mask_n, &gateway_n);
MiniTLS 0:35aa5be3b78d 147 }
MiniTLS 0:35aa5be3b78d 148
MiniTLS 0:35aa5be3b78d 149 }
MiniTLS 0:35aa5be3b78d 150
MiniTLS 0:35aa5be3b78d 151 int mbed_net_connect(unsigned int timeout_ms) {
MiniTLS 0:35aa5be3b78d 152 NVIC_SetPriority(ENET_IRQn, ((0x01 << 3) | 0x01));
MiniTLS 0:35aa5be3b78d 153 NVIC_EnableIRQ(ENET_IRQn);
MiniTLS 0:35aa5be3b78d 154
MiniTLS 0:35aa5be3b78d 155 int inited;
MiniTLS 0:35aa5be3b78d 156 if (use_dhcp) {
MiniTLS 0:35aa5be3b78d 157 dhcp_start(&lpcNetif);
MiniTLS 0:35aa5be3b78d 158
MiniTLS 0:35aa5be3b78d 159 // Wait for an IP Address
MiniTLS 0:35aa5be3b78d 160 // -1: error, 0: timeout
MiniTLS 0:35aa5be3b78d 161 inited = osSemaphoreWait(netif_up_sem_id, timeout_ms);
MiniTLS 0:35aa5be3b78d 162 } else {
MiniTLS 0:35aa5be3b78d 163 netif_set_up(&lpcNetif);
MiniTLS 0:35aa5be3b78d 164
MiniTLS 0:35aa5be3b78d 165 // Wait for the link up
MiniTLS 0:35aa5be3b78d 166 inited = osSemaphoreWait(netif_linked_sem_id, timeout_ms);
MiniTLS 0:35aa5be3b78d 167 }
MiniTLS 0:35aa5be3b78d 168
MiniTLS 0:35aa5be3b78d 169 return (inited > 0) ? (0) : (-1);
MiniTLS 0:35aa5be3b78d 170 }
MiniTLS 0:35aa5be3b78d 171
MiniTLS 0:35aa5be3b78d 172 int mbed_net_disconnect() {
MiniTLS 0:35aa5be3b78d 173 if (use_dhcp) {
MiniTLS 0:35aa5be3b78d 174 dhcp_release(&lpcNetif);
MiniTLS 0:35aa5be3b78d 175 dhcp_stop(&lpcNetif);
MiniTLS 0:35aa5be3b78d 176 } else {
MiniTLS 0:35aa5be3b78d 177 netif_set_down(&lpcNetif);
MiniTLS 0:35aa5be3b78d 178 }
MiniTLS 0:35aa5be3b78d 179
MiniTLS 0:35aa5be3b78d 180 NVIC_DisableIRQ(ENET_IRQn);
MiniTLS 0:35aa5be3b78d 181
MiniTLS 0:35aa5be3b78d 182 return 0;
MiniTLS 0:35aa5be3b78d 183 }