Sergio Scaglia / Nanostack_lib

Dependents:   mbedEndpointNetwork mbedEndpointNetworkMJK

Fork of Nanostack_lib by Sensinode

Committer:
jusu_81
Date:
Wed Jun 25 21:05:58 2014 +0000
Revision:
11:1b7aaf37a131
Parent:
4:c449bead5cf3
Child:
12:acef6f596835
Added C++ & C Extern C sectors to hedaer files.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Mika Karjalainen 4:c449bead5cf3 1 #ifndef _NS_SOCKET_API_H
Mika Karjalainen 4:c449bead5cf3 2 #define _NS_SOCKET_API_H
Mika Karjalainen 4:c449bead5cf3 3
Mika Karjalainen 4:c449bead5cf3 4 /*
Mika Karjalainen 4:c449bead5cf3 5 * Copyright Sensinode Ltd 2011
Mika Karjalainen 4:c449bead5cf3 6 * socket_api.h
Mika Karjalainen 4:c449bead5cf3 7 */
Mika Karjalainen 4:c449bead5cf3 8 /**
Mika Karjalainen 4:c449bead5cf3 9 * \file socket_api.h
Mika Karjalainen 4:c449bead5cf3 10 * \brief NanosStack 2.0 Library Socket API
Mika Karjalainen 4:c449bead5cf3 11 *
Mika Karjalainen 4:c449bead5cf3 12 * \section socket-com Common Socket API
Mika Karjalainen 4:c449bead5cf3 13 * - socket_open(), A function to open a socket
Mika Karjalainen 4:c449bead5cf3 14 * - socket_free(), A function to free a socket
Mika Karjalainen 4:c449bead5cf3 15 * - socket_raw_open(), A function to open a raw ICMP socket
Mika Karjalainen 4:c449bead5cf3 16 *
Mika Karjalainen 4:c449bead5cf3 17 * \section socket-sec Set socket TLS chipher suite list (SOCKET_TCP_TLS socket Type)
Mika Karjalainen 4:c449bead5cf3 18 * - sec_socket_set_chipher_suite_list(), Used to set opened socket TLS chiphersuite support
Mika Karjalainen 4:c449bead5cf3 19 * * check socket_security.h more information
Mika Karjalainen 4:c449bead5cf3 20 *
Mika Karjalainen 4:c449bead5cf3 21 * \section socket-read Socket Read API at Callback
Mika Karjalainen 4:c449bead5cf3 22 * - socket_read(), A function to read received data buffer from a socket
Mika Karjalainen 4:c449bead5cf3 23 * - socket_read_info(), A function to read signal information and length info from a socket
Mika Karjalainen 4:c449bead5cf3 24 * - socket_read_session_address(), A function to read a session info for TCP event
Mika Karjalainen 4:c449bead5cf3 25 *
Mika Karjalainen 4:c449bead5cf3 26 * \section socket-tx Socket TX API
Mika Karjalainen 4:c449bead5cf3 27 * - socket_send(), A function to write data buffer to a socket (TCP Client Only)
Mika Karjalainen 4:c449bead5cf3 28 * - socket_sendto(), A function to write data to socket to specific destination
Mika Karjalainen 4:c449bead5cf3 29 *
Mika Karjalainen 4:c449bead5cf3 30 * \section sock-connect TCP Socket Connection Handle
Mika Karjalainen 4:c449bead5cf3 31 * - socket_listen(), A function to set the socket to the listening mode
Mika Karjalainen 4:c449bead5cf3 32 * - socket_connect(), A function to connect to remote peer
Mika Karjalainen 4:c449bead5cf3 33 * - socket_close(), A function to close a connection
Mika Karjalainen 4:c449bead5cf3 34 *
Mika Karjalainen 4:c449bead5cf3 35 * Sockets are common abstraction model for network communication and are used in most operating systems.
Mika Karjalainen 4:c449bead5cf3 36 * The NanoStack2.0 Library API follows BSD socket API conventions closely with some extensions necessitated by the event-based scheduling model.
Mika Karjalainen 4:c449bead5cf3 37 *
Mika Karjalainen 4:c449bead5cf3 38 * Library supports following socket types:
Mika Karjalainen 4:c449bead5cf3 39 * | Socket name | Socket description |
Mika Karjalainen 4:c449bead5cf3 40 * | :------------: | :----------------------------: |
Mika Karjalainen 4:c449bead5cf3 41 * | SOCKET_UDP | UDP socket type |
Mika Karjalainen 4:c449bead5cf3 42 * | SOCKET_TCP | TCP socket type |
Mika Karjalainen 4:c449bead5cf3 43 * | SOCKET_TCP_TLS | TCP socket with TLS security |
Mika Karjalainen 4:c449bead5cf3 44 *
Mika Karjalainen 4:c449bead5cf3 45 * \section socket-raw ICMP RAW Socket Instruction
Mika Karjalainen 4:c449bead5cf3 46 * ICMP RAW socket can be created by socket_raw_open(). When using ICMP sockets the minimum payload length is 8 bytes, where first 4 bytes form the ICMP header.
Mika Karjalainen 4:c449bead5cf3 47 * The first byte is for type, second for code and last two are for checksum which must always be set to zero.
Mika Karjalainen 4:c449bead5cf3 48 * Stack will calculate the checksum automatically before transmitting the packet. Header is followed by the payload.
Mika Karjalainen 4:c449bead5cf3 49
Mika Karjalainen 4:c449bead5cf3 50 * | ICMP Type | ICMP Code | Checksum | Payload | Notes |
Mika Karjalainen 4:c449bead5cf3 51 * | :-------: | :----------: | :-------: | :--------: | :--------------:|
Mika Karjalainen 4:c449bead5cf3 52 * | 1 | 1 | 2 | n (min. 4) | Length in bytes |
Mika Karjalainen 4:c449bead5cf3 53 * | 0xXX | 0xXX | 0x00 0x00 | n bytes | Transmit |
Mika Karjalainen 4:c449bead5cf3 54 * | 0xXX | 0xXX | 0xXX 0xXX | n bytes | Receive |
Mika Karjalainen 4:c449bead5cf3 55 *
Mika Karjalainen 4:c449bead5cf3 56 * ICMP echo request with 4 bytes of payload (ping6).
Mika Karjalainen 4:c449bead5cf3 57 *
Mika Karjalainen 4:c449bead5cf3 58 * | ICMP Type | ICMP Code | Checksum | Payload |
Mika Karjalainen 4:c449bead5cf3 59 * | :-------: | :----------: | :-------: | :-----------------: |
Mika Karjalainen 4:c449bead5cf3 60 * | 0x80 | 0x00 | 0x00 0x00 | 0x00 0x01 0x02 0x03 |
Mika Karjalainen 4:c449bead5cf3 61 *
Mika Karjalainen 4:c449bead5cf3 62 * ICMP echo response for the message above.
Mika Karjalainen 4:c449bead5cf3 63 *
Mika Karjalainen 4:c449bead5cf3 64 * | ICMP Type | ICMP Code | Checksum | Payload |
Mika Karjalainen 4:c449bead5cf3 65 * | :-------: | :----------: | :-------: | :-----------------: |
Mika Karjalainen 4:c449bead5cf3 66 * | 0x81 | 0x00 | 0xXX 0xXX | 0x00 0x01 0x02 0x03 |
Mika Karjalainen 4:c449bead5cf3 67 *
Mika Karjalainen 4:c449bead5cf3 68 * \section socket-receive Socket receiving
Mika Karjalainen 4:c449bead5cf3 69 * When there is data to read from the socket, a receive callback function is called with the socket event parameter from the library.
Mika Karjalainen 4:c449bead5cf3 70 * The state of the TCP socket then changes and the socket TX process is ready (SOCKET_TX_FAIL or SOCKET_TX_DONE).
Mika Karjalainen 4:c449bead5cf3 71 * Socket event has event_type and socket_id fields. The receive callback function must be defined when socket is opened using socket_open() API.
Mika Karjalainen 4:c449bead5cf3 72 *
Mika Karjalainen 4:c449bead5cf3 73 * All supported socket event types are listed here:
Mika Karjalainen 4:c449bead5cf3 74 *
Mika Karjalainen 4:c449bead5cf3 75 * | Event Type | Value | Description |
Mika Karjalainen 4:c449bead5cf3 76 * | :------------------------: | :---: | :-----------------------------------------------------------------: |
Mika Karjalainen 4:c449bead5cf3 77 * | SOCKET_EVENT_MASK | 0xF0 | NC Socket event mask |
Mika Karjalainen 4:c449bead5cf3 78 * | SOCKET_DATA | 0x00 | Data received, Read data length from d_len field |
Mika Karjalainen 4:c449bead5cf3 79 * | SOCKET_BIND_DONE | 0x10 | TCP connection ready |
Mika Karjalainen 4:c449bead5cf3 80 * | SOCKET_TX_FAIL | 0x50 | Socket data send failed |
Mika Karjalainen 4:c449bead5cf3 81 * | SOCKET_CONNECT_CLOSED | 0x60 | TCP connection closed |
jusu_81 11:1b7aaf37a131 82 * | SOCKET_CONNECT_FAIL_CLOSED | 0x70 | TCP connection closed � no ACK received |
Mika Karjalainen 4:c449bead5cf3 83 * | SOCKET_NO_ROUTER | 0x80 | No route available to destination |
Mika Karjalainen 4:c449bead5cf3 84 * | SOCKET_TX_DONE | 0x90 | Last Socket TX process Done, at TCP case Whole TCP Process is ready |
Mika Karjalainen 4:c449bead5cf3 85 *
Mika Karjalainen 4:c449bead5cf3 86 * When socket call back is called application need to handle event and read data from the socket socket_read().
Mika Karjalainen 4:c449bead5cf3 87 * Read operation release memory from stack when read is called or after callback automatic.
Mika Karjalainen 4:c449bead5cf3 88 *
Mika Karjalainen 4:c449bead5cf3 89 * Example for UDP Socket Callback handler:
Mika Karjalainen 4:c449bead5cf3 90 * @code
Mika Karjalainen 4:c449bead5cf3 91 void main_udp_receive(void * cb)
Mika Karjalainen 4:c449bead5cf3 92 {
Mika Karjalainen 4:c449bead5cf3 93 socket_callback_t * cb_res =0;
Mika Karjalainen 4:c449bead5cf3 94 int16_t length;
Mika Karjalainen 4:c449bead5cf3 95 cb_res = (socket_callback_t *) cb;
Mika Karjalainen 4:c449bead5cf3 96
Mika Karjalainen 4:c449bead5cf3 97 if(cb_res->event_type == SOCKET_DATA)
Mika Karjalainen 4:c449bead5cf3 98 {
Mika Karjalainen 4:c449bead5cf3 99 uint8_t *payload = 0;
Mika Karjalainen 4:c449bead5cf3 100 //Read Data and Handle Dta
Mika Karjalainen 4:c449bead5cf3 101 //error = socket_read_info(ap_sock_id, &info);
Mika Karjalainen 4:c449bead5cf3 102 if ( cb_res->d_len > 0)
Mika Karjalainen 4:c449bead5cf3 103 {
Mika Karjalainen 4:c449bead5cf3 104 //Read data to the RX buffer
Mika Karjalainen 4:c449bead5cf3 105 payload = (uint8_t *) MEM_ALLOC(cb_res->d_len);
Mika Karjalainen 4:c449bead5cf3 106 if(payload)
Mika Karjalainen 4:c449bead5cf3 107 {
Mika Karjalainen 4:c449bead5cf3 108 //Read data to the RX buffer
Mika Karjalainen 4:c449bead5cf3 109 length = socket_read(cb_res->socket_id, &app_src, payload, cb_res->d_len);
Mika Karjalainen 4:c449bead5cf3 110 if(length)
Mika Karjalainen 4:c449bead5cf3 111 {
Mika Karjalainen 4:c449bead5cf3 112
Mika Karjalainen 4:c449bead5cf3 113 uint8_t * ptr = payload ;
Mika Karjalainen 4:c449bead5cf3 114 //Handles data received in UDP
Mika Karjalainen 4:c449bead5cf3 115 debug("UDP Data From:");
Mika Karjalainen 4:c449bead5cf3 116 printf_ipv6_address(&(app_src.address[0]));
Mika Karjalainen 4:c449bead5cf3 117
Mika Karjalainen 4:c449bead5cf3 118 if(app_src.identifier == 7)
Mika Karjalainen 4:c449bead5cf3 119 {
Mika Karjalainen 4:c449bead5cf3 120 debug("Echo Response::");
Mika Karjalainen 4:c449bead5cf3 121 printf_array(ptr , length);
Mika Karjalainen 4:c449bead5cf3 122 }
Mika Karjalainen 4:c449bead5cf3 123 else
Mika Karjalainen 4:c449bead5cf3 124 {
Mika Karjalainen 4:c449bead5cf3 125 debug("Data:");
Mika Karjalainen 4:c449bead5cf3 126 printf_string(ptr , length);
Mika Karjalainen 4:c449bead5cf3 127 }
Mika Karjalainen 4:c449bead5cf3 128
Mika Karjalainen 4:c449bead5cf3 129 }
Mika Karjalainen 4:c449bead5cf3 130 MEM_FREE(payload);
Mika Karjalainen 4:c449bead5cf3 131 }
Mika Karjalainen 4:c449bead5cf3 132
Mika Karjalainen 4:c449bead5cf3 133 }
Mika Karjalainen 4:c449bead5cf3 134 else
Mika Karjalainen 4:c449bead5cf3 135 {
Mika Karjalainen 4:c449bead5cf3 136 debug("No Data\r\n");
Mika Karjalainen 4:c449bead5cf3 137 socket_read(cb_res->socket_id, &app_src, NULL, 0);
Mika Karjalainen 4:c449bead5cf3 138 }
Mika Karjalainen 4:c449bead5cf3 139 }
Mika Karjalainen 4:c449bead5cf3 140 else
Mika Karjalainen 4:c449bead5cf3 141 {
Mika Karjalainen 4:c449bead5cf3 142 if(cb_res->event_type == SOCKET_TX_DONE)
Mika Karjalainen 4:c449bead5cf3 143 {
Mika Karjalainen 4:c449bead5cf3 144 debug("UDP TX Done\r\n");
Mika Karjalainen 4:c449bead5cf3 145 }
Mika Karjalainen 4:c449bead5cf3 146 else
Mika Karjalainen 4:c449bead5cf3 147 {
Mika Karjalainen 4:c449bead5cf3 148 //No Route to Packet Destination Address
Mika Karjalainen 4:c449bead5cf3 149 if(cb_res->event_type == SOCKET_NO_ROUTE)
Mika Karjalainen 4:c449bead5cf3 150 {
Mika Karjalainen 4:c449bead5cf3 151 debug("ND/RPL not ready\r\n");
Mika Karjalainen 4:c449bead5cf3 152 }
Mika Karjalainen 4:c449bead5cf3 153 //Link Layer TX Fail for socket packet
Mika Karjalainen 4:c449bead5cf3 154 else if(cb_res->event_type == SOCKET_TX_FAIL)
Mika Karjalainen 4:c449bead5cf3 155 {
Mika Karjalainen 4:c449bead5cf3 156 debug("Link Layer Tx fail\r\n");
Mika Karjalainen 4:c449bead5cf3 157 }
Mika Karjalainen 4:c449bead5cf3 158
Mika Karjalainen 4:c449bead5cf3 159 }
Mika Karjalainen 4:c449bead5cf3 160 }
Mika Karjalainen 4:c449bead5cf3 161 }
Mika Karjalainen 4:c449bead5cf3 162 * @endcode
Mika Karjalainen 4:c449bead5cf3 163 *
Mika Karjalainen 4:c449bead5cf3 164 * Example for TCP Socket Callback handler:
Mika Karjalainen 4:c449bead5cf3 165 *
Mika Karjalainen 4:c449bead5cf3 166 * @code
Mika Karjalainen 4:c449bead5cf3 167 void main_tcp_receive(void * cb)
Mika Karjalainen 4:c449bead5cf3 168 {
Mika Karjalainen 4:c449bead5cf3 169 socket_callback_t * cb_res =0;
Mika Karjalainen 4:c449bead5cf3 170 int16_t length;
Mika Karjalainen 4:c449bead5cf3 171 cb_res = (socket_callback_t *) cb;
Mika Karjalainen 4:c449bead5cf3 172
Mika Karjalainen 4:c449bead5cf3 173 if(cb_res->event_type == SOCKET_DATA)
Mika Karjalainen 4:c449bead5cf3 174 {
Mika Karjalainen 4:c449bead5cf3 175 uint8_t *payload = 0;
Mika Karjalainen 4:c449bead5cf3 176 //Read Data
Mika Karjalainen 4:c449bead5cf3 177 if ( cb_res->d_len > 0)
Mika Karjalainen 4:c449bead5cf3 178 {
Mika Karjalainen 4:c449bead5cf3 179 //Read data to the RX buffer
Mika Karjalainen 4:c449bead5cf3 180 payload = (uint8_t *) MEM_ALLOC(cb_res->d_len);
Mika Karjalainen 4:c449bead5cf3 181 if(payload)
Mika Karjalainen 4:c449bead5cf3 182 {
Mika Karjalainen 4:c449bead5cf3 183 //Read data to the RX buffer
Mika Karjalainen 4:c449bead5cf3 184 length = socket_read(cb_res->socket_id, &app_src, payload, cb_res->d_len);
Mika Karjalainen 4:c449bead5cf3 185 if(length)
Mika Karjalainen 4:c449bead5cf3 186 {
Mika Karjalainen 4:c449bead5cf3 187
Mika Karjalainen 4:c449bead5cf3 188 uint8_t * ptr = payload ;
Mika Karjalainen 4:c449bead5cf3 189 //Handles data received in TCP socket
Mika Karjalainen 4:c449bead5cf3 190
Mika Karjalainen 4:c449bead5cf3 191 printf_ipv6_address(&(app_src.address[0]));
Mika Karjalainen 4:c449bead5cf3 192 //...App spesific
Mika Karjalainen 4:c449bead5cf3 193
Mika Karjalainen 4:c449bead5cf3 194 }
Mika Karjalainen 4:c449bead5cf3 195 MEM_FREE(payload);
Mika Karjalainen 4:c449bead5cf3 196 }
Mika Karjalainen 4:c449bead5cf3 197 }
Mika Karjalainen 4:c449bead5cf3 198 else
Mika Karjalainen 4:c449bead5cf3 199 {
Mika Karjalainen 4:c449bead5cf3 200 debug("No Data\r\n");
Mika Karjalainen 4:c449bead5cf3 201 socket_read(cb_res->socket_id, &app_src, NULL, 0);
Mika Karjalainen 4:c449bead5cf3 202 }
Mika Karjalainen 4:c449bead5cf3 203 }
Mika Karjalainen 4:c449bead5cf3 204 else
Mika Karjalainen 4:c449bead5cf3 205 {
Mika Karjalainen 4:c449bead5cf3 206 //TCP socket connection is ready
Mika Karjalainen 4:c449bead5cf3 207 if(cb_res->event_type == SOCKET_BIND_DONE)
Mika Karjalainen 4:c449bead5cf3 208 {
Mika Karjalainen 4:c449bead5cf3 209 debug("Connect Ready\r\n");
Mika Karjalainen 4:c449bead5cf3 210 if(socket_read_session_address(cb_res->socket_id, &app_src) == 0)
Mika Karjalainen 4:c449bead5cf3 211 {
Mika Karjalainen 4:c449bead5cf3 212 print_opened_port(app_src.identifier);
Mika Karjalainen 4:c449bead5cf3 213 debug(", ");
Mika Karjalainen 4:c449bead5cf3 214 printf_ipv6_address(&(app_src.address[0]));
Mika Karjalainen 4:c449bead5cf3 215 }
Mika Karjalainen 4:c449bead5cf3 216 //...App spesific
Mika Karjalainen 4:c449bead5cf3 217 }
Mika Karjalainen 4:c449bead5cf3 218 //TCP socket connection is closed
Mika Karjalainen 4:c449bead5cf3 219 else if(cb_res->event_type == SOCKET_CONNECT_CLOSED)
Mika Karjalainen 4:c449bead5cf3 220 {
Mika Karjalainen 4:c449bead5cf3 221 debug("Connection Closed\r\n");
Mika Karjalainen 4:c449bead5cf3 222
Mika Karjalainen 4:c449bead5cf3 223 }
Mika Karjalainen 4:c449bead5cf3 224 else if(cb_res->event_type == SOCKET_CONNECT_FAIL_CLOSED)
Mika Karjalainen 4:c449bead5cf3 225 {
Mika Karjalainen 4:c449bead5cf3 226 //TCP socket connection lost
Mika Karjalainen 4:c449bead5cf3 227 debug("TCP Connect Fail:No ACK\r\n");
Mika Karjalainen 4:c449bead5cf3 228 }
Mika Karjalainen 4:c449bead5cf3 229 else if(cb_res->event_type == SOCKET_TX_DONE)
Mika Karjalainen 4:c449bead5cf3 230 {
Mika Karjalainen 4:c449bead5cf3 231 if(socket_read_session_address(cb_res->socket_id, &app_src) == 0)
Mika Karjalainen 4:c449bead5cf3 232 {
Mika Karjalainen 4:c449bead5cf3 233 //Close Connection
Mika Karjalainen 4:c449bead5cf3 234 socket_close(cb_res->socket_id, &app_src,0);
Mika Karjalainen 4:c449bead5cf3 235 }
Mika Karjalainen 4:c449bead5cf3 236 }
Mika Karjalainen 4:c449bead5cf3 237 else
Mika Karjalainen 4:c449bead5cf3 238 {
Mika Karjalainen 4:c449bead5cf3 239 //No Route to Packet Destination Address
Mika Karjalainen 4:c449bead5cf3 240 if(cb_res->event_type == SOCKET_NO_ROUTE)
Mika Karjalainen 4:c449bead5cf3 241 {
Mika Karjalainen 4:c449bead5cf3 242 debug("ND/RPL not ready\r\n");
Mika Karjalainen 4:c449bead5cf3 243 }
Mika Karjalainen 4:c449bead5cf3 244 //Link Layer TX Fail for socket packet
Mika Karjalainen 4:c449bead5cf3 245 else if(cb_res->event_type == SOCKET_TX_FAIL)
Mika Karjalainen 4:c449bead5cf3 246 {
Mika Karjalainen 4:c449bead5cf3 247 debug("Link Layer Tx fail\r\n");
Mika Karjalainen 4:c449bead5cf3 248 }
Mika Karjalainen 4:c449bead5cf3 249 }
Mika Karjalainen 4:c449bead5cf3 250 }
Mika Karjalainen 4:c449bead5cf3 251 }
Mika Karjalainen 4:c449bead5cf3 252 * @endcode
Mika Karjalainen 4:c449bead5cf3 253 *
Mika Karjalainen 4:c449bead5cf3 254 * \section socket-tcp How to Use TCP sockets
Mika Karjalainen 4:c449bead5cf3 255 *
Mika Karjalainen 4:c449bead5cf3 256 * | API | Socket Type | Description |
Mika Karjalainen 4:c449bead5cf3 257 * | :---------------------------: | :-----------: | :------------------------------------------------------------: |
Mika Karjalainen 4:c449bead5cf3 258 * | socket_open() | Server/Client | Open socket to specific or dynamically port number. |
Mika Karjalainen 4:c449bead5cf3 259 * | socket_close() | Server/Client | Close opened TCP connection |
Mika Karjalainen 4:c449bead5cf3 260 * | socket_listen() | Server | Set server port to listen state |
Mika Karjalainen 4:c449bead5cf3 261 * | socket_connect() | Client | Connect client socket to specific destination |
Mika Karjalainen 4:c449bead5cf3 262 * | socket_send() | Client | Send data to session based destination |
Mika Karjalainen 4:c449bead5cf3 263 * | socket_sendto() | Server/Client | Send data to specific destination |
Mika Karjalainen 4:c449bead5cf3 264 * | socket_read_session_address() | Server/Client | Function read socket TCP session address and port information. |
Mika Karjalainen 4:c449bead5cf3 265 *
Mika Karjalainen 4:c449bead5cf3 266 * When TCP socket is opened it is in closed state. It must be set either listen or to connect state before it can be used to receive or transmit data.
Mika Karjalainen 4:c449bead5cf3 267 * SOCKET_TCP_TLS socket type is for secured TCP communication. Socket default TLS cipher suite is PSK. Change supported cipher suites can be set by sec_socket_set_chipher_suite_list() function.
Mika Karjalainen 4:c449bead5cf3 268 *
Mika Karjalainen 4:c449bead5cf3 269 * Socket can be set to listen mode by calling socket_listen() function. After the call the socket can accept an incoming connection from a remote host.
Mika Karjalainen 4:c449bead5cf3 270 * Listen mode closes the connection automatically after server timeout or when client or application closes the connection manually by socket_close() function.
Mika Karjalainen 4:c449bead5cf3 271 *
Mika Karjalainen 4:c449bead5cf3 272 * TCP socket can be connected to a remote host by calling socket_connect() with correct arguments. After the function call (non-blocking) application must wait for the socket event to confirm the successful state change of the socket.
Mika Karjalainen 4:c449bead5cf3 273 * After the event of successful state change data can be sent using socket_send() by client and socket_send() by server call.
Mika Karjalainen 4:c449bead5cf3 274 * Connection can be closed by calling socket_close() function or by server timeout.
Mika Karjalainen 4:c449bead5cf3 275 *
Mika Karjalainen 4:c449bead5cf3 276 * \section socket-udpicmp How to Use UDP and RAW Socket
Mika Karjalainen 4:c449bead5cf3 277 *
Mika Karjalainen 4:c449bead5cf3 278 * UDP socket is ready to receive and send data immediately after successful call of socket_open() and NET_READY event is received.
Mika Karjalainen 4:c449bead5cf3 279 * Data can be transmitted by using socket_sendto() function. ICMP socket works with same function call.
Mika Karjalainen 4:c449bead5cf3 280 *
Mika Karjalainen 4:c449bead5cf3 281 */
jusu_81 11:1b7aaf37a131 282 #ifdef __cplusplus
jusu_81 11:1b7aaf37a131 283 extern "C" {
jusu_81 11:1b7aaf37a131 284 #endif
Mika Karjalainen 4:c449bead5cf3 285 //#include "ns_platform.h"
Mika Karjalainen 4:c449bead5cf3 286 #include "ns_address.h"
Mika Karjalainen 4:c449bead5cf3 287
Mika Karjalainen 4:c449bead5cf3 288 /** Protocol IDs used when opened sockets*/
Mika Karjalainen 4:c449bead5cf3 289 /** Doesn't reserve anything. Socket in free. */
Mika Karjalainen 4:c449bead5cf3 290 #define SOCKET_NONE 0
Mika Karjalainen 4:c449bead5cf3 291 /** UDP socket type */
Mika Karjalainen 4:c449bead5cf3 292 #define SOCKET_UDP 17
Mika Karjalainen 4:c449bead5cf3 293 /** Normal TCP socket type */
Mika Karjalainen 4:c449bead5cf3 294 #define SOCKET_TCP 6
Mika Karjalainen 4:c449bead5cf3 295 /** TCP socket with TLS authentication */
Mika Karjalainen 4:c449bead5cf3 296 #define SOCKET_TCP_TLS 7
Mika Karjalainen 4:c449bead5cf3 297
Mika Karjalainen 4:c449bead5cf3 298 /**
Mika Karjalainen 4:c449bead5cf3 299 * \brief A function to open a raw ICMP socket.
Mika Karjalainen 4:c449bead5cf3 300 *
Mika Karjalainen 4:c449bead5cf3 301 * \param passed_fptr pointer to socket callback function
Mika Karjalainen 4:c449bead5cf3 302 *
Mika Karjalainen 4:c449bead5cf3 303 * \return positive socket opened
Mika Karjalainen 4:c449bead5cf3 304 * \return eFALSE no free sockets
Mika Karjalainen 4:c449bead5cf3 305 * \return eBUSY port reserved
Mika Karjalainen 4:c449bead5cf3 306 */
Mika Karjalainen 4:c449bead5cf3 307 extern int8_t socket_raw_open(void (*passed_fptr)(void *));
Mika Karjalainen 4:c449bead5cf3 308
Mika Karjalainen 4:c449bead5cf3 309 #define SOCKET_ICMP 32
Mika Karjalainen 4:c449bead5cf3 310 /** ICMP Socket instruction
Mika Karjalainen 4:c449bead5cf3 311 *
Mika Karjalainen 4:c449bead5cf3 312 * If used ICMP socket, minimum payload length is 8-bytes, where first 4-bytes form ICMP header.
Mika Karjalainen 4:c449bead5cf3 313 * First byte is for type, second for code and last two are for checksum witch must always be zero.
Mika Karjalainen 4:c449bead5cf3 314 * Stack will calculate the checksum automatically when send. Payload comes after the header.
Mika Karjalainen 4:c449bead5cf3 315 *
Mika Karjalainen 4:c449bead5cf3 316 * This applies for reading and sending.
Mika Karjalainen 4:c449bead5cf3 317 *
Mika Karjalainen 4:c449bead5cf3 318 * ICMP TYPE ICMP Code ICMP Checksum (2-bytes) Payload n-bytes (min. 4 bytes)
Mika Karjalainen 4:c449bead5cf3 319 * -------- -------- -------- -------- -------- -------- ....... -------
Mika Karjalainen 4:c449bead5cf3 320 * 0xXX 0xXX 0x00 0x00 0xXX 0xXX ...... 0xXX
Mika Karjalainen 4:c449bead5cf3 321 *
Mika Karjalainen 4:c449bead5cf3 322 * Example data flow for ping:
Mika Karjalainen 4:c449bead5cf3 323 *
Mika Karjalainen 4:c449bead5cf3 324 * ICMP echo request with 4-bytes payload (Ping6).
Mika Karjalainen 4:c449bead5cf3 325 * 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03
Mika Karjalainen 4:c449bead5cf3 326 *
Mika Karjalainen 4:c449bead5cf3 327 * ICMP echo response for the message above.
Mika Karjalainen 4:c449bead5cf3 328 * 0x81, 0x00, 0xXX, 0xXX, 0x00, 0x01, 0x02, 0x03
Mika Karjalainen 4:c449bead5cf3 329 */
Mika Karjalainen 4:c449bead5cf3 330
Mika Karjalainen 4:c449bead5cf3 331 #ifndef SOCKET_CALLBACK_T
Mika Karjalainen 4:c449bead5cf3 332 #define SOCKET_CALLBACK_T
Mika Karjalainen 4:c449bead5cf3 333 /*!
Mika Karjalainen 4:c449bead5cf3 334 * \struct socket_callback_t
Mika Karjalainen 4:c449bead5cf3 335 * \brief Socket Callback function structure type.
Mika Karjalainen 4:c449bead5cf3 336 */
Mika Karjalainen 4:c449bead5cf3 337 typedef struct socket_callback_t
Mika Karjalainen 4:c449bead5cf3 338 {
Mika Karjalainen 4:c449bead5cf3 339 uint8_t event_type; /**< Socket Callback Event check list below*/
Mika Karjalainen 4:c449bead5cf3 340 uint8_t socket_id; /** Socket id queue which socket cause call back */
Mika Karjalainen 4:c449bead5cf3 341 uint16_t d_len; /** Data length if event type is SOCKET_DATA */
Mika Karjalainen 4:c449bead5cf3 342 uint8_t LINK_LQI; /** LINK LQI info if interface cuold give */
Mika Karjalainen 4:c449bead5cf3 343 } socket_callback_t;
Mika Karjalainen 4:c449bead5cf3 344 #endif
Mika Karjalainen 4:c449bead5cf3 345
Mika Karjalainen 4:c449bead5cf3 346 /**
Mika Karjalainen 4:c449bead5cf3 347 * \brief Used to initialize a socket for communication.
Mika Karjalainen 4:c449bead5cf3 348 *
Mika Karjalainen 4:c449bead5cf3 349 * Note: Maximum of seven sockets at the same time is supported.
Mika Karjalainen 4:c449bead5cf3 350 *
Mika Karjalainen 4:c449bead5cf3 351 * \param protocol defines the protocol to use.
Mika Karjalainen 4:c449bead5cf3 352 * \param identifier is e.g. in case of UDP, the UDP port.
Mika Karjalainen 4:c449bead5cf3 353 * \param passed_fptr is a function pointer to a function that is called whenever a data frame is received to this socket.
Mika Karjalainen 4:c449bead5cf3 354 *
Mika Karjalainen 4:c449bead5cf3 355 * \return 0 or greater on success; return value is the socket ID.
Mika Karjalainen 4:c449bead5cf3 356 * \return -1 on failure.
Mika Karjalainen 4:c449bead5cf3 357 *
Mika Karjalainen 4:c449bead5cf3 358 * Note: PROTOCOL_TCP_TLS socket default TLS chiphersuite is PSK.
Mika Karjalainen 4:c449bead5cf3 359 */
Mika Karjalainen 4:c449bead5cf3 360 extern int8_t socket_open(uint8_t protocol, uint16_t identifier, void (*passed_fptr)(void *));
Mika Karjalainen 4:c449bead5cf3 361
Mika Karjalainen 4:c449bead5cf3 362 /**
Mika Karjalainen 4:c449bead5cf3 363 * \brief A function to free a socket.
Mika Karjalainen 4:c449bead5cf3 364 *
Mika Karjalainen 4:c449bead5cf3 365 * \param socket ID of the socket to be released.
Mika Karjalainen 4:c449bead5cf3 366 *
Mika Karjalainen 4:c449bead5cf3 367 * \return 0 socket released.
Mika Karjalainen 4:c449bead5cf3 368 * \return -1 socket not released.
Mika Karjalainen 4:c449bead5cf3 369 */
Mika Karjalainen 4:c449bead5cf3 370 extern int8_t socket_free(int8_t socket);
Mika Karjalainen 4:c449bead5cf3 371
Mika Karjalainen 4:c449bead5cf3 372 /**
Mika Karjalainen 4:c449bead5cf3 373 * \brief A function to set the socket to the listening mode.
Mika Karjalainen 4:c449bead5cf3 374 *
Mika Karjalainen 4:c449bead5cf3 375 * \param socket socket ID to bind
Mika Karjalainen 4:c449bead5cf3 376 * \return 0 on success.
Mika Karjalainen 4:c449bead5cf3 377 * \return -1 on failure.
Mika Karjalainen 4:c449bead5cf3 378 */
Mika Karjalainen 4:c449bead5cf3 379 extern int8_t socket_listen(int8_t socket);
Mika Karjalainen 4:c449bead5cf3 380
Mika Karjalainen 4:c449bead5cf3 381 /**
Mika Karjalainen 4:c449bead5cf3 382 * \brief A function to connect to remote peer (TCP).
Mika Karjalainen 4:c449bead5cf3 383 *
Mika Karjalainen 4:c449bead5cf3 384 * Used by the application to send data.
Mika Karjalainen 4:c449bead5cf3 385 *
Mika Karjalainen 4:c449bead5cf3 386 * \param socket socket id
Mika Karjalainen 4:c449bead5cf3 387 * \param address address of remote peer
Mika Karjalainen 4:c449bead5cf3 388 * \param randomly_take_src_number 1=enable find next free random port number for current one
Mika Karjalainen 4:c449bead5cf3 389 *
Mika Karjalainen 4:c449bead5cf3 390 * \return eOK done
Mika Karjalainen 4:c449bead5cf3 391 * \return eFALSE invalid socket id
Mika Karjalainen 4:c449bead5cf3 392 */
Mika Karjalainen 4:c449bead5cf3 393 extern int8_t socket_connect(int8_t socket, ns_address_t *address, uint8_t randomly_take_src_number);
Mika Karjalainen 4:c449bead5cf3 394
Mika Karjalainen 4:c449bead5cf3 395 /**
Mika Karjalainen 4:c449bead5cf3 396 * \brief A function to close a connection.
Mika Karjalainen 4:c449bead5cf3 397 *
Mika Karjalainen 4:c449bead5cf3 398 * \param socket refers to the socket ID to close.
Mika Karjalainen 4:c449bead5cf3 399 * \param address refers to the destination client address. When using as a client, a null pointer shall be passed.
Mika Karjalainen 4:c449bead5cf3 400 * \param release_security_session refers to the security session id.
Mika Karjalainen 4:c449bead5cf3 401 *
Mika Karjalainen 4:c449bead5cf3 402 * \return 0 on success.
Mika Karjalainen 4:c449bead5cf3 403 * \return -1 if a given socket ID is not found, if a socket type is wrong or tcp_close() returns a failure.
Mika Karjalainen 4:c449bead5cf3 404 * \return -2 if no active tcp session was found.
Mika Karjalainen 4:c449bead5cf3 405 * \return -3 if referred socket ID port is declared as a zero.
Mika Karjalainen 4:c449bead5cf3 406 *
Mika Karjalainen 4:c449bead5cf3 407 * Note: randomly_take_src_number is highly recommend to use always. Stack will generate new source port between 49152-65534.
Mika Karjalainen 4:c449bead5cf3 408 */
Mika Karjalainen 4:c449bead5cf3 409 extern int8_t socket_close(int8_t socket,ns_address_t *address, uint8_t release_security_session);
Mika Karjalainen 4:c449bead5cf3 410
Mika Karjalainen 4:c449bead5cf3 411 /**
Mika Karjalainen 4:c449bead5cf3 412 * \brief Used to send data via a connected TCP socket by client.
Mika Karjalainen 4:c449bead5cf3 413 *
Mika Karjalainen 4:c449bead5cf3 414 * Note: Socket connection must be ready before using this function.
Mika Karjalainen 4:c449bead5cf3 415 * Stack will automatically use the address of the remote connected host as the destination address for the packet.
Mika Karjalainen 4:c449bead5cf3 416 *
Mika Karjalainen 4:c449bead5cf3 417 * \param socket socket id
Mika Karjalainen 4:c449bead5cf3 418 * \param buffer pointer to data
Mika Karjalainen 4:c449bead5cf3 419 * \param length data length
Mika Karjalainen 4:c449bead5cf3 420 *
Mika Karjalainen 4:c449bead5cf3 421 * \return 0 done
Mika Karjalainen 4:c449bead5cf3 422 * \return -1 invalid socket id
Mika Karjalainen 4:c449bead5cf3 423 * \return -2 Socket memory allocation fail
Mika Karjalainen 4:c449bead5cf3 424 * \return -3 TCP state not established
Mika Karjalainen 4:c449bead5cf3 425 * \return -4 Socket tx process busy
Mika Karjalainen 4:c449bead5cf3 426 * \return -5 TLS authentication not ready
Mika Karjalainen 4:c449bead5cf3 427 * \return -6 Packet too short
Mika Karjalainen 4:c449bead5cf3 428 *
Mika Karjalainen 4:c449bead5cf3 429 * Server need to use always specific address information when it close socket.
Mika Karjalainen 4:c449bead5cf3 430 * Client may set address pointer to NULL.
Mika Karjalainen 4:c449bead5cf3 431 *
Mika Karjalainen 4:c449bead5cf3 432 */
Mika Karjalainen 4:c449bead5cf3 433 extern int8_t socket_send(int8_t socket, uint8_t *buffer, uint16_t length);
Mika Karjalainen 4:c449bead5cf3 434
Mika Karjalainen 4:c449bead5cf3 435 /**
Mika Karjalainen 4:c449bead5cf3 436 * \brief A function to read received data buffer from a socket.
Mika Karjalainen 4:c449bead5cf3 437 *
Mika Karjalainen 4:c449bead5cf3 438 * Used by the application to get data from a socket.
Mika Karjalainen 4:c449bead5cf3 439 *
Mika Karjalainen 4:c449bead5cf3 440 * \param socket refers to socket ID to be read from.
Mika Karjalainen 4:c449bead5cf3 441 * \param address is a pointer to the address structure, allocated by an application; source address is copied into this structure.
Mika Karjalainen 4:c449bead5cf3 442 * \param buffer is a pointer to an array to where the read data is written to.
Mika Karjalainen 4:c449bead5cf3 443 * \param length is the maximum length of the allocated buffer.
Mika Karjalainen 4:c449bead5cf3 444 *
Mika Karjalainen 4:c449bead5cf3 445 * \return 0 if no data is read.
Mika Karjalainen 4:c449bead5cf3 446 * \return greater than 0, indicating the length of the data copied to buffer.
Mika Karjalainen 4:c449bead5cf3 447 *
Mika Karjalainen 4:c449bead5cf3 448 */
Mika Karjalainen 4:c449bead5cf3 449 extern int16_t socket_read(int8_t socket, ns_address_t *address, uint8_t *buffer, uint16_t length);
Mika Karjalainen 4:c449bead5cf3 450
Mika Karjalainen 4:c449bead5cf3 451 /**
Mika Karjalainen 4:c449bead5cf3 452 * \brief Used to send UDP, TCP or raw ICMP data via the socket.
Mika Karjalainen 4:c449bead5cf3 453 *
Mika Karjalainen 4:c449bead5cf3 454 * Used by the application to send data.
Mika Karjalainen 4:c449bead5cf3 455 *
Mika Karjalainen 4:c449bead5cf3 456 * \param socket refers to socket ID.
Mika Karjalainen 4:c449bead5cf3 457 * \param address is a pointer to the destination address information.
Mika Karjalainen 4:c449bead5cf3 458 * \param buffer is a pointer to a data to be sent.
Mika Karjalainen 4:c449bead5cf3 459 * \param length is a length of the data to be sent.
Mika Karjalainen 4:c449bead5cf3 460 * \return 0 on success.
Mika Karjalainen 4:c449bead5cf3 461 * \return -1 invalid socket id.
Mika Karjalainen 4:c449bead5cf3 462 * \return -2 Socket memory allocation fail.
Mika Karjalainen 4:c449bead5cf3 463 * \return -3 TCP state not established.
Mika Karjalainen 4:c449bead5cf3 464 * \return -4 Socket tx process busy.
Mika Karjalainen 4:c449bead5cf3 465 * \return -5 TLS authentication not ready.
Mika Karjalainen 4:c449bead5cf3 466 * \return -6 Packet too short.
Mika Karjalainen 4:c449bead5cf3 467 */
Mika Karjalainen 4:c449bead5cf3 468 extern int8_t socket_sendto(int8_t socket, ns_address_t *address, uint8_t *buffer, uint16_t length);
Mika Karjalainen 4:c449bead5cf3 469
Mika Karjalainen 4:c449bead5cf3 470 /**
Mika Karjalainen 4:c449bead5cf3 471 * \brief A function to read signal information and length info from a socket.
Mika Karjalainen 4:c449bead5cf3 472 *
Mika Karjalainen 4:c449bead5cf3 473 * Used by the application to read signal info.
Mika Karjalainen 4:c449bead5cf3 474 *
Mika Karjalainen 4:c449bead5cf3 475 * \param socket socket id
Mika Karjalainen 4:c449bead5cf3 476 * \param info pointer to response data
Mika Karjalainen 4:c449bead5cf3 477 *
Mika Karjalainen 4:c449bead5cf3 478 * \return eOK done
Mika Karjalainen 4:c449bead5cf3 479 * \return eFALSE invalid socket id
Mika Karjalainen 4:c449bead5cf3 480 */
Mika Karjalainen 4:c449bead5cf3 481 //extern int8_t socket_read_info(int8_t socket, rf_info_t *info);
Mika Karjalainen 4:c449bead5cf3 482 /**
Mika Karjalainen 4:c449bead5cf3 483 * \brief A function to read a session info for TCP event.
Mika Karjalainen 4:c449bead5cf3 484 *
Mika Karjalainen 4:c449bead5cf3 485 *
Mika Karjalainen 4:c449bead5cf3 486 * \param socket refers to the ID to be read from.
Mika Karjalainen 4:c449bead5cf3 487 * \param address is a pointer to the address structure to where the session address information is read to.
Mika Karjalainen 4:c449bead5cf3 488 *
Mika Karjalainen 4:c449bead5cf3 489 * \return 0 on success.
Mika Karjalainen 4:c449bead5cf3 490 * \return -1 if no socket is found or TCP is not compiled into this project.
Mika Karjalainen 4:c449bead5cf3 491 * \return -2 if no session information is found.
Mika Karjalainen 4:c449bead5cf3 492 *
Mika Karjalainen 4:c449bead5cf3 493 * Note: Function should be called only at Socket call back call when socket event is SOCKET_BIND_DONE or SOCKET_TX_DONE.
Mika Karjalainen 4:c449bead5cf3 494 * The following sections introduce those functions.
Mika Karjalainen 4:c449bead5cf3 495 */
Mika Karjalainen 4:c449bead5cf3 496 extern int8_t socket_read_session_address(int8_t socket, ns_address_t *address);
Mika Karjalainen 4:c449bead5cf3 497
Mika Karjalainen 4:c449bead5cf3 498 /** Protocol levels used for socket_setsockopt */
Mika Karjalainen 4:c449bead5cf3 499 #define SOCKET_IPPROTO_IPV6 41
Mika Karjalainen 4:c449bead5cf3 500
Mika Karjalainen 4:c449bead5cf3 501 /** Option names for protocol level SOCKET_IPPROTO_IPV6 */
Mika Karjalainen 4:c449bead5cf3 502 /** Specify traffic class for outgoing packets, as int16_t (RFC 3542 S6.5 says int); valid values 0-255, or -1 for system default */
Mika Karjalainen 4:c449bead5cf3 503 #define SOCKET_IPV6_TCLASS 1
Mika Karjalainen 4:c449bead5cf3 504
Mika Karjalainen 4:c449bead5cf3 505 /**
Mika Karjalainen 4:c449bead5cf3 506 * \brief Set an option for a socket
Mika Karjalainen 4:c449bead5cf3 507 *
Mika Karjalainen 4:c449bead5cf3 508 * Used to specify miscellaneous options for a socket. Supported levels and
Mika Karjalainen 4:c449bead5cf3 509 * names defined above.
Mika Karjalainen 4:c449bead5cf3 510 *
Mika Karjalainen 4:c449bead5cf3 511 * \param socket socket id
Mika Karjalainen 4:c449bead5cf3 512 * \param level protocol level
Mika Karjalainen 4:c449bead5cf3 513 * \param opt_name option name (interpretation depends on level)
Mika Karjalainen 4:c449bead5cf3 514 * \param opt_value pointer to value for the specified option
Mika Karjalainen 4:c449bead5cf3 515 * \param opt_len size of the data pointed to by value
Mika Karjalainen 4:c449bead5cf3 516 *
Mika Karjalainen 4:c449bead5cf3 517 * \return 0 on success
Mika Karjalainen 4:c449bead5cf3 518 * \return -1 invalid socket id
Mika Karjalainen 4:c449bead5cf3 519 * \return -2 invalid/unsupported option
Mika Karjalainen 4:c449bead5cf3 520 * \return -3 invalid option value
Mika Karjalainen 4:c449bead5cf3 521 */
Mika Karjalainen 4:c449bead5cf3 522 extern int8_t socket_setsockopt(int8_t socket, uint8_t level, uint8_t opt_name, const void *opt_value, uint16_t opt_len);
jusu_81 11:1b7aaf37a131 523 #ifdef __cplusplus
jusu_81 11:1b7aaf37a131 524 }
jusu_81 11:1b7aaf37a131 525 #endif
Mika Karjalainen 4:c449bead5cf3 526 #endif /*_NS_SOCKET_H*/