RTC auf true
features/netsocket/NetworkInterface.h@2:7aab896b1a3b, 2019-03-13 (annotated)
- Committer:
- kevman
- Date:
- Wed Mar 13 11:03:24 2019 +0000
- Revision:
- 2:7aab896b1a3b
- Parent:
- 0:38ceb79fef03
2019-03-13
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kevman | 0:38ceb79fef03 | 1 | /* NetworkStack |
kevman | 0:38ceb79fef03 | 2 | * Copyright (c) 2015 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 | #ifndef NETWORK_INTERFACE_H |
kevman | 0:38ceb79fef03 | 18 | #define NETWORK_INTERFACE_H |
kevman | 0:38ceb79fef03 | 19 | |
kevman | 0:38ceb79fef03 | 20 | #include "netsocket/nsapi_types.h" |
kevman | 0:38ceb79fef03 | 21 | #include "netsocket/SocketAddress.h" |
kevman | 0:38ceb79fef03 | 22 | #include "Callback.h" |
kevman | 0:38ceb79fef03 | 23 | #include "DNS.h" |
kevman | 0:38ceb79fef03 | 24 | |
kevman | 0:38ceb79fef03 | 25 | |
kevman | 0:38ceb79fef03 | 26 | // Predeclared classes |
kevman | 0:38ceb79fef03 | 27 | class NetworkStack; |
kevman | 0:38ceb79fef03 | 28 | class EthInterface; |
kevman | 0:38ceb79fef03 | 29 | class WiFiInterface; |
kevman | 0:38ceb79fef03 | 30 | class MeshInterface; |
kevman | 0:38ceb79fef03 | 31 | class CellularBase; |
kevman | 0:38ceb79fef03 | 32 | class EMACInterface; |
kevman | 0:38ceb79fef03 | 33 | |
kevman | 0:38ceb79fef03 | 34 | /** Common interface that is shared between network devices. |
kevman | 0:38ceb79fef03 | 35 | * |
kevman | 0:38ceb79fef03 | 36 | * @\addtogroup netsocket |
kevman | 0:38ceb79fef03 | 37 | * @{ |
kevman | 0:38ceb79fef03 | 38 | */ |
kevman | 0:38ceb79fef03 | 39 | class NetworkInterface: public DNS { |
kevman | 0:38ceb79fef03 | 40 | public: |
kevman | 0:38ceb79fef03 | 41 | |
kevman | 0:38ceb79fef03 | 42 | virtual ~NetworkInterface() {}; |
kevman | 0:38ceb79fef03 | 43 | |
kevman | 0:38ceb79fef03 | 44 | /** Return the default network interface. |
kevman | 0:38ceb79fef03 | 45 | * |
kevman | 0:38ceb79fef03 | 46 | * Returns the default network interface, as determined by JSON option |
kevman | 0:38ceb79fef03 | 47 | * target.network-default-interface-type or other overrides. |
kevman | 0:38ceb79fef03 | 48 | * |
kevman | 0:38ceb79fef03 | 49 | * The type of the interface returned can be tested by calling ethInterface(), |
kevman | 0:38ceb79fef03 | 50 | * wifiInterface(), meshInterface(), cellularBase(), emacInterface() and checking |
kevman | 0:38ceb79fef03 | 51 | * for NULL pointers. |
kevman | 0:38ceb79fef03 | 52 | * |
kevman | 0:38ceb79fef03 | 53 | * The default behaviour is to return the default interface for the |
kevman | 0:38ceb79fef03 | 54 | * interface type specified by target.network-default-interface-type. Targets |
kevman | 0:38ceb79fef03 | 55 | * should set this in their targets.json to guide default selection, |
kevman | 0:38ceb79fef03 | 56 | * and applications may override. |
kevman | 0:38ceb79fef03 | 57 | * |
kevman | 0:38ceb79fef03 | 58 | * The interface returned should be already configured for use such that its |
kevman | 0:38ceb79fef03 | 59 | * connect() method works with no parameters. For connection types needing |
kevman | 0:38ceb79fef03 | 60 | * configuration, settings should normally be obtained from JSON - the |
kevman | 0:38ceb79fef03 | 61 | * settings for the core types are under the "nsapi" JSON config tree. |
kevman | 0:38ceb79fef03 | 62 | * |
kevman | 0:38ceb79fef03 | 63 | * The list of possible settings for default interface type is open-ended, |
kevman | 0:38ceb79fef03 | 64 | * as is the number of possible providers. Core providers are: |
kevman | 0:38ceb79fef03 | 65 | * |
kevman | 0:38ceb79fef03 | 66 | * * ETHERNET: EthernetInterface, using default EMAC and OnboardNetworkStack |
kevman | 0:38ceb79fef03 | 67 | * * MESH: ThreadInterface or LoWPANNDInterface, using default NanostackRfPhy |
kevman | 0:38ceb79fef03 | 68 | * * CELLULAR: OnboardModemInterface |
kevman | 0:38ceb79fef03 | 69 | * * WIFI: None - always provided by a specific class |
kevman | 0:38ceb79fef03 | 70 | * |
kevman | 0:38ceb79fef03 | 71 | * Specific drivers may be activated by other settings of the |
kevman | 0:38ceb79fef03 | 72 | * default-network-interface-type configuration. This will depend on the |
kevman | 0:38ceb79fef03 | 73 | * target and the driver. For example a board may have its default setting |
kevman | 0:38ceb79fef03 | 74 | * as "AUTO" which causes it to autodetect an Ethernet cable. This should |
kevman | 0:38ceb79fef03 | 75 | * be described in the target's documentation. |
kevman | 0:38ceb79fef03 | 76 | * |
kevman | 0:38ceb79fef03 | 77 | * An application can override all target settings by implementing |
kevman | 0:38ceb79fef03 | 78 | * NetworkInterface::get_default_instance() themselves - the default |
kevman | 0:38ceb79fef03 | 79 | * definition is weak, and calls get_target_default_instance(). |
kevman | 0:38ceb79fef03 | 80 | */ |
kevman | 0:38ceb79fef03 | 81 | static NetworkInterface *get_default_instance(); |
kevman | 0:38ceb79fef03 | 82 | |
kevman | 0:38ceb79fef03 | 83 | /** Get the local MAC address. |
kevman | 0:38ceb79fef03 | 84 | * |
kevman | 0:38ceb79fef03 | 85 | * Provided MAC address is intended for info or debug purposes and |
kevman | 0:38ceb79fef03 | 86 | * may be not provided if the underlying network interface does not |
kevman | 0:38ceb79fef03 | 87 | * provide a MAC address. |
kevman | 0:38ceb79fef03 | 88 | * |
kevman | 0:38ceb79fef03 | 89 | * @return Null-terminated representation of the local MAC address |
kevman | 0:38ceb79fef03 | 90 | * or null if no MAC address is available. |
kevman | 0:38ceb79fef03 | 91 | */ |
kevman | 0:38ceb79fef03 | 92 | virtual const char *get_mac_address(); |
kevman | 0:38ceb79fef03 | 93 | |
kevman | 0:38ceb79fef03 | 94 | /** Get the local IP address. |
kevman | 0:38ceb79fef03 | 95 | * |
kevman | 0:38ceb79fef03 | 96 | * @return Null-terminated representation of the local IP address |
kevman | 0:38ceb79fef03 | 97 | * or null if no IP address has been received. |
kevman | 0:38ceb79fef03 | 98 | */ |
kevman | 0:38ceb79fef03 | 99 | virtual const char *get_ip_address(); |
kevman | 0:38ceb79fef03 | 100 | |
kevman | 0:38ceb79fef03 | 101 | /** Get the local network mask. |
kevman | 0:38ceb79fef03 | 102 | * |
kevman | 0:38ceb79fef03 | 103 | * @return Null-terminated representation of the local network mask |
kevman | 0:38ceb79fef03 | 104 | * or null if no network mask has been received. |
kevman | 0:38ceb79fef03 | 105 | */ |
kevman | 0:38ceb79fef03 | 106 | virtual const char *get_netmask(); |
kevman | 0:38ceb79fef03 | 107 | |
kevman | 0:38ceb79fef03 | 108 | /** Get the local gateway. |
kevman | 0:38ceb79fef03 | 109 | * |
kevman | 0:38ceb79fef03 | 110 | * @return Null-terminated representation of the local gateway |
kevman | 0:38ceb79fef03 | 111 | * or null if no network mask has been received. |
kevman | 0:38ceb79fef03 | 112 | */ |
kevman | 0:38ceb79fef03 | 113 | virtual const char *get_gateway(); |
kevman | 0:38ceb79fef03 | 114 | |
kevman | 0:38ceb79fef03 | 115 | /** Configure this network interface to use a static IP address. |
kevman | 0:38ceb79fef03 | 116 | * Implicitly disables DHCP, which can be enabled in set_dhcp. |
kevman | 0:38ceb79fef03 | 117 | * Requires that the network is disconnected. |
kevman | 0:38ceb79fef03 | 118 | * |
kevman | 0:38ceb79fef03 | 119 | * @param ip_address Null-terminated representation of the local IP address |
kevman | 0:38ceb79fef03 | 120 | * @param netmask Null-terminated representation of the local network mask |
kevman | 0:38ceb79fef03 | 121 | * @param gateway Null-terminated representation of the local gateway |
kevman | 0:38ceb79fef03 | 122 | * @return NSAPI_ERROR_OK on success, negative error code on failure |
kevman | 0:38ceb79fef03 | 123 | */ |
kevman | 0:38ceb79fef03 | 124 | virtual nsapi_error_t set_network(const char *ip_address, const char *netmask, const char *gateway); |
kevman | 0:38ceb79fef03 | 125 | |
kevman | 0:38ceb79fef03 | 126 | /** Enable or disable DHCP on connecting the network. |
kevman | 0:38ceb79fef03 | 127 | * |
kevman | 0:38ceb79fef03 | 128 | * Enabled by default unless a static IP address has been assigned. Requires |
kevman | 0:38ceb79fef03 | 129 | * that the network is disconnected. |
kevman | 0:38ceb79fef03 | 130 | * |
kevman | 0:38ceb79fef03 | 131 | * @param dhcp True to enable DHCP. |
kevman | 0:38ceb79fef03 | 132 | * @return NSAPI_ERROR_OK on success, negative error code on failure. |
kevman | 0:38ceb79fef03 | 133 | */ |
kevman | 0:38ceb79fef03 | 134 | virtual nsapi_error_t set_dhcp(bool dhcp); |
kevman | 0:38ceb79fef03 | 135 | |
kevman | 0:38ceb79fef03 | 136 | /** Start the interface. |
kevman | 0:38ceb79fef03 | 137 | * |
kevman | 0:38ceb79fef03 | 138 | * @return NSAPI_ERROR_OK on success, negative error code on failure. |
kevman | 0:38ceb79fef03 | 139 | */ |
kevman | 0:38ceb79fef03 | 140 | virtual nsapi_error_t connect() = 0; |
kevman | 0:38ceb79fef03 | 141 | |
kevman | 0:38ceb79fef03 | 142 | /** Stop the interface. |
kevman | 0:38ceb79fef03 | 143 | * |
kevman | 0:38ceb79fef03 | 144 | * @return NSAPI_ERROR_OK on success, negative error code on failure. |
kevman | 0:38ceb79fef03 | 145 | */ |
kevman | 0:38ceb79fef03 | 146 | virtual nsapi_error_t disconnect() = 0; |
kevman | 0:38ceb79fef03 | 147 | |
kevman | 0:38ceb79fef03 | 148 | /** Translate a hostname to an IP address with specific version. |
kevman | 0:38ceb79fef03 | 149 | * |
kevman | 0:38ceb79fef03 | 150 | * The hostname may be either a domain name or an IP address. If the |
kevman | 0:38ceb79fef03 | 151 | * hostname is an IP address, no network transactions will be performed. |
kevman | 0:38ceb79fef03 | 152 | * |
kevman | 0:38ceb79fef03 | 153 | * If no stack-specific DNS resolution is provided, the hostname |
kevman | 0:38ceb79fef03 | 154 | * will be resolve using a UDP socket on the stack. |
kevman | 0:38ceb79fef03 | 155 | * |
kevman | 0:38ceb79fef03 | 156 | * @param host Hostname to resolve. |
kevman | 0:38ceb79fef03 | 157 | * @param address Pointer to a SocketAddress to store the result. |
kevman | 0:38ceb79fef03 | 158 | * @param version IP version of address to resolve, NSAPI_UNSPEC indicates |
kevman | 0:38ceb79fef03 | 159 | * version is chosen by the stack (defaults to NSAPI_UNSPEC). |
kevman | 0:38ceb79fef03 | 160 | * @return NSAPI_ERROR_OK on success, negative error code on failure. |
kevman | 0:38ceb79fef03 | 161 | */ |
kevman | 0:38ceb79fef03 | 162 | virtual nsapi_error_t gethostbyname(const char *host, |
kevman | 0:38ceb79fef03 | 163 | SocketAddress *address, nsapi_version_t version = NSAPI_UNSPEC); |
kevman | 0:38ceb79fef03 | 164 | |
kevman | 0:38ceb79fef03 | 165 | /** Hostname translation callback (for use with gethostbyname_async()). |
kevman | 0:38ceb79fef03 | 166 | * |
kevman | 0:38ceb79fef03 | 167 | * Callback will be called after DNS resolution completes or a failure occurs. |
kevman | 0:38ceb79fef03 | 168 | * |
kevman | 0:38ceb79fef03 | 169 | * @note Callback should not take more than 10ms to execute, otherwise it might |
kevman | 0:38ceb79fef03 | 170 | * prevent underlying thread processing. A portable user of the callback |
kevman | 0:38ceb79fef03 | 171 | * should not make calls to network operations due to stack size limitations. |
kevman | 0:38ceb79fef03 | 172 | * The callback should not perform expensive operations such as socket recv/send |
kevman | 0:38ceb79fef03 | 173 | * calls or blocking operations. |
kevman | 0:38ceb79fef03 | 174 | * |
kevman | 0:38ceb79fef03 | 175 | * @param result NSAPI_ERROR_OK on success, negative error code on failure. |
kevman | 0:38ceb79fef03 | 176 | * @param address On success, destination for the host SocketAddress. |
kevman | 0:38ceb79fef03 | 177 | */ |
kevman | 0:38ceb79fef03 | 178 | typedef mbed::Callback<void (nsapi_error_t result, SocketAddress *address)> hostbyname_cb_t; |
kevman | 0:38ceb79fef03 | 179 | |
kevman | 0:38ceb79fef03 | 180 | /** Translate a hostname to an IP address (asynchronous). |
kevman | 0:38ceb79fef03 | 181 | * |
kevman | 0:38ceb79fef03 | 182 | * The hostname may be either a domain name or a dotted IP address. If the |
kevman | 0:38ceb79fef03 | 183 | * hostname is an IP address, no network transactions will be performed. |
kevman | 0:38ceb79fef03 | 184 | * |
kevman | 0:38ceb79fef03 | 185 | * If no stack-specific DNS resolution is provided, the hostname |
kevman | 0:38ceb79fef03 | 186 | * will be resolve using a UDP socket on the stack. |
kevman | 0:38ceb79fef03 | 187 | * |
kevman | 0:38ceb79fef03 | 188 | * Call is non-blocking. Result of the DNS operation is returned by the callback. |
kevman | 0:38ceb79fef03 | 189 | * If this function returns failure, callback will not be called. In case result |
kevman | 0:38ceb79fef03 | 190 | * is success (IP address was found from DNS cache), callback will be called |
kevman | 0:38ceb79fef03 | 191 | * before function returns. |
kevman | 0:38ceb79fef03 | 192 | * |
kevman | 0:38ceb79fef03 | 193 | * @param host Hostname to resolve. |
kevman | 0:38ceb79fef03 | 194 | * @param callback Callback that is called for result. |
kevman | 0:38ceb79fef03 | 195 | * @param version IP version of address to resolve, NSAPI_UNSPEC indicates |
kevman | 0:38ceb79fef03 | 196 | * version is chosen by the stack (defaults to NSAPI_UNSPEC). |
kevman | 0:38ceb79fef03 | 197 | * @return 0 on immediate success, |
kevman | 0:38ceb79fef03 | 198 | * negative error code on immediate failure or |
kevman | 0:38ceb79fef03 | 199 | * a positive unique id that represents the hostname translation operation |
kevman | 0:38ceb79fef03 | 200 | * and can be passed to cancel. |
kevman | 0:38ceb79fef03 | 201 | */ |
kevman | 0:38ceb79fef03 | 202 | virtual nsapi_value_or_error_t gethostbyname_async(const char *host, hostbyname_cb_t callback, |
kevman | 0:38ceb79fef03 | 203 | nsapi_version_t version = NSAPI_UNSPEC); |
kevman | 0:38ceb79fef03 | 204 | |
kevman | 0:38ceb79fef03 | 205 | /** Cancel asynchronous hostname translation. |
kevman | 0:38ceb79fef03 | 206 | * |
kevman | 0:38ceb79fef03 | 207 | * When translation is cancelled, callback will not be called. |
kevman | 0:38ceb79fef03 | 208 | * |
kevman | 0:38ceb79fef03 | 209 | * @param id Unique id of the hostname translation operation (returned |
kevman | 0:38ceb79fef03 | 210 | * by gethostbyname_async) |
kevman | 0:38ceb79fef03 | 211 | * @return NSAPI_ERROR_OK on success, negative error code on failure. |
kevman | 0:38ceb79fef03 | 212 | */ |
kevman | 0:38ceb79fef03 | 213 | virtual nsapi_error_t gethostbyname_async_cancel(int id); |
kevman | 0:38ceb79fef03 | 214 | |
kevman | 0:38ceb79fef03 | 215 | /** Add a domain name server to list of servers to query |
kevman | 0:38ceb79fef03 | 216 | * |
kevman | 0:38ceb79fef03 | 217 | * @param address Address for the dns host. |
kevman | 0:38ceb79fef03 | 218 | * @return NSAPI_ERROR_OK on success, negative error code on failure. |
kevman | 0:38ceb79fef03 | 219 | */ |
kevman | 0:38ceb79fef03 | 220 | virtual nsapi_error_t add_dns_server(const SocketAddress &address); |
kevman | 0:38ceb79fef03 | 221 | |
kevman | 0:38ceb79fef03 | 222 | /** Register callback for status reporting. |
kevman | 0:38ceb79fef03 | 223 | * |
kevman | 0:38ceb79fef03 | 224 | * The specified status callback function will be called on status changes |
kevman | 0:38ceb79fef03 | 225 | * on the network. The parameters on the callback are the event type and |
kevman | 0:38ceb79fef03 | 226 | * event-type dependent reason parameter. |
kevman | 0:38ceb79fef03 | 227 | * |
kevman | 0:38ceb79fef03 | 228 | * @param status_cb The callback for status changes. |
kevman | 0:38ceb79fef03 | 229 | */ |
kevman | 0:38ceb79fef03 | 230 | virtual void attach(mbed::Callback<void(nsapi_event_t, intptr_t)> status_cb); |
kevman | 0:38ceb79fef03 | 231 | |
kevman | 0:38ceb79fef03 | 232 | /** Get the connection status. |
kevman | 0:38ceb79fef03 | 233 | * |
kevman | 0:38ceb79fef03 | 234 | * @return The connection status (@see nsapi_types.h). |
kevman | 0:38ceb79fef03 | 235 | */ |
kevman | 0:38ceb79fef03 | 236 | virtual nsapi_connection_status_t get_connection_status() const; |
kevman | 0:38ceb79fef03 | 237 | |
kevman | 0:38ceb79fef03 | 238 | /** Set blocking status of connect() which by default should be blocking. |
kevman | 0:38ceb79fef03 | 239 | * |
kevman | 0:38ceb79fef03 | 240 | * @param blocking Use true to make connect() blocking. |
kevman | 0:38ceb79fef03 | 241 | * @return NSAPI_ERROR_OK on success, negative error code on failure. |
kevman | 0:38ceb79fef03 | 242 | */ |
kevman | 0:38ceb79fef03 | 243 | virtual nsapi_error_t set_blocking(bool blocking); |
kevman | 0:38ceb79fef03 | 244 | |
kevman | 0:38ceb79fef03 | 245 | /** Return pointer to an EthInterface. |
kevman | 0:38ceb79fef03 | 246 | * @return Pointer to requested interface type or NULL if this class doesn't implement the interface. |
kevman | 0:38ceb79fef03 | 247 | */ |
kevman | 0:38ceb79fef03 | 248 | virtual EthInterface *ethInterface() |
kevman | 0:38ceb79fef03 | 249 | { |
kevman | 0:38ceb79fef03 | 250 | return 0; |
kevman | 0:38ceb79fef03 | 251 | } |
kevman | 0:38ceb79fef03 | 252 | |
kevman | 0:38ceb79fef03 | 253 | /** Return pointer to a WiFiInterface. |
kevman | 0:38ceb79fef03 | 254 | * @return Pointer to requested interface type or NULL if this class doesn't implement the interface. |
kevman | 0:38ceb79fef03 | 255 | */ |
kevman | 0:38ceb79fef03 | 256 | virtual WiFiInterface *wifiInterface() |
kevman | 0:38ceb79fef03 | 257 | { |
kevman | 0:38ceb79fef03 | 258 | return 0; |
kevman | 0:38ceb79fef03 | 259 | } |
kevman | 0:38ceb79fef03 | 260 | |
kevman | 0:38ceb79fef03 | 261 | /** Return pointer to a MeshInterface. |
kevman | 0:38ceb79fef03 | 262 | * @return Pointer to requested interface type or NULL if this class doesn't implement the interface. |
kevman | 0:38ceb79fef03 | 263 | */ |
kevman | 0:38ceb79fef03 | 264 | virtual MeshInterface *meshInterface() |
kevman | 0:38ceb79fef03 | 265 | { |
kevman | 0:38ceb79fef03 | 266 | return 0; |
kevman | 0:38ceb79fef03 | 267 | } |
kevman | 0:38ceb79fef03 | 268 | |
kevman | 0:38ceb79fef03 | 269 | /** Return pointer to a CellularBase. |
kevman | 0:38ceb79fef03 | 270 | * @return Pointer to requested interface type or NULL if this class doesn't implement the interface. |
kevman | 0:38ceb79fef03 | 271 | */ |
kevman | 0:38ceb79fef03 | 272 | virtual CellularBase *cellularBase() |
kevman | 0:38ceb79fef03 | 273 | { |
kevman | 0:38ceb79fef03 | 274 | return 0; |
kevman | 0:38ceb79fef03 | 275 | } |
kevman | 0:38ceb79fef03 | 276 | |
kevman | 0:38ceb79fef03 | 277 | /** Return pointer to an EMACInterface. |
kevman | 0:38ceb79fef03 | 278 | * @return Pointer to requested interface type or NULL if this class doesn't implement the interface. |
kevman | 0:38ceb79fef03 | 279 | */ |
kevman | 0:38ceb79fef03 | 280 | virtual EMACInterface *emacInterface() |
kevman | 0:38ceb79fef03 | 281 | { |
kevman | 0:38ceb79fef03 | 282 | return 0; |
kevman | 0:38ceb79fef03 | 283 | } |
kevman | 0:38ceb79fef03 | 284 | |
kevman | 0:38ceb79fef03 | 285 | #if !defined(DOXYGEN_ONLY) |
kevman | 0:38ceb79fef03 | 286 | |
kevman | 0:38ceb79fef03 | 287 | protected: |
kevman | 0:38ceb79fef03 | 288 | friend class InternetSocket; |
kevman | 0:38ceb79fef03 | 289 | friend class UDPSocket; |
kevman | 0:38ceb79fef03 | 290 | friend class TCPSocket; |
kevman | 0:38ceb79fef03 | 291 | friend class TCPServer; |
kevman | 0:38ceb79fef03 | 292 | friend class SocketAddress; |
kevman | 0:38ceb79fef03 | 293 | template <typename IF> |
kevman | 0:38ceb79fef03 | 294 | friend NetworkStack *nsapi_create_stack(IF *iface); |
kevman | 0:38ceb79fef03 | 295 | |
kevman | 0:38ceb79fef03 | 296 | /** Provide access to the NetworkStack object |
kevman | 0:38ceb79fef03 | 297 | * |
kevman | 0:38ceb79fef03 | 298 | * @return The underlying NetworkStack object |
kevman | 0:38ceb79fef03 | 299 | */ |
kevman | 0:38ceb79fef03 | 300 | virtual NetworkStack *get_stack() = 0; |
kevman | 0:38ceb79fef03 | 301 | |
kevman | 0:38ceb79fef03 | 302 | /** Get the target's default network instance. |
kevman | 0:38ceb79fef03 | 303 | * |
kevman | 0:38ceb79fef03 | 304 | * This method can be overridden by the target. Default implementations |
kevman | 0:38ceb79fef03 | 305 | * are provided weakly by various subsystems as described in |
kevman | 0:38ceb79fef03 | 306 | * NetworkInterface::get_default_instance(), so targets should not |
kevman | 0:38ceb79fef03 | 307 | * need to override in simple cases. |
kevman | 0:38ceb79fef03 | 308 | * |
kevman | 0:38ceb79fef03 | 309 | * If a target has more elaborate interface selection, it can completely |
kevman | 0:38ceb79fef03 | 310 | * override this behaviour by implementing |
kevman | 0:38ceb79fef03 | 311 | * NetworkInterface::get_target_default_instance() themselves, either |
kevman | 0:38ceb79fef03 | 312 | * unconditionally, or for a specific network-default-interface-type setting |
kevman | 0:38ceb79fef03 | 313 | * |
kevman | 0:38ceb79fef03 | 314 | * For example, a device with both Ethernet and Wi-fi could be set up its |
kevman | 0:38ceb79fef03 | 315 | * target so that: |
kevman | 0:38ceb79fef03 | 316 | * * DEVICE_EMAC is set, and it provides EMAC::get_default_instance(), |
kevman | 0:38ceb79fef03 | 317 | * which means EthernetInterface provides EthInterface::get_target_instance() |
kevman | 0:38ceb79fef03 | 318 | * based on that EMAC. |
kevman | 0:38ceb79fef03 | 319 | * * It provides WifiInterface::get_target_default_instance(). |
kevman | 0:38ceb79fef03 | 320 | * * The core will route NetworkInterface::get_default_instance() to |
kevman | 0:38ceb79fef03 | 321 | * either of those if network-default-interface-type is set to |
kevman | 0:38ceb79fef03 | 322 | * ETHERNET or WIFI. |
kevman | 0:38ceb79fef03 | 323 | * * The board overrides NetworkInterface::get_target_default_instance() |
kevman | 0:38ceb79fef03 | 324 | * if network-default-interface-type is set to AUTO. This returns |
kevman | 0:38ceb79fef03 | 325 | * either EthInterface::get_default_instance() or WiFIInterface::get_default_instance() |
kevman | 0:38ceb79fef03 | 326 | * depending on a cable detection. |
kevman | 0:38ceb79fef03 | 327 | * |
kevman | 0:38ceb79fef03 | 328 | * |
kevman | 0:38ceb79fef03 | 329 | * performs the search described by get_default_instance. |
kevman | 0:38ceb79fef03 | 330 | */ |
kevman | 0:38ceb79fef03 | 331 | static NetworkInterface *get_target_default_instance(); |
kevman | 0:38ceb79fef03 | 332 | #endif //!defined(DOXYGEN_ONLY) |
kevman | 0:38ceb79fef03 | 333 | }; |
kevman | 0:38ceb79fef03 | 334 | |
kevman | 0:38ceb79fef03 | 335 | /** @}*/ |
kevman | 0:38ceb79fef03 | 336 | #endif |