Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: MiniTLS-HTTPS-Example
test/mbed_net.c@0:35aa5be3b78d, 2014-06-06 (annotated)
- Committer:
- MiniTLS
- Date:
- Fri Jun 06 10:49:02 2014 +0000
- Revision:
- 0:35aa5be3b78d
Initial commit
Who changed what in which revision?
User | Revision | Line number | New 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 | } |