WORKS

Dependencies:   MAX44000 PWM_Tone_Library nexpaq_mdk

Fork of LED_Demo by Maxim nexpaq

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers socket_api.h Source File

socket_api.h

00001 /*
00002  * PackageLicenseDeclared: Apache-2.0
00003  * Copyright (c) 2015 ARM Limited
00004  *
00005  * Licensed under the Apache License, Version 2.0 (the "License");
00006  * you may not use this file except in compliance with the License.
00007  * You may obtain a copy of the License at
00008  *
00009  *     http://www.apache.org/licenses/LICENSE-2.0
00010  *
00011  * Unless required by applicable law or agreed to in writing, software
00012  * distributed under the License is distributed on an "AS IS" BASIS,
00013  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00014  * See the License for the specific language governing permissions and
00015  * limitations under the License.
00016  */
00017 #ifndef __MBED_NET_SOCKET_ABSTRACT_SOCKET_API_H__
00018 #define __MBED_NET_SOCKET_ABSTRACT_SOCKET_API_H__
00019 
00020 #include <stdint.h>
00021 #include "socket_types.h"
00022 #ifdef __cplusplus
00023 extern "C" {
00024 #endif
00025 
00026 #ifndef SOCKET_MAX_STACKS
00027 #define SOCKET_MAX_STACKS 2
00028 #endif
00029 
00030 typedef socket_error_t (*socket_init)();
00031 typedef socket_error_t (*socket_create)(struct socket *socket,
00032         const socket_address_family_t af, const socket_proto_family_t pf,
00033         socket_api_handler_t const handler);
00034 typedef socket_error_t (*socket_destroy)(struct socket *socket);
00035 typedef socket_error_t (*socket_close)(struct socket *socket);
00036 typedef socket_api_handler_t (*socket_periodic_task)(const struct socket * socket);
00037 typedef uint32_t (*socket_periodic_interval)(const struct socket * socket);
00038 typedef socket_error_t (*socket_resolve)(struct socket *socket, const char *address);
00039 typedef socket_error_t (*socket_connect)(struct socket *sock, const struct socket_addr *address, const uint16_t port);
00040 typedef socket_error_t (*socket_bind)(struct socket *socket, const struct socket_addr *address, const uint16_t port);
00041 typedef socket_error_t (*socket_str2addr)(const struct socket *socket, struct socket_addr *addr, const char *address);
00042 typedef socket_error_t (*socket_start_listen)(struct socket *socket, const uint32_t backlog);
00043 typedef socket_error_t (*socket_stop_listen)(struct socket *socket);
00044 typedef socket_error_t (*socket_accept)(struct socket *sock, socket_api_handler_t handler);
00045 typedef socket_error_t (*socket_reject)(struct socket *sock);
00046 typedef socket_error_t (*socket_send)(struct socket *socket, const void * buf, const size_t len);
00047 typedef socket_error_t (*socket_send_to)(struct socket *socket, const void * buf, const size_t len, const struct socket_addr *addr, const uint16_t port);
00048 typedef socket_error_t (*socket_recv)(struct socket *socket, void * buf, size_t *len);
00049 typedef socket_error_t (*socket_recv_from)(struct socket *socket, void * buf, size_t *len, struct socket_addr *addr, uint16_t *port);
00050 
00051 typedef socket_error_t (*socket_get_local_addr)(const struct socket *socket, struct socket_addr *addr);
00052 typedef socket_error_t (*socket_get_remote_addr)(const struct socket *socket, struct socket_addr *addr);
00053 typedef socket_error_t (*socket_get_local_port)(const struct socket *socket, uint16_t *port);
00054 typedef socket_error_t (*socket_get_remote_port)(const struct socket *socket, uint16_t *port);
00055 
00056 typedef uint8_t (*socket_is_connected)(const struct socket *socket);
00057 typedef uint8_t (*socket_is_bound)(const struct socket *socket);
00058 
00059 struct socket_api {
00060     socket_stack_t              stack;
00061     uint32_t                    version;
00062     socket_init                 init;
00063     socket_create               create;
00064     socket_destroy              destroy;
00065     socket_close                close;
00066     socket_periodic_task        periodic_task;
00067     socket_periodic_interval    periodic_interval;
00068     socket_resolve              resolve;
00069     socket_connect              connect;
00070     socket_str2addr             str2addr;
00071     socket_bind                 bind;
00072     socket_start_listen         start_listen;
00073     socket_stop_listen          stop_listen;
00074     socket_accept               accept;
00075     socket_reject               reject;
00076     socket_send                 send;
00077     socket_send_to              send_to;
00078     socket_recv                 recv;
00079     socket_recv_from            recv_from;
00080     socket_is_connected         is_connected;
00081     socket_is_bound             is_bound;
00082     socket_get_local_addr       get_local_addr;
00083     socket_get_remote_addr      get_remote_addr;
00084     socket_get_local_port       get_local_port;
00085     socket_get_remote_port      get_remote_port;
00086 };
00087 #define SOCKET_API_FIRST_PTR init
00088 #define SOCKET_API_LAST_PTR get_remote_port
00089 
00090 socket_error_t socket_register_stack(const struct socket_api * api);
00091 const char * socket_strerror(const socket_error_t err);
00092 const struct socket_api * socket_get_api(const socket_stack_t stack);
00093 
00094 static inline int socket_addr_is_ipv4(const struct socket_addr *addr)
00095 {
00096     if ((addr->ipv6be[0] == 0) &&
00097         (addr->ipv6be[1] == 0) &&
00098         (addr->ipv6be[2] == 0)) {
00099             return 1;
00100     } else {
00101         return 0;
00102     }
00103 }
00104 static inline int socket_addr_is_any(const struct socket_addr *addr)
00105 {
00106     if ((addr->ipv6be[0] == 0) &&
00107         (addr->ipv6be[1] == 0) &&
00108         (addr->ipv6be[2] == 0) &&
00109         (addr->ipv6be[3] == 0)) {
00110             return 1;
00111     } else {
00112         return 0;
00113     }
00114 }
00115 static inline void socket_addr_set_ipv4_addr(struct socket_addr *addr, uint32_t ipv4addr)
00116 {
00117     addr->ipv6be[0] = 0;
00118     addr->ipv6be[1] = 0;
00119     addr->ipv6be[2] = 0;
00120     addr->ipv6be[3] = ipv4addr;
00121 }
00122 static inline uint32_t socket_addr_get_ipv4_addr(const struct socket_addr *addr)
00123 {
00124     if (!socket_addr_is_ipv4(addr)) {
00125         return 0;
00126     }
00127     return addr->ipv6be[3];
00128 }
00129 static inline const uint32_t * socket_addr_get_ipv4_addrp(const struct socket_addr *addr)
00130 {
00131     if (!socket_addr_is_ipv4(addr)) {
00132         return NULL;
00133     }
00134     return &addr->ipv6be[3];
00135 }
00136 static inline void socket_addr_set_any(struct socket_addr *addr)
00137 {
00138     addr->ipv6be[0] = 0;
00139     addr->ipv6be[1] = 0;
00140     addr->ipv6be[2] = 0;
00141     addr->ipv6be[3] = 0;
00142 }
00143 
00144 static inline void socket_addr_copy(struct socket_addr *dest, const struct socket_addr *src)
00145 {
00146     (dest)->ipv6be[0] = (src)->ipv6be[0];
00147     (dest)->ipv6be[1] = (src)->ipv6be[1];
00148     (dest)->ipv6be[2] = (src)->ipv6be[2];
00149     (dest)->ipv6be[3] = (src)->ipv6be[3];
00150 }
00151 static inline int socket_addr_cmp(const struct socket_addr *a, const struct socket_addr *b)
00152 {
00153     return
00154         a->ipv6be[0] != b->ipv6be[0] ||
00155         a->ipv6be[1] != b->ipv6be[1] ||
00156         a->ipv6be[2] != b->ipv6be[2] ||
00157         a->ipv6be[3] != b->ipv6be[3];
00158 }
00159 
00160 #ifdef __cplusplus
00161 }
00162 #endif
00163 
00164 #endif /* __MBED_NET_SOCKET_ABSTRACT_SOCKET_API_H__ */