RTC auf true

Committer:
kevman
Date:
Wed Nov 28 15:10:15 2018 +0000
Revision:
0:38ceb79fef03
RTC modified

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kevman 0:38ceb79fef03 1 /* mbed Microcontroller Library
kevman 0:38ceb79fef03 2 * Copyright (c) 2016 ARM Limited
kevman 0:38ceb79fef03 3 *
kevman 0:38ceb79fef03 4 * Licensed under the Apache License, Version 2.0 (the "License");
kevman 0:38ceb79fef03 5 * you may not use this file except in compliance with the License.
kevman 0:38ceb79fef03 6 * You may obtain a copy of the License at
kevman 0:38ceb79fef03 7 *
kevman 0:38ceb79fef03 8 * http://www.apache.org/licenses/LICENSE-2.0
kevman 0:38ceb79fef03 9 *
kevman 0:38ceb79fef03 10 * Unless required by applicable law or agreed to in writing, software
kevman 0:38ceb79fef03 11 * distributed under the License is distributed on an "AS IS" BASIS,
kevman 0:38ceb79fef03 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
kevman 0:38ceb79fef03 13 * See the License for the specific language governing permissions and
kevman 0:38ceb79fef03 14 * limitations under the License.
kevman 0:38ceb79fef03 15 */
kevman 0:38ceb79fef03 16
kevman 0:38ceb79fef03 17 #include "lwip/tcpip.h"
kevman 0:38ceb79fef03 18 #include "lwip/tcp.h"
kevman 0:38ceb79fef03 19 #include "lwip/ip.h"
kevman 0:38ceb79fef03 20 #include "netif/etharp.h"
kevman 0:38ceb79fef03 21 #include "lwip/ethip6.h"
kevman 0:38ceb79fef03 22 #include "netsocket/nsapi_types.h"
kevman 0:38ceb79fef03 23 #include "netsocket/EMAC.h"
kevman 0:38ceb79fef03 24
kevman 0:38ceb79fef03 25 #include "LWIPStack.h"
kevman 0:38ceb79fef03 26
kevman 0:38ceb79fef03 27 #if LWIP_ETHERNET
kevman 0:38ceb79fef03 28
kevman 0:38ceb79fef03 29 err_t LWIP::Interface::emac_low_level_output(struct netif *netif, struct pbuf *p)
kevman 0:38ceb79fef03 30 {
kevman 0:38ceb79fef03 31 /* Increase reference counter since lwip stores handle to pbuf and frees
kevman 0:38ceb79fef03 32 it after output */
kevman 0:38ceb79fef03 33 pbuf_ref(p);
kevman 0:38ceb79fef03 34
kevman 0:38ceb79fef03 35 LWIP::Interface *mbed_if = static_cast<LWIP::Interface *>(netif->state);
kevman 0:38ceb79fef03 36 bool ret = mbed_if->emac->link_out(p);
kevman 0:38ceb79fef03 37 return ret ? ERR_OK : ERR_IF;
kevman 0:38ceb79fef03 38 }
kevman 0:38ceb79fef03 39
kevman 0:38ceb79fef03 40 void LWIP::Interface::emac_input(emac_mem_buf_t *buf)
kevman 0:38ceb79fef03 41 {
kevman 0:38ceb79fef03 42 struct pbuf *p = static_cast<struct pbuf *>(buf);
kevman 0:38ceb79fef03 43
kevman 0:38ceb79fef03 44 /* pass all packets to ethernet_input, which decides what packets it supports */
kevman 0:38ceb79fef03 45 if (netif.input(p, &netif) != ERR_OK) {
kevman 0:38ceb79fef03 46 LWIP_DEBUGF(NETIF_DEBUG, ("Emac LWIP: IP input error\n"));
kevman 0:38ceb79fef03 47
kevman 0:38ceb79fef03 48 pbuf_free(p);
kevman 0:38ceb79fef03 49 }
kevman 0:38ceb79fef03 50 }
kevman 0:38ceb79fef03 51
kevman 0:38ceb79fef03 52 void LWIP::Interface::emac_state_change(bool up)
kevman 0:38ceb79fef03 53 {
kevman 0:38ceb79fef03 54 if (up) {
kevman 0:38ceb79fef03 55 tcpip_callback_with_block((tcpip_callback_fn)netif_set_link_up, &netif, 1);
kevman 0:38ceb79fef03 56 } else {
kevman 0:38ceb79fef03 57 tcpip_callback_with_block((tcpip_callback_fn)netif_set_link_down, &netif, 1);
kevman 0:38ceb79fef03 58 }
kevman 0:38ceb79fef03 59 }
kevman 0:38ceb79fef03 60
kevman 0:38ceb79fef03 61 #if LWIP_IGMP
kevman 0:38ceb79fef03 62
kevman 0:38ceb79fef03 63 #include "lwip/igmp.h"
kevman 0:38ceb79fef03 64 /**
kevman 0:38ceb79fef03 65 * IPv4 address filtering setup.
kevman 0:38ceb79fef03 66 *
kevman 0:38ceb79fef03 67 * \param[in] netif the lwip network interface structure
kevman 0:38ceb79fef03 68 * \param[in] group IPv4 group to modify
kevman 0:38ceb79fef03 69 * \param[in] action
kevman 0:38ceb79fef03 70 * \return ERR_OK or error code
kevman 0:38ceb79fef03 71 */
kevman 0:38ceb79fef03 72 err_t LWIP::Interface::emac_igmp_mac_filter(struct netif *netif, const ip4_addr_t *group, enum netif_mac_filter_action action)
kevman 0:38ceb79fef03 73 {
kevman 0:38ceb79fef03 74 LWIP::Interface *mbed_if = static_cast<LWIP::Interface *>(netif->state);
kevman 0:38ceb79fef03 75
kevman 0:38ceb79fef03 76 switch (action) {
kevman 0:38ceb79fef03 77 case NETIF_ADD_MAC_FILTER:
kevman 0:38ceb79fef03 78 {
kevman 0:38ceb79fef03 79 uint32_t group23 = ntohl(group->addr) & 0x007FFFFF;
kevman 0:38ceb79fef03 80 uint8_t addr[6];
kevman 0:38ceb79fef03 81 addr[0] = LL_IP4_MULTICAST_ADDR_0;
kevman 0:38ceb79fef03 82 addr[1] = LL_IP4_MULTICAST_ADDR_1;
kevman 0:38ceb79fef03 83 addr[2] = LL_IP4_MULTICAST_ADDR_2;
kevman 0:38ceb79fef03 84 addr[3] = group23 >> 16;
kevman 0:38ceb79fef03 85 addr[4] = group23 >> 8;
kevman 0:38ceb79fef03 86 addr[5] = group23;
kevman 0:38ceb79fef03 87 mbed_if->emac->add_multicast_group(addr);
kevman 0:38ceb79fef03 88 return ERR_OK;
kevman 0:38ceb79fef03 89 }
kevman 0:38ceb79fef03 90 case NETIF_DEL_MAC_FILTER:
kevman 0:38ceb79fef03 91 /* As we don't reference count, silently ignore delete requests */
kevman 0:38ceb79fef03 92 return ERR_OK;
kevman 0:38ceb79fef03 93 default:
kevman 0:38ceb79fef03 94 return ERR_ARG;
kevman 0:38ceb79fef03 95 }
kevman 0:38ceb79fef03 96 }
kevman 0:38ceb79fef03 97 #endif
kevman 0:38ceb79fef03 98
kevman 0:38ceb79fef03 99 #if LWIP_IPV6_MLD
kevman 0:38ceb79fef03 100
kevman 0:38ceb79fef03 101 #include "lwip/mld6.h"
kevman 0:38ceb79fef03 102 /**
kevman 0:38ceb79fef03 103 * IPv6 address filtering setup.
kevman 0:38ceb79fef03 104 *
kevman 0:38ceb79fef03 105 * \param[in] netif the lwip network interface structure
kevman 0:38ceb79fef03 106 * \param[in] group IPv6 group to modify
kevman 0:38ceb79fef03 107 * \param[in] action
kevman 0:38ceb79fef03 108 * \return ERR_OK or error code
kevman 0:38ceb79fef03 109 */
kevman 0:38ceb79fef03 110 err_t LWIP::Interface::emac_mld_mac_filter(struct netif *netif, const ip6_addr_t *group, enum netif_mac_filter_action action)
kevman 0:38ceb79fef03 111 {
kevman 0:38ceb79fef03 112 LWIP::Interface *mbed_if = static_cast<LWIP::Interface *>(netif->state);
kevman 0:38ceb79fef03 113
kevman 0:38ceb79fef03 114 switch (action) {
kevman 0:38ceb79fef03 115 case NETIF_ADD_MAC_FILTER:
kevman 0:38ceb79fef03 116 {
kevman 0:38ceb79fef03 117 uint32_t group32 = ntohl(group->addr[3]);
kevman 0:38ceb79fef03 118 uint8_t addr[6];
kevman 0:38ceb79fef03 119 addr[0] = LL_IP6_MULTICAST_ADDR_0;
kevman 0:38ceb79fef03 120 addr[1] = LL_IP6_MULTICAST_ADDR_1;
kevman 0:38ceb79fef03 121 addr[2] = group32 >> 24;
kevman 0:38ceb79fef03 122 addr[3] = group32 >> 16;
kevman 0:38ceb79fef03 123 addr[4] = group32 >> 8;
kevman 0:38ceb79fef03 124 addr[5] = group32;
kevman 0:38ceb79fef03 125 mbed_if->emac->add_multicast_group(addr);
kevman 0:38ceb79fef03 126 return ERR_OK;
kevman 0:38ceb79fef03 127 }
kevman 0:38ceb79fef03 128 case NETIF_DEL_MAC_FILTER:
kevman 0:38ceb79fef03 129 /* As we don't reference count, silently ignore delete requests */
kevman 0:38ceb79fef03 130 return ERR_OK;
kevman 0:38ceb79fef03 131 default:
kevman 0:38ceb79fef03 132 return ERR_ARG;
kevman 0:38ceb79fef03 133 }
kevman 0:38ceb79fef03 134 }
kevman 0:38ceb79fef03 135 #endif
kevman 0:38ceb79fef03 136
kevman 0:38ceb79fef03 137 err_t LWIP::Interface::emac_if_init(struct netif *netif)
kevman 0:38ceb79fef03 138 {
kevman 0:38ceb79fef03 139 int err = ERR_OK;
kevman 0:38ceb79fef03 140 LWIP::Interface *mbed_if = static_cast<LWIP::Interface *>(netif->state);
kevman 0:38ceb79fef03 141
kevman 0:38ceb79fef03 142 mbed_if->emac->set_memory_manager(*mbed_if->memory_manager);
kevman 0:38ceb79fef03 143 mbed_if->emac->set_link_input_cb(mbed::callback(mbed_if, &LWIP::Interface::emac_input));
kevman 0:38ceb79fef03 144 mbed_if->emac->set_link_state_cb(mbed::callback(mbed_if, &LWIP::Interface::emac_state_change));
kevman 0:38ceb79fef03 145
kevman 0:38ceb79fef03 146 /* Interface capabilities */
kevman 0:38ceb79fef03 147 netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_ETHERNET;
kevman 0:38ceb79fef03 148
kevman 0:38ceb79fef03 149 if (!mbed_if->emac->power_up()) {
kevman 0:38ceb79fef03 150 err = ERR_IF;
kevman 0:38ceb79fef03 151 }
kevman 0:38ceb79fef03 152
kevman 0:38ceb79fef03 153 netif->mtu = mbed_if->emac->get_mtu_size();
kevman 0:38ceb79fef03 154 /* We have a default MAC address, so do don't force them to supply one */
kevman 0:38ceb79fef03 155 netif->hwaddr_len = mbed_if->emac->get_hwaddr_size();
kevman 0:38ceb79fef03 156 /* They may or may not update hwaddr with their address */
kevman 0:38ceb79fef03 157 mbed_if->emac->get_hwaddr(netif->hwaddr);
kevman 0:38ceb79fef03 158 /* Then we write back either what they gave us, or our default */
kevman 0:38ceb79fef03 159 mbed_if->emac->set_hwaddr(netif->hwaddr);
kevman 0:38ceb79fef03 160
kevman 0:38ceb79fef03 161 mbed_if->emac->get_ifname(netif->name, 2);
kevman 0:38ceb79fef03 162
kevman 0:38ceb79fef03 163 #if LWIP_IPV4
kevman 0:38ceb79fef03 164 netif->output = etharp_output;
kevman 0:38ceb79fef03 165 #if LWIP_IGMP
kevman 0:38ceb79fef03 166 netif->igmp_mac_filter = &LWIP::Interface::emac_igmp_mac_filter;
kevman 0:38ceb79fef03 167 netif->flags |= NETIF_FLAG_IGMP;
kevman 0:38ceb79fef03 168 #endif /* LWIP_IGMP */
kevman 0:38ceb79fef03 169 #endif /* LWIP_IPV4 */
kevman 0:38ceb79fef03 170 #if LWIP_IPV6
kevman 0:38ceb79fef03 171 netif->output_ip6 = ethip6_output;
kevman 0:38ceb79fef03 172 #if LWIP_IPV6_MLD
kevman 0:38ceb79fef03 173 netif->mld_mac_filter = &LWIP::Interface::emac_mld_mac_filter;
kevman 0:38ceb79fef03 174 netif->flags |= NETIF_FLAG_MLD6;
kevman 0:38ceb79fef03 175 #else
kevman 0:38ceb79fef03 176 // Would need to enable all multicasts here - no API in fsl_enet to do that
kevman 0:38ceb79fef03 177 #error "IPv6 multicasts won't be received if LWIP_IPV6_MLD is disabled, breaking the system"
kevman 0:38ceb79fef03 178 #endif
kevman 0:38ceb79fef03 179 #endif
kevman 0:38ceb79fef03 180
kevman 0:38ceb79fef03 181 netif->linkoutput = &LWIP::Interface::emac_low_level_output;
kevman 0:38ceb79fef03 182
kevman 0:38ceb79fef03 183 return err;
kevman 0:38ceb79fef03 184 }
kevman 0:38ceb79fef03 185
kevman 0:38ceb79fef03 186 #endif
kevman 0:38ceb79fef03 187