Sergio Scaglia / Nanostack_lib

Dependents:   mbedEndpointNetwork mbedEndpointNetworkMJK

Fork of Nanostack_lib by Sensinode

Committer:
Mika Karjalainen
Date:
Tue Jun 24 16:48:01 2014 +0300
Revision:
4:c449bead5cf3
Child:
11:1b7aaf37a131
Creating initial nanostack release

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 |
Mika Karjalainen 4:c449bead5cf3 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 */
Mika Karjalainen 4:c449bead5cf3 282
Mika Karjalainen 4:c449bead5cf3 283 //#include "ns_platform.h"
Mika Karjalainen 4:c449bead5cf3 284 #include "ns_address.h"
Mika Karjalainen 4:c449bead5cf3 285
Mika Karjalainen 4:c449bead5cf3 286 /** Protocol IDs used when opened sockets*/
Mika Karjalainen 4:c449bead5cf3 287 /** Doesn't reserve anything. Socket in free. */
Mika Karjalainen 4:c449bead5cf3 288 #define SOCKET_NONE 0
Mika Karjalainen 4:c449bead5cf3 289 /** UDP socket type */
Mika Karjalainen 4:c449bead5cf3 290 #define SOCKET_UDP 17
Mika Karjalainen 4:c449bead5cf3 291 /** Normal TCP socket type */
Mika Karjalainen 4:c449bead5cf3 292 #define SOCKET_TCP 6
Mika Karjalainen 4:c449bead5cf3 293 /** TCP socket with TLS authentication */
Mika Karjalainen 4:c449bead5cf3 294 #define SOCKET_TCP_TLS 7
Mika Karjalainen 4:c449bead5cf3 295
Mika Karjalainen 4:c449bead5cf3 296 /**
Mika Karjalainen 4:c449bead5cf3 297 * \brief A function to open a raw ICMP socket.
Mika Karjalainen 4:c449bead5cf3 298 *
Mika Karjalainen 4:c449bead5cf3 299 * \param passed_fptr pointer to socket callback function
Mika Karjalainen 4:c449bead5cf3 300 *
Mika Karjalainen 4:c449bead5cf3 301 * \return positive socket opened
Mika Karjalainen 4:c449bead5cf3 302 * \return eFALSE no free sockets
Mika Karjalainen 4:c449bead5cf3 303 * \return eBUSY port reserved
Mika Karjalainen 4:c449bead5cf3 304 */
Mika Karjalainen 4:c449bead5cf3 305 extern int8_t socket_raw_open(void (*passed_fptr)(void *));
Mika Karjalainen 4:c449bead5cf3 306
Mika Karjalainen 4:c449bead5cf3 307 #define SOCKET_ICMP 32
Mika Karjalainen 4:c449bead5cf3 308 /** ICMP Socket instruction
Mika Karjalainen 4:c449bead5cf3 309 *
Mika Karjalainen 4:c449bead5cf3 310 * If used ICMP socket, minimum payload length is 8-bytes, where first 4-bytes form ICMP header.
Mika Karjalainen 4:c449bead5cf3 311 * First byte is for type, second for code and last two are for checksum witch must always be zero.
Mika Karjalainen 4:c449bead5cf3 312 * Stack will calculate the checksum automatically when send. Payload comes after the header.
Mika Karjalainen 4:c449bead5cf3 313 *
Mika Karjalainen 4:c449bead5cf3 314 * This applies for reading and sending.
Mika Karjalainen 4:c449bead5cf3 315 *
Mika Karjalainen 4:c449bead5cf3 316 * ICMP TYPE ICMP Code ICMP Checksum (2-bytes) Payload n-bytes (min. 4 bytes)
Mika Karjalainen 4:c449bead5cf3 317 * -------- -------- -------- -------- -------- -------- ....... -------
Mika Karjalainen 4:c449bead5cf3 318 * 0xXX 0xXX 0x00 0x00 0xXX 0xXX ...... 0xXX
Mika Karjalainen 4:c449bead5cf3 319 *
Mika Karjalainen 4:c449bead5cf3 320 * Example data flow for ping:
Mika Karjalainen 4:c449bead5cf3 321 *
Mika Karjalainen 4:c449bead5cf3 322 * ICMP echo request with 4-bytes payload (Ping6).
Mika Karjalainen 4:c449bead5cf3 323 * 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03
Mika Karjalainen 4:c449bead5cf3 324 *
Mika Karjalainen 4:c449bead5cf3 325 * ICMP echo response for the message above.
Mika Karjalainen 4:c449bead5cf3 326 * 0x81, 0x00, 0xXX, 0xXX, 0x00, 0x01, 0x02, 0x03
Mika Karjalainen 4:c449bead5cf3 327 */
Mika Karjalainen 4:c449bead5cf3 328
Mika Karjalainen 4:c449bead5cf3 329 #ifndef SOCKET_CALLBACK_T
Mika Karjalainen 4:c449bead5cf3 330 #define SOCKET_CALLBACK_T
Mika Karjalainen 4:c449bead5cf3 331 /*!
Mika Karjalainen 4:c449bead5cf3 332 * \struct socket_callback_t
Mika Karjalainen 4:c449bead5cf3 333 * \brief Socket Callback function structure type.
Mika Karjalainen 4:c449bead5cf3 334 */
Mika Karjalainen 4:c449bead5cf3 335 typedef struct socket_callback_t
Mika Karjalainen 4:c449bead5cf3 336 {
Mika Karjalainen 4:c449bead5cf3 337 uint8_t event_type; /**< Socket Callback Event check list below*/
Mika Karjalainen 4:c449bead5cf3 338 uint8_t socket_id; /** Socket id queue which socket cause call back */
Mika Karjalainen 4:c449bead5cf3 339 uint16_t d_len; /** Data length if event type is SOCKET_DATA */
Mika Karjalainen 4:c449bead5cf3 340 uint8_t LINK_LQI; /** LINK LQI info if interface cuold give */
Mika Karjalainen 4:c449bead5cf3 341 } socket_callback_t;
Mika Karjalainen 4:c449bead5cf3 342 #endif
Mika Karjalainen 4:c449bead5cf3 343
Mika Karjalainen 4:c449bead5cf3 344 /**
Mika Karjalainen 4:c449bead5cf3 345 * \brief Used to initialize a socket for communication.
Mika Karjalainen 4:c449bead5cf3 346 *
Mika Karjalainen 4:c449bead5cf3 347 * Note: Maximum of seven sockets at the same time is supported.
Mika Karjalainen 4:c449bead5cf3 348 *
Mika Karjalainen 4:c449bead5cf3 349 * \param protocol defines the protocol to use.
Mika Karjalainen 4:c449bead5cf3 350 * \param identifier is e.g. in case of UDP, the UDP port.
Mika Karjalainen 4:c449bead5cf3 351 * \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 352 *
Mika Karjalainen 4:c449bead5cf3 353 * \return 0 or greater on success; return value is the socket ID.
Mika Karjalainen 4:c449bead5cf3 354 * \return -1 on failure.
Mika Karjalainen 4:c449bead5cf3 355 *
Mika Karjalainen 4:c449bead5cf3 356 * Note: PROTOCOL_TCP_TLS socket default TLS chiphersuite is PSK.
Mika Karjalainen 4:c449bead5cf3 357 */
Mika Karjalainen 4:c449bead5cf3 358 extern int8_t socket_open(uint8_t protocol, uint16_t identifier, void (*passed_fptr)(void *));
Mika Karjalainen 4:c449bead5cf3 359
Mika Karjalainen 4:c449bead5cf3 360 /**
Mika Karjalainen 4:c449bead5cf3 361 * \brief A function to free a socket.
Mika Karjalainen 4:c449bead5cf3 362 *
Mika Karjalainen 4:c449bead5cf3 363 * \param socket ID of the socket to be released.
Mika Karjalainen 4:c449bead5cf3 364 *
Mika Karjalainen 4:c449bead5cf3 365 * \return 0 socket released.
Mika Karjalainen 4:c449bead5cf3 366 * \return -1 socket not released.
Mika Karjalainen 4:c449bead5cf3 367 */
Mika Karjalainen 4:c449bead5cf3 368 extern int8_t socket_free(int8_t socket);
Mika Karjalainen 4:c449bead5cf3 369
Mika Karjalainen 4:c449bead5cf3 370 /**
Mika Karjalainen 4:c449bead5cf3 371 * \brief A function to set the socket to the listening mode.
Mika Karjalainen 4:c449bead5cf3 372 *
Mika Karjalainen 4:c449bead5cf3 373 * \param socket socket ID to bind
Mika Karjalainen 4:c449bead5cf3 374 * \return 0 on success.
Mika Karjalainen 4:c449bead5cf3 375 * \return -1 on failure.
Mika Karjalainen 4:c449bead5cf3 376 */
Mika Karjalainen 4:c449bead5cf3 377 extern int8_t socket_listen(int8_t socket);
Mika Karjalainen 4:c449bead5cf3 378
Mika Karjalainen 4:c449bead5cf3 379 /**
Mika Karjalainen 4:c449bead5cf3 380 * \brief A function to connect to remote peer (TCP).
Mika Karjalainen 4:c449bead5cf3 381 *
Mika Karjalainen 4:c449bead5cf3 382 * Used by the application to send data.
Mika Karjalainen 4:c449bead5cf3 383 *
Mika Karjalainen 4:c449bead5cf3 384 * \param socket socket id
Mika Karjalainen 4:c449bead5cf3 385 * \param address address of remote peer
Mika Karjalainen 4:c449bead5cf3 386 * \param randomly_take_src_number 1=enable find next free random port number for current one
Mika Karjalainen 4:c449bead5cf3 387 *
Mika Karjalainen 4:c449bead5cf3 388 * \return eOK done
Mika Karjalainen 4:c449bead5cf3 389 * \return eFALSE invalid socket id
Mika Karjalainen 4:c449bead5cf3 390 */
Mika Karjalainen 4:c449bead5cf3 391 extern int8_t socket_connect(int8_t socket, ns_address_t *address, uint8_t randomly_take_src_number);
Mika Karjalainen 4:c449bead5cf3 392
Mika Karjalainen 4:c449bead5cf3 393 /**
Mika Karjalainen 4:c449bead5cf3 394 * \brief A function to close a connection.
Mika Karjalainen 4:c449bead5cf3 395 *
Mika Karjalainen 4:c449bead5cf3 396 * \param socket refers to the socket ID to close.
Mika Karjalainen 4:c449bead5cf3 397 * \param address refers to the destination client address. When using as a client, a null pointer shall be passed.
Mika Karjalainen 4:c449bead5cf3 398 * \param release_security_session refers to the security session id.
Mika Karjalainen 4:c449bead5cf3 399 *
Mika Karjalainen 4:c449bead5cf3 400 * \return 0 on success.
Mika Karjalainen 4:c449bead5cf3 401 * \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 402 * \return -2 if no active tcp session was found.
Mika Karjalainen 4:c449bead5cf3 403 * \return -3 if referred socket ID port is declared as a zero.
Mika Karjalainen 4:c449bead5cf3 404 *
Mika Karjalainen 4:c449bead5cf3 405 * Note: randomly_take_src_number is highly recommend to use always. Stack will generate new source port between 49152-65534.
Mika Karjalainen 4:c449bead5cf3 406 */
Mika Karjalainen 4:c449bead5cf3 407 extern int8_t socket_close(int8_t socket,ns_address_t *address, uint8_t release_security_session);
Mika Karjalainen 4:c449bead5cf3 408
Mika Karjalainen 4:c449bead5cf3 409 /**
Mika Karjalainen 4:c449bead5cf3 410 * \brief Used to send data via a connected TCP socket by client.
Mika Karjalainen 4:c449bead5cf3 411 *
Mika Karjalainen 4:c449bead5cf3 412 * Note: Socket connection must be ready before using this function.
Mika Karjalainen 4:c449bead5cf3 413 * Stack will automatically use the address of the remote connected host as the destination address for the packet.
Mika Karjalainen 4:c449bead5cf3 414 *
Mika Karjalainen 4:c449bead5cf3 415 * \param socket socket id
Mika Karjalainen 4:c449bead5cf3 416 * \param buffer pointer to data
Mika Karjalainen 4:c449bead5cf3 417 * \param length data length
Mika Karjalainen 4:c449bead5cf3 418 *
Mika Karjalainen 4:c449bead5cf3 419 * \return 0 done
Mika Karjalainen 4:c449bead5cf3 420 * \return -1 invalid socket id
Mika Karjalainen 4:c449bead5cf3 421 * \return -2 Socket memory allocation fail
Mika Karjalainen 4:c449bead5cf3 422 * \return -3 TCP state not established
Mika Karjalainen 4:c449bead5cf3 423 * \return -4 Socket tx process busy
Mika Karjalainen 4:c449bead5cf3 424 * \return -5 TLS authentication not ready
Mika Karjalainen 4:c449bead5cf3 425 * \return -6 Packet too short
Mika Karjalainen 4:c449bead5cf3 426 *
Mika Karjalainen 4:c449bead5cf3 427 * Server need to use always specific address information when it close socket.
Mika Karjalainen 4:c449bead5cf3 428 * Client may set address pointer to NULL.
Mika Karjalainen 4:c449bead5cf3 429 *
Mika Karjalainen 4:c449bead5cf3 430 */
Mika Karjalainen 4:c449bead5cf3 431 extern int8_t socket_send(int8_t socket, uint8_t *buffer, uint16_t length);
Mika Karjalainen 4:c449bead5cf3 432
Mika Karjalainen 4:c449bead5cf3 433 /**
Mika Karjalainen 4:c449bead5cf3 434 * \brief A function to read received data buffer from a socket.
Mika Karjalainen 4:c449bead5cf3 435 *
Mika Karjalainen 4:c449bead5cf3 436 * Used by the application to get data from a socket.
Mika Karjalainen 4:c449bead5cf3 437 *
Mika Karjalainen 4:c449bead5cf3 438 * \param socket refers to socket ID to be read from.
Mika Karjalainen 4:c449bead5cf3 439 * \param address is a pointer to the address structure, allocated by an application; source address is copied into this structure.
Mika Karjalainen 4:c449bead5cf3 440 * \param buffer is a pointer to an array to where the read data is written to.
Mika Karjalainen 4:c449bead5cf3 441 * \param length is the maximum length of the allocated buffer.
Mika Karjalainen 4:c449bead5cf3 442 *
Mika Karjalainen 4:c449bead5cf3 443 * \return 0 if no data is read.
Mika Karjalainen 4:c449bead5cf3 444 * \return greater than 0, indicating the length of the data copied to buffer.
Mika Karjalainen 4:c449bead5cf3 445 *
Mika Karjalainen 4:c449bead5cf3 446 */
Mika Karjalainen 4:c449bead5cf3 447 extern int16_t socket_read(int8_t socket, ns_address_t *address, uint8_t *buffer, uint16_t length);
Mika Karjalainen 4:c449bead5cf3 448
Mika Karjalainen 4:c449bead5cf3 449 /**
Mika Karjalainen 4:c449bead5cf3 450 * \brief Used to send UDP, TCP or raw ICMP data via the socket.
Mika Karjalainen 4:c449bead5cf3 451 *
Mika Karjalainen 4:c449bead5cf3 452 * Used by the application to send data.
Mika Karjalainen 4:c449bead5cf3 453 *
Mika Karjalainen 4:c449bead5cf3 454 * \param socket refers to socket ID.
Mika Karjalainen 4:c449bead5cf3 455 * \param address is a pointer to the destination address information.
Mika Karjalainen 4:c449bead5cf3 456 * \param buffer is a pointer to a data to be sent.
Mika Karjalainen 4:c449bead5cf3 457 * \param length is a length of the data to be sent.
Mika Karjalainen 4:c449bead5cf3 458 * \return 0 on success.
Mika Karjalainen 4:c449bead5cf3 459 * \return -1 invalid socket id.
Mika Karjalainen 4:c449bead5cf3 460 * \return -2 Socket memory allocation fail.
Mika Karjalainen 4:c449bead5cf3 461 * \return -3 TCP state not established.
Mika Karjalainen 4:c449bead5cf3 462 * \return -4 Socket tx process busy.
Mika Karjalainen 4:c449bead5cf3 463 * \return -5 TLS authentication not ready.
Mika Karjalainen 4:c449bead5cf3 464 * \return -6 Packet too short.
Mika Karjalainen 4:c449bead5cf3 465 */
Mika Karjalainen 4:c449bead5cf3 466 extern int8_t socket_sendto(int8_t socket, ns_address_t *address, uint8_t *buffer, uint16_t length);
Mika Karjalainen 4:c449bead5cf3 467
Mika Karjalainen 4:c449bead5cf3 468 /**
Mika Karjalainen 4:c449bead5cf3 469 * \brief A function to read signal information and length info from a socket.
Mika Karjalainen 4:c449bead5cf3 470 *
Mika Karjalainen 4:c449bead5cf3 471 * Used by the application to read signal info.
Mika Karjalainen 4:c449bead5cf3 472 *
Mika Karjalainen 4:c449bead5cf3 473 * \param socket socket id
Mika Karjalainen 4:c449bead5cf3 474 * \param info pointer to response data
Mika Karjalainen 4:c449bead5cf3 475 *
Mika Karjalainen 4:c449bead5cf3 476 * \return eOK done
Mika Karjalainen 4:c449bead5cf3 477 * \return eFALSE invalid socket id
Mika Karjalainen 4:c449bead5cf3 478 */
Mika Karjalainen 4:c449bead5cf3 479 //extern int8_t socket_read_info(int8_t socket, rf_info_t *info);
Mika Karjalainen 4:c449bead5cf3 480 /**
Mika Karjalainen 4:c449bead5cf3 481 * \brief A function to read a session info for TCP event.
Mika Karjalainen 4:c449bead5cf3 482 *
Mika Karjalainen 4:c449bead5cf3 483 *
Mika Karjalainen 4:c449bead5cf3 484 * \param socket refers to the ID to be read from.
Mika Karjalainen 4:c449bead5cf3 485 * \param address is a pointer to the address structure to where the session address information is read to.
Mika Karjalainen 4:c449bead5cf3 486 *
Mika Karjalainen 4:c449bead5cf3 487 * \return 0 on success.
Mika Karjalainen 4:c449bead5cf3 488 * \return -1 if no socket is found or TCP is not compiled into this project.
Mika Karjalainen 4:c449bead5cf3 489 * \return -2 if no session information is found.
Mika Karjalainen 4:c449bead5cf3 490 *
Mika Karjalainen 4:c449bead5cf3 491 * 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 492 * The following sections introduce those functions.
Mika Karjalainen 4:c449bead5cf3 493 */
Mika Karjalainen 4:c449bead5cf3 494 extern int8_t socket_read_session_address(int8_t socket, ns_address_t *address);
Mika Karjalainen 4:c449bead5cf3 495
Mika Karjalainen 4:c449bead5cf3 496 /** Protocol levels used for socket_setsockopt */
Mika Karjalainen 4:c449bead5cf3 497 #define SOCKET_IPPROTO_IPV6 41
Mika Karjalainen 4:c449bead5cf3 498
Mika Karjalainen 4:c449bead5cf3 499 /** Option names for protocol level SOCKET_IPPROTO_IPV6 */
Mika Karjalainen 4:c449bead5cf3 500 /** 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 501 #define SOCKET_IPV6_TCLASS 1
Mika Karjalainen 4:c449bead5cf3 502
Mika Karjalainen 4:c449bead5cf3 503 /**
Mika Karjalainen 4:c449bead5cf3 504 * \brief Set an option for a socket
Mika Karjalainen 4:c449bead5cf3 505 *
Mika Karjalainen 4:c449bead5cf3 506 * Used to specify miscellaneous options for a socket. Supported levels and
Mika Karjalainen 4:c449bead5cf3 507 * names defined above.
Mika Karjalainen 4:c449bead5cf3 508 *
Mika Karjalainen 4:c449bead5cf3 509 * \param socket socket id
Mika Karjalainen 4:c449bead5cf3 510 * \param level protocol level
Mika Karjalainen 4:c449bead5cf3 511 * \param opt_name option name (interpretation depends on level)
Mika Karjalainen 4:c449bead5cf3 512 * \param opt_value pointer to value for the specified option
Mika Karjalainen 4:c449bead5cf3 513 * \param opt_len size of the data pointed to by value
Mika Karjalainen 4:c449bead5cf3 514 *
Mika Karjalainen 4:c449bead5cf3 515 * \return 0 on success
Mika Karjalainen 4:c449bead5cf3 516 * \return -1 invalid socket id
Mika Karjalainen 4:c449bead5cf3 517 * \return -2 invalid/unsupported option
Mika Karjalainen 4:c449bead5cf3 518 * \return -3 invalid option value
Mika Karjalainen 4:c449bead5cf3 519 */
Mika Karjalainen 4:c449bead5cf3 520 extern int8_t socket_setsockopt(int8_t socket, uint8_t level, uint8_t opt_name, const void *opt_value, uint16_t opt_len);
Mika Karjalainen 4:c449bead5cf3 521
Mika Karjalainen 4:c449bead5cf3 522 #endif /*_NS_SOCKET_H*/