Changes in / [a7a85d16:ef689ef0] in mainline
- Location:
- uspace
- Files:
-
- 8 added
- 8 deleted
- 41 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/include/net/icmp_api.h
ra7a85d16 ref689ef0 44 44 45 45 #include <adt/measured_strings.h> 46 #include <net/packet.h> 46 47 #include <net/ip_codes.h> 47 48 #include <net/icmp_codes.h> -
uspace/lib/net/adt/module_map.c
ra7a85d16 ref689ef0 27 27 */ 28 28 29 /** @addtogroup libnet30 * @{29 /** @addtogroup net 30 * @{ 31 31 */ 32 32 33 33 /** @file 34 * Character string to module map implementation.34 * Character string to module map implementation. 35 35 */ 36 36 … … 49 49 GENERIC_CHAR_MAP_IMPLEMENT(modules, module_t) 50 50 51 /** Adds module to the module map. 52 * 53 * @param[out] module The module structure added. 54 * @param[in] modules The module map. 55 * @param[in] name The module name. 56 * @param[in] filename The full path filename. 57 * @param[in] service The module service. 58 * @param[in] task_id The module current task identifier. Zero means not 59 * running. 60 * @param[in] connect_module The module connecting function. 61 * @returns EOK on success. 62 * @returns ENOMEM if there is not enough memory left. 63 */ 64 int 65 add_module(module_ref *module, modules_ref modules, const char *name, 66 const char *filename, services_t service, task_id_t task_id, 67 connect_module_t connect_module) 68 { 51 int add_module(module_ref * module, modules_ref modules, const char * name, const char * filename, services_t service, task_id_t task_id, connect_module_t connect_module){ 69 52 ERROR_DECLARE; 70 53 … … 72 55 73 56 tmp_module = (module_ref) malloc(sizeof(module_t)); 74 if (!tmp_module)57 if(! tmp_module){ 75 58 return ENOMEM; 76 59 } 77 60 tmp_module->task_id = task_id; 78 61 tmp_module->phone = 0; … … 82 65 tmp_module->service = service; 83 66 tmp_module->connect_module = connect_module; 84 85 if (ERROR_OCCURRED(modules_add(modules, tmp_module->name, 0, 86 tmp_module))) { 67 if(ERROR_OCCURRED(modules_add(modules, tmp_module->name, 0, tmp_module))){ 87 68 free(tmp_module); 88 69 return ERROR_CODE; 89 70 } 90 if (module)71 if(module){ 91 72 *module = tmp_module; 92 73 } 93 74 return EOK; 94 75 } 95 76 96 /** Searches and returns the specified module. 97 * 98 * If the module is not running, the module filaname is spawned. 99 * If the module is not connected, the connect_function is called. 100 * 101 * @param[in] modules The module map. 102 * @param[in] name The module name. 103 * @returns The running module found. It does not have to be 104 * connected. 105 * @returns NULL if there is no such module. 106 */ 107 module_ref get_running_module(modules_ref modules, char *name) 108 { 77 module_ref get_running_module(modules_ref modules, char * name){ 109 78 module_ref module; 110 79 111 80 module = modules_find(modules, name, 0); 112 if (!module)81 if(! module){ 113 82 return NULL; 114 115 if (!module->task_id){83 } 84 if(! module->task_id){ 116 85 module->task_id = spawn(module->filename); 117 if (!module->task_id)86 if(! module->task_id){ 118 87 return NULL; 88 } 119 89 } 120 if (!module->phone)90 if(! module->phone){ 121 91 module->phone = module->connect_module(module->service); 122 92 } 123 93 return module; 124 94 } 125 95 126 /** Starts the given module.127 *128 * @param[in] fname The module full or relative path filename.129 * @returns The new module task identifier on success.130 * @returns Zero if there is no such module.131 */132 96 task_id_t spawn(const char *fname) 133 97 { -
uspace/lib/net/generic/generic.c
ra7a85d16 ref689ef0 27 27 */ 28 28 29 /** @addtogroup libnet29 /** @addtogroup net 30 30 * @{ 31 31 */ -
uspace/lib/net/generic/net_checksum.c
ra7a85d16 ref689ef0 27 27 */ 28 28 29 /** @addtogroup libnet30 * @{29 /** @addtogroup net 30 * @{ 31 31 */ 32 32 33 33 /** @file 34 * General CRC and checksum computation implementation.34 * General CRC and checksum computation implementation. 35 35 */ 36 36 … … 39 39 #include <net_checksum.h> 40 40 41 /** Big-endian encoding CRC divider. */ 42 #define CRC_DIVIDER_BE 0x04c11db7 41 /** Big-endian encoding CRC divider. 42 */ 43 #define CRC_DIVIDER_BE 0x04C11DB7 43 44 44 /** Little-endian encoding CRC divider. */ 45 #define CRC_DIVIDER_LE 0xedb88320 45 /** Little-endian encoding CRC divider. 46 */ 47 #define CRC_DIVIDER_LE 0xEDB88320 46 48 47 /** Compacts the computed checksum to the 16 bit number adding the carries. 48 * 49 * @param[in] sum Computed checksum. 50 * @returns Compacted computed checksum to the 16 bits. 51 */ 52 uint16_t compact_checksum(uint32_t sum) 53 { 49 uint16_t compact_checksum(uint32_t sum){ 54 50 // shorten to the 16 bits 55 while (sum >> 16) 56 sum = (sum & 0xffff) + (sum >> 16); 51 while(sum >> 16){ 52 sum = (sum &0xFFFF) + (sum >> 16); 53 } 57 54 58 55 return (uint16_t) sum; 59 56 } 60 57 61 /** Computes sum of the 2 byte fields. 62 * 63 * Padds one zero (0) byte if odd. 64 * 65 * @param[in] seed Initial value. Often used as 0 or ~0. 66 * @param[in] data Pointer to the beginning of data to process. 67 * @param[in] length Length of the data in bytes. 68 * @returns The computed checksum of the length bytes of the data. 69 */ 70 uint32_t compute_checksum(uint32_t seed, uint8_t *data, size_t length) 71 { 58 uint32_t compute_checksum(uint32_t seed, uint8_t * data, size_t length){ 72 59 size_t index; 73 60 74 61 // sum all the 16 bit fields 75 for (index = 0; index + 1 < length; index += 2)62 for(index = 0; index + 1 < length; index += 2){ 76 63 seed += (data[index] << 8) + data[index + 1]; 64 } 77 65 78 66 // last odd byte with zero padding 79 if (index + 1 == length)67 if(index + 1 == length){ 80 68 seed += data[index] << 8; 69 } 81 70 82 71 return seed; 83 72 } 84 73 85 /** Computes CRC32 value in the big-endian environment. 86 * 87 * @param[in] seed Initial value. Often used as 0 or ~0. 88 * @param[in] data Pointer to the beginning of data to process. 89 * @param[in] length Length of the data in bits. 90 * @returns The computed CRC32 of the length bits of the data. 91 */ 92 uint32_t compute_crc32_be(uint32_t seed, uint8_t * data, size_t length) 93 { 74 uint32_t compute_crc32_be(uint32_t seed, uint8_t * data, size_t length){ 94 75 size_t index; 95 76 96 77 // process full bytes 97 while (length >= 8){78 while(length >= 8){ 98 79 // add the data 99 80 seed ^= (*data) << 24; 100 101 81 // for each added bit 102 for (index = 0; index < 8; ++index){82 for(index = 0; index < 8; ++ index){ 103 83 // if the first bit is set 104 if (seed & 0x80000000){84 if(seed &0x80000000){ 105 85 // shift and divide the checksum 106 86 seed = (seed << 1) ^ ((uint32_t) CRC_DIVIDER_BE); 107 } else{87 }else{ 108 88 // shift otherwise 109 89 seed <<= 1; 110 90 } 111 91 } 112 113 92 // move to the next byte 114 ++ data;93 ++ data; 115 94 length -= 8; 116 95 } 117 96 118 97 // process the odd bits 119 if (length > 0){98 if(length > 0){ 120 99 // add the data with zero padding 121 seed ^= ((*data) & (0xff << (8 - length))) << 24; 122 100 seed ^= ((*data) &(0xFF << (8 - length))) << 24; 123 101 // for each added bit 124 for (index = 0; index < length; ++index){102 for(index = 0; index < length; ++ index){ 125 103 // if the first bit is set 126 if (seed & 0x80000000){104 if(seed &0x80000000){ 127 105 // shift and divide the checksum 128 106 seed = (seed << 1) ^ ((uint32_t) CRC_DIVIDER_BE); 129 } else{107 }else{ 130 108 // shift otherwise 131 109 seed <<= 1; … … 137 115 } 138 116 139 /** Computes CRC32 value in the little-endian environment. 140 * 141 * @param[in] seed Initial value. Often used as 0 or ~0. 142 * @param[in] data Pointer to the beginning of data to process. 143 * @param[in] length Length of the data in bits. 144 * @returns The computed CRC32 of the length bits of the data. 145 */ 146 uint32_t compute_crc32_le(uint32_t seed, uint8_t * data, size_t length) 147 { 117 uint32_t compute_crc32_le(uint32_t seed, uint8_t * data, size_t length){ 148 118 size_t index; 149 119 150 120 // process full bytes 151 while (length >= 8){121 while(length >= 8){ 152 122 // add the data 153 123 seed ^= (*data); 154 155 124 // for each added bit 156 for (index = 0; index < 8; ++index){125 for(index = 0; index < 8; ++ index){ 157 126 // if the last bit is set 158 if (seed & 1){127 if(seed &1){ 159 128 // shift and divide the checksum 160 129 seed = (seed >> 1) ^ ((uint32_t) CRC_DIVIDER_LE); 161 } else{130 }else{ 162 131 // shift otherwise 163 132 seed >>= 1; 164 133 } 165 134 } 166 167 135 // move to the next byte 168 ++ data;136 ++ data; 169 137 length -= 8; 170 138 } 171 139 172 140 // process the odd bits 173 if (length > 0){141 if(length > 0){ 174 142 // add the data with zero padding 175 143 seed ^= (*data) >> (8 - length); 176 177 for (index = 0; index < length; ++index) { 144 for(index = 0; index < length; ++ index){ 178 145 // if the last bit is set 179 if (seed & 1){146 if(seed &1){ 180 147 // shift and divide the checksum 181 148 seed = (seed >> 1) ^ ((uint32_t) CRC_DIVIDER_LE); 182 } else{149 }else{ 183 150 // shift otherwise 184 151 seed >>= 1; … … 190 157 } 191 158 192 /** Returns or flips the checksum if zero. 193 * 194 * @param[in] checksum The computed checksum. 195 * @returns The internet protocol header checksum. 196 * @returns 0xFFFF if the computed checksum is zero. 197 */ 198 uint16_t flip_checksum(uint16_t checksum) 199 { 159 uint16_t flip_checksum(uint16_t checksum){ 200 160 // flip, zero is returned as 0xFFFF (not flipped) 201 checksum = ~ checksum;161 checksum = ~ checksum; 202 162 return checksum ? checksum : IP_CHECKSUM_ZERO; 203 163 } 204 164 205 /** Computes the ip header checksum. 206 * 207 * To compute the checksum of a new packet, the checksum header field must be 208 * zero. To check the checksum of a received packet, the checksum may be left 209 * set. Zero will be returned in this case if valid. 210 * 211 * @param[in] data The header data. 212 * @param[in] length The header length in bytes. 213 * @returns The internet protocol header checksum. 214 * @returns 0xFFFF if the computed checksum is zero. 215 */ 216 uint16_t ip_checksum(uint8_t *data, size_t length) 217 { 165 uint16_t ip_checksum(uint8_t * data, size_t length){ 218 166 // compute, compact and flip the data checksum 219 return flip_checksum(compact_checksum(compute_checksum(0, data, 220 length))); 167 return flip_checksum(compact_checksum(compute_checksum(0, data, length))); 221 168 } 222 169 -
uspace/lib/net/generic/net_remote.c
ra7a85d16 ref689ef0 27 27 */ 28 28 29 /** @addtogroup libnet30 * @{29 /** @addtogroup net 30 * @{ 31 31 */ 32 32 33 33 /** @file 34 * Networking interface implementation for remote modules.35 * @see net_interface.h34 * Networking interface implementation for remote modules. 35 * @see net_interface.h 36 36 */ 37 37 38 38 #include <ipc/services.h> 39 #include <ipc/net_net.h>40 39 41 40 #include <malloc.h> … … 46 45 #include <net_interface.h> 47 46 #include <adt/measured_strings.h> 47 #include <net_net_messages.h> 48 48 49 /** Connects to the networking module. 50 * 51 * @returns The networking module phone on success. 52 */ 53 int net_connect_module(void) 49 int net_connect_module(services_t service) 54 50 { 55 51 return connect_to_service(SERVICE_NETWORKING); 56 52 } 57 53 58 /** Frees the received settings. 59 * 60 * @param[in] settings The received settings. 61 * @param[in] data The received settings data. 62 * @see net_get_device_conf_req() 63 * @see net_get_conf_req() 64 */ 65 void net_free_settings(measured_string_ref settings, char *data) 54 void net_free_settings(measured_string_ref settings, char * data) 66 55 { 67 56 if (settings) 68 57 free(settings); 58 69 59 if (data) 70 60 free(data); 71 61 } 72 62 73 /** Returns the global configuration.74 *75 * The configuration names are read and the appropriate settings are set76 * instead. Call net_free_settings() function to release the returned77 * configuration.78 *79 * @param[in] net_phone The networking module phone.80 * @param[in,out] configuration The requested configuration. The names are read81 * and the appropriate settings are set instead.82 *83 * @param[in] count The configuration entries count.84 * @param[in,out] data The configuration and settings data.85 * @returns EOK on success.86 * @returns EINVAL if the configuration is NULL.87 * @returns EINVAL if the count is zero.88 * @returns Other error codes as defined for the89 * generic_translate_req() function.90 */91 63 int 92 net_get_conf_req(int net_phone, measured_string_ref * configuration,93 size_t count, char ** data)64 net_get_conf_req(int net_phone, measured_string_ref * configuration, 65 size_t count, char ** data) 94 66 { 95 67 return generic_translate_req(net_phone, NET_NET_GET_DEVICE_CONF, 0, 0, … … 97 69 } 98 70 99 /** Returns the device specific configuration.100 *101 * Returns the global configuration if the device specific is not found.102 * The configuration names are read and the appropriate settings are set103 * instead. Call net_free_settings() function to release the returned104 * configuration.105 *106 * @param[in] net_phone The networking module phone.107 * @param[in] device_id The device identifier.108 * @param[in,out] configuration The requested device configuration. The names109 * are read and the appropriate settings are set instead.110 * @param[in] count The configuration entries count.111 * @param[in,out] data The configuration and settings data.112 * @returns EOK on success.113 * @returns EINVAL if the configuration is NULL.114 * @returns EINVAL if the count is zero.115 * @returns Other error codes as defined for the116 * generic_translate_req() function.117 */118 71 int 119 72 net_get_device_conf_req(int net_phone, device_id_t device_id, 120 measured_string_ref * configuration, size_t count, char **data)73 measured_string_ref * configuration, size_t count, char ** data) 121 74 { 122 75 return generic_translate_req(net_phone, NET_NET_GET_DEVICE_CONF, -
uspace/lib/net/generic/packet_client.c
ra7a85d16 ref689ef0 27 27 */ 28 28 29 /** @addtogroup libnet30 * @{29 /** @addtogroup packet 30 * @{ 31 31 */ 32 32 33 33 /** @file 34 * Packet client implementation.34 * Packet client implementation. 35 35 */ 36 36 … … 38 38 #include <mem.h> 39 39 #include <unistd.h> 40 40 41 #include <sys/mman.h> 41 42 42 43 #include <packet_client.h> 43 #include <packet_remote.h>44 44 45 45 #include <net/packet.h> 46 46 #include <net/packet_header.h> 47 47 48 /** Copies the specified data to the beginning of the actual packet content. 49 * 50 * Pushes the content end if needed. 51 * 52 * @param[in] packet The packet to be filled. 53 * @param[in] data The data to be copied. 54 * @param[in] length The length of the copied data. 55 * @returns EOK on success. 56 * @returns EINVAL if the packet is not valid. 57 * @returns ENOMEM if there is not enough memory left. 58 */ 59 int packet_copy_data(packet_t packet, const void *data, size_t length) 48 int packet_copy_data(packet_t packet, const void * data, size_t length) 60 49 { 61 50 if (!packet_is_valid(packet)) … … 72 61 } 73 62 74 /** Allocates the specified space right before the actual packet content and75 * returns its pointer.76 *77 * @param[in] packet The packet to be used.78 * @param[in] length The space length to be allocated at the beginning of the79 * packet content.80 * @returns The pointer to the allocated memory.81 * @returns NULL if there is not enough memory left.82 */83 63 void *packet_prefix(packet_t packet, size_t length) 84 64 { … … 93 73 } 94 74 95 /** Allocates the specified space right after the actual packet content and96 * returns its pointer.97 *98 * @param[in] packet The packet to be used.99 * @param[in] length The space length to be allocated at the end of the100 * packet content.101 * @returns The pointer to the allocated memory.102 * @returns NULL if there is not enough memory left.103 */104 75 void *packet_suffix(packet_t packet, size_t length) 105 76 { … … 113 84 } 114 85 115 /** Trims the actual packet content by the specified prefix and suffix lengths.116 *117 * @param[in] packet The packet to be trimmed.118 * @param[in] prefix The prefix length to be removed from the beginning of119 * the packet content.120 * @param[in] suffix The suffix length to be removed from the end of the121 * packet content.122 * @returns EOK on success.123 * @returns EINVAL if the packet is not valid.124 * @returns ENOMEM if there is not enough memory left.125 */126 86 int packet_trim(packet_t packet, size_t prefix, size_t suffix) 127 87 { … … 137 97 } 138 98 139 /** Returns the packet identifier.140 *141 * @param[in] packet The packet.142 * @returns The packet identifier.143 * @returns Zero if the packet is not valid.144 */145 99 packet_id_t packet_get_id(const packet_t packet) 146 100 { … … 148 102 } 149 103 150 /** Returns the stored packet addresses and their length. 151 * 152 * @param[in] packet The packet. 153 * @param[out] src The source address. May be NULL if not desired. 154 * @param[out] dest The destination address. May be NULL if not desired. 155 * @returns The stored addresses length. 156 * @returns Zero if the addresses are not present. 157 * @returns EINVAL if the packet is not valid. 158 */ 159 int packet_get_addr(const packet_t packet, uint8_t **src, uint8_t **dest) 104 int packet_get_addr(const packet_t packet, uint8_t ** src, uint8_t ** dest) 160 105 { 161 106 if (!packet_is_valid(packet)) … … 171 116 } 172 117 173 /** Returns the packet content length.174 *175 * @param[in] packet The packet.176 * @returns The packet content length in bytes.177 * @returns Zero if the packet is not valid.178 */179 118 size_t packet_get_data_length(const packet_t packet) 180 119 { … … 185 124 } 186 125 187 /** Returns the pointer to the beginning of the packet content.188 *189 * @param[in] packet The packet.190 * @returns The pointer to the beginning of the packet content.191 * @returns NULL if the packet is not valid.192 */193 126 void *packet_get_data(const packet_t packet) 194 127 { … … 199 132 } 200 133 201 /** Sets the packet addresses.202 *203 * @param[in] packet The packet.204 * @param[in] src The new source address. May be NULL.205 * @param[in] dest The new destination address. May be NULL.206 * @param[in] addr_len The addresses length.207 * @returns EOK on success.208 * @returns EINVAL if the packet is not valid.209 * @returns ENOMEM if there is not enough memory left.210 */211 134 int 212 packet_set_addr(packet_t packet, const uint8_t * src, const uint8_t *dest,135 packet_set_addr(packet_t packet, const uint8_t * src, const uint8_t * dest, 213 136 size_t addr_len) 214 137 { … … 247 170 } 248 171 249 /** Returns the packet copy.250 *251 * Copies the addresses, data, order and metric values.252 * Does not copy the queue placement.253 *254 * @param[in] phone The packet server module phone.255 * @param[in] packet The original packet.256 * @returns The packet copy.257 * @returns NULL on error.258 */259 172 packet_t packet_get_copy(int phone, packet_t packet) 260 173 { -
uspace/lib/net/generic/packet_remote.c
ra7a85d16 ref689ef0 27 27 */ 28 28 29 /** @addtogroup libnet30 * @{29 /** @addtogroup packet 30 * @{ 31 31 */ 32 32 33 33 /** @file 34 * Packet client interface implementation for remote modules.35 * @see packet_client.h34 * Packet client interface implementation for remote modules. 35 * @see packet_client.h 36 36 */ 37 37 … … 86 86 } 87 87 88 /** Translates the packet identifier to the packet reference.89 *90 * Tries to find mapping first.91 * Contacts the packet server to share the packet if the mapping is not present.92 *93 * @param[in] phone The packet server module phone.94 * @param[out] packet The packet reference.95 * @param[in] packet_id The packet identifier.96 * @returns EOK on success.97 * @returns EINVAL if the packet parameter is NULL.98 * @returns Other error codes as defined for the NET_PACKET_GET_SIZE99 * message.100 * @returns Other error codes as defined for the packet_return()101 * function.102 */103 88 int packet_translate_remote(int phone, packet_ref packet, packet_id_t packet_id) 104 89 { … … 125 110 } 126 111 127 /** Obtains the packet of the given dimensions.128 *129 * Contacts the packet server to return the appropriate packet.130 *131 * @param[in] phone The packet server module phone.132 * @param[in] addr_len The source and destination addresses maximal length in133 * bytes.134 * @param[in] max_prefix The maximal prefix length in bytes.135 * @param[in] max_content The maximal content length in bytes.136 * @param[in] max_suffix The maximal suffix length in bytes.137 * @returns The packet reference.138 * @returns NULL on error.139 */140 112 packet_t packet_get_4_remote(int phone, size_t max_content, size_t addr_len, 141 113 size_t max_prefix, size_t max_suffix) … … 161 133 } 162 134 163 /** Obtains the packet of the given content size.164 *165 * Contacts the packet server to return the appropriate packet.166 *167 * @param[in] phone The packet server module phone.168 * @param[in] content The maximal content length in bytes.169 * @returns The packet reference.170 * @returns NULL on error.171 */172 135 packet_t packet_get_1_remote(int phone, size_t content) 173 136 { … … 191 154 } 192 155 193 /** Releases the packet queue.194 *195 * All packets in the queue are marked as free for use.196 * The packet queue may be one packet only.197 * The module should not use the packets after this point until they are198 * received or obtained again.199 *200 * @param[in] phone The packet server module phone.201 * @param[in] packet_id The packet identifier.202 */203 156 void pq_release_remote(int phone, packet_id_t packet_id) 204 157 { -
uspace/lib/net/generic/socket_core.c
ra7a85d16 ref689ef0 27 27 */ 28 28 29 /** @addtogroup libnet30 * @{29 /** @addtogroup socket 30 * @{ 31 31 */ 32 32 33 33 /** @file 34 * Socket common core implementation. 35 */ 36 37 #include <socket_core.h> 38 #include <packet_client.h> 39 #include <packet_remote.h> 34 * Socket common core implementation. 35 */ 40 36 41 37 #include <net/socket_codes.h> 42 38 #include <net/in.h> 43 39 #include <net/inet.h> 44 #include <net/packet.h>45 #include <net/modules.h>46 40 47 41 #include <stdint.h> … … 52 46 #include <adt/dynamic_fifo.h> 53 47 #include <adt/int_map.h> 54 55 /** 56 * Maximum number of random attempts to find a new socket identifier before 57 * switching to the sequence. 58 */ 59 #define SOCKET_ID_TRIES 100 60 61 /** Bound port sockets.*/ 62 struct socket_port { 63 /** The bound sockets map. */ 48 #include <net/packet.h> 49 #include <packet_client.h> 50 #include <packet_remote.h> 51 #include <net/modules.h> 52 #include <socket_core.h> 53 54 /** Maximum number of random attempts to find a new socket identifier before switching to the sequence. 55 */ 56 #define SOCKET_ID_TRIES 100 57 58 /** Bound port sockets. 59 */ 60 struct socket_port{ 61 /** The bound sockets map. 62 */ 64 63 socket_port_map_t map; 65 /** The bound sockets count. */ 64 /** The bound sockets count. 65 */ 66 66 int count; 67 67 }; … … 74 74 75 75 /** Destroys the socket. 76 * 77 * If the socket is bound, the port is released. 78 * Releases all buffered packets, calls the release function and removes the 79 * socket from the local sockets. 80 * 81 * @param[in] packet_phone The packet server phone to release buffered packets. 82 * @param[in] socket The socket to be destroyed. 83 * @param[in,out] local_sockets The local sockets to be updated. 84 * @param[in,out] global_sockets The global sockets to be updated. 85 * @param[in] socket_release The client release callback function. 86 */ 87 static void 88 socket_destroy_core(int packet_phone, socket_core_ref socket, 89 socket_cores_ref local_sockets, socket_ports_ref global_sockets, 90 void (* socket_release)(socket_core_ref socket)) 91 { 76 * If the socket is bound, the port is released. 77 * Releases all buffered packets, calls the release function and removes the socket from the local sockets. 78 * @param[in] packet_phone The packet server phone to release buffered packets. 79 * @param[in] socket The socket to be destroyed. 80 * @param[in,out] local_sockets The local sockets to be updated. 81 * @param[in,out] global_sockets The global sockets to be updated. 82 * @param[in] socket_release The client release callback function. 83 */ 84 static void socket_destroy_core(int packet_phone, socket_core_ref socket, socket_cores_ref local_sockets, socket_ports_ref global_sockets, void (*socket_release)(socket_core_ref socket)){ 92 85 int packet_id; 93 86 94 87 // if bound 95 if (socket->port){88 if(socket->port){ 96 89 // release the port 97 90 socket_port_release(global_sockets, socket); 98 91 } 99 100 92 // release all received packets 101 while ((packet_id = dyn_fifo_pop(&socket->received)) >= 0)93 while((packet_id = dyn_fifo_pop(&socket->received)) >= 0){ 102 94 pq_release_remote(packet_phone, packet_id); 103 95 } 104 96 dyn_fifo_destroy(&socket->received); 105 97 dyn_fifo_destroy(&socket->accepted); 106 107 if (socket_release) 98 if(socket_release){ 108 99 socket_release(socket); 109 100 } 110 101 socket_cores_exclude(local_sockets, socket->socket_id); 111 102 } 112 103 113 /** Destroys local sockets. 114 * 115 * Releases all buffered packets and calls the release function for each of the 116 * sockets. 117 * 118 * @param[in] packet_phone The packet server phone to release buffered packets. 119 * @param[in] local_sockets The local sockets to be destroyed. 120 * @param[in,out] global_sockets The global sockets to be updated. 121 * @param[in] socket_release The client release callback function. 122 */ 123 void 124 socket_cores_release(int packet_phone, socket_cores_ref local_sockets, 125 socket_ports_ref global_sockets, 126 void (* socket_release)(socket_core_ref socket)) 127 { 128 int index; 129 130 if (!socket_cores_is_valid(local_sockets)) 131 return; 132 133 local_sockets->magic = 0; 134 135 for (index = 0; index < local_sockets->next; ++index) { 136 if (socket_cores_item_is_valid(&local_sockets->items[index])) { 137 local_sockets->items[index].magic = 0; 138 139 if (local_sockets->items[index].value) { 140 socket_destroy_core(packet_phone, 141 local_sockets->items[index].value, 142 local_sockets, global_sockets, 143 socket_release); 144 free(local_sockets->items[index].value); 145 local_sockets->items[index].value = NULL; 146 } 147 } 148 } 149 150 free(local_sockets->items); 104 void socket_cores_release(int packet_phone, socket_cores_ref local_sockets, socket_ports_ref global_sockets, void (*socket_release)(socket_core_ref socket)){ 105 if(socket_cores_is_valid(local_sockets)){ 106 int index; 107 108 local_sockets->magic = 0; 109 for(index = 0; index < local_sockets->next; ++ index){ 110 if(socket_cores_item_is_valid(&(local_sockets->items[index]))){ 111 local_sockets->items[index].magic = 0; 112 if(local_sockets->items[index].value){ 113 socket_destroy_core(packet_phone, local_sockets->items[index].value, local_sockets, global_sockets, socket_release); 114 free(local_sockets->items[index].value); 115 local_sockets->items[index].value = NULL; 116 } 117 } 118 } 119 free(local_sockets->items); 120 } 151 121 } 152 122 153 123 /** Adds the socket to a socket port. 154 * 155 * @param[in,out] socket_port The socket port structure. 156 * @param[in] socket The socket to be added. 157 * @param[in] key The socket key identifier. 158 * @param[in] key_length The socket key length. 159 * @returns EOK on success. 160 * @returns ENOMEM if there is not enough memory left. 161 */ 162 static int 163 socket_port_add_core(socket_port_ref socket_port, socket_core_ref socket, 164 const char *key, size_t key_length) 165 { 124 * @param[in,out] socket_port The socket port structure. 125 * @param[in] socket The socket to be added. 126 * @param[in] key The socket key identifier. 127 * @param[in] key_length The socket key length. 128 * @returns EOK on success. 129 * @returns ENOMEM if there is not enough memory left. 130 */ 131 static int socket_port_add_core(socket_port_ref socket_port, socket_core_ref socket, const char * key, size_t key_length){ 166 132 ERROR_DECLARE; 167 133 168 socket_core_ref * socket_ref;134 socket_core_ref * socket_ref; 169 135 170 136 // create a wrapper 171 137 socket_ref = malloc(sizeof(*socket_ref)); 172 if (!socket_ref)138 if(! socket_ref){ 173 139 return ENOMEM; 174 140 } 175 141 *socket_ref = socket; 176 142 // add the wrapper 177 if (ERROR_OCCURRED(socket_port_map_add(&socket_port->map, key, 178 key_length, socket_ref))) { 143 if(ERROR_OCCURRED(socket_port_map_add(&socket_port->map, key, key_length, socket_ref))){ 179 144 free(socket_ref); 180 145 return ERROR_CODE; 181 146 } 182 183 ++socket_port->count; 147 ++ socket_port->count; 184 148 socket->key = key; 185 149 socket->key_length = key_length; 186 187 150 return EOK; 188 151 } 189 152 190 153 /** Binds the socket to the port. 191 * 192 * The SOCKET_MAP_KEY_LISTENING key identifier is used. 193 * 194 * @param[in] global_sockets The global sockets to be updated. 195 * @param[in] socket The socket to be added. 196 * @param[in] port The port number to be bound to. 197 * @returns EOK on success. 198 * @returns ENOMEM if there is not enough memory left. 199 * @returns Other error codes as defined for the 200 * socket_ports_add() function. 201 */ 202 static int 203 socket_bind_insert(socket_ports_ref global_sockets, socket_core_ref socket, 204 int port) 205 { 154 * The SOCKET_MAP_KEY_LISTENING key identifier is used. 155 * @param[in] global_sockets The global sockets to be updated. 156 * @param[in] socket The socket to be added. 157 * @param[in] port The port number to be bound to. 158 * @returns EOK on success. 159 * @returns ENOMEM if there is not enough memory left. 160 * @returns Other error codes as defined for the socket_ports_add() function. 161 */ 162 static int socket_bind_insert(socket_ports_ref global_sockets, socket_core_ref socket, int port){ 206 163 ERROR_DECLARE; 207 164 … … 210 167 // create a wrapper 211 168 socket_port = malloc(sizeof(*socket_port)); 212 if (!socket_port)169 if(! socket_port){ 213 170 return ENOMEM; 214 171 } 215 172 socket_port->count = 0; 216 if (ERROR_OCCURRED(socket_port_map_initialize(&socket_port->map)) || 217 ERROR_OCCURRED(socket_port_add_core(socket_port, socket, 218 SOCKET_MAP_KEY_LISTENING, 0))) { 173 if(ERROR_OCCURRED(socket_port_map_initialize(&socket_port->map)) 174 || ERROR_OCCURRED(socket_port_add_core(socket_port, socket, SOCKET_MAP_KEY_LISTENING, 0))){ 219 175 socket_port_map_destroy(&socket_port->map); 220 176 free(socket_port); 221 177 return ERROR_CODE; 222 178 } 223 224 179 // register the incomming port 225 180 ERROR_CODE = socket_ports_add(global_sockets, port, socket_port); 226 if (ERROR_CODE < 0){181 if(ERROR_CODE < 0){ 227 182 socket_port_map_destroy(&socket_port->map); 228 183 free(socket_port); 229 184 return ERROR_CODE; 230 185 } 231 232 186 socket->port = port; 233 187 return EOK; 234 188 } 235 189 236 /** Binds the socket to the port. 237 * 238 * The address port is used if set, a free port is used if not. 239 * 240 * @param[in] local_sockets The local sockets to be searched. 241 * @param[in,out] global_sockets The global sockets to be updated. 242 * @param[in] socket_id The new socket identifier. 243 * @param[in] addr The address to be bound to. 244 * @param[in] addrlen The address length. 245 * @param[in] free_ports_start The minimum free port. 246 * @param[in] free_ports_end The maximum free port. 247 * @param[in] last_used_port The last used free port. 248 * @returns EOK on success. 249 * @returns ENOTSOCK if the socket was not found. 250 * @returns EAFNOSUPPORT if the address family is not supported. 251 * @returns EADDRINUSE if the port is already in use. 252 * @returns Other error codes as defined for the 253 * socket_bind_free_port() function. 254 * @returns Other error codes as defined for the 255 * socket_bind_insert() function. 256 */ 257 int 258 socket_bind(socket_cores_ref local_sockets, socket_ports_ref global_sockets, 259 int socket_id, void *addr, size_t addrlen, int free_ports_start, 260 int free_ports_end, int last_used_port) 261 { 190 int socket_bind(socket_cores_ref local_sockets, socket_ports_ref global_sockets, int socket_id, void * addr, size_t addrlen, int free_ports_start, int free_ports_end, int last_used_port){ 262 191 socket_core_ref socket; 263 192 socket_port_ref socket_port; 264 struct sockaddr * address;265 struct sockaddr_in * address_in;266 267 if (addrlen < sizeof(struct sockaddr))193 struct sockaddr * address; 194 struct sockaddr_in * address_in; 195 196 if(addrlen < sizeof(struct sockaddr)){ 268 197 return EINVAL; 269 198 } 270 199 address = (struct sockaddr *) addr; 271 switch (address->sa_family) { 272 case AF_INET: 273 if (addrlen != sizeof(struct sockaddr_in)) 274 return EINVAL; 275 276 address_in = (struct sockaddr_in *) addr; 277 // find the socket 278 socket = socket_cores_find(local_sockets, socket_id); 279 if (!socket) 280 return ENOTSOCK; 281 282 // bind a free port? 283 if (address_in->sin_port <= 0) 284 return socket_bind_free_port(global_sockets, socket, 285 free_ports_start, free_ports_end, last_used_port); 286 287 // try to find the port 288 socket_port = socket_ports_find(global_sockets, 289 ntohs(address_in->sin_port)); 290 if (socket_port) { 291 // already used 292 return EADDRINUSE; 293 } 294 295 // if bound 296 if (socket->port) { 297 // release the port 298 socket_port_release(global_sockets, socket); 299 } 300 socket->port = -1; 301 302 return socket_bind_insert(global_sockets, socket, 303 ntohs(address_in->sin_port)); 304 305 case AF_INET6: 200 switch(address->sa_family){ 201 case AF_INET: 202 if(addrlen != sizeof(struct sockaddr_in)){ 203 return EINVAL; 204 } 205 address_in = (struct sockaddr_in *) addr; 206 // find the socket 207 socket = socket_cores_find(local_sockets, socket_id); 208 if(! socket){ 209 return ENOTSOCK; 210 } 211 // bind a free port? 212 if(address_in->sin_port <= 0){ 213 return socket_bind_free_port(global_sockets, socket, free_ports_start, free_ports_end, last_used_port); 214 } 215 // try to find the port 216 socket_port = socket_ports_find(global_sockets, ntohs(address_in->sin_port)); 217 if(socket_port){ 218 // already used 219 return EADDRINUSE; 220 } 221 // if bound 222 if(socket->port){ 223 // release the port 224 socket_port_release(global_sockets, socket); 225 } 226 socket->port = -1; 227 return socket_bind_insert(global_sockets, socket, ntohs(address_in->sin_port)); 228 break; 306 229 // TODO IPv6 307 break; 308 } 309 230 } 310 231 return EAFNOSUPPORT; 311 232 } 312 233 313 /** Binds the socket to a free port. 314 * 315 * The first free port is used. 316 * 317 * @param[in,out] global_sockets The global sockets to be updated. 318 * @param[in,out] socket The socket to be bound. 319 * @param[in] free_ports_start The minimum free port. 320 * @param[in] free_ports_end The maximum free port. 321 * @param[in] last_used_port The last used free port. 322 * @returns EOK on success. 323 * @returns ENOTCONN if no free port was found. 324 * @returns Other error codes as defined for the 325 * socket_bind_insert() function. 326 */ 327 int 328 socket_bind_free_port(socket_ports_ref global_sockets, socket_core_ref socket, 329 int free_ports_start, int free_ports_end, int last_used_port) 330 { 234 int socket_bind_free_port(socket_ports_ref global_sockets, socket_core_ref socket, int free_ports_start, int free_ports_end, int last_used_port){ 331 235 int index; 332 236 333 237 // from the last used one 334 238 index = last_used_port; 335 336 do { 337 ++index; 338 239 do{ 240 ++ index; 339 241 // til the range end 340 if (index >= free_ports_end){242 if(index >= free_ports_end){ 341 243 // start from the range beginning 342 244 index = free_ports_start - 1; 343 do 344 ++ index;245 do{ 246 ++ index; 345 247 // til the last used one 346 if (index >= last_used_port){248 if(index >= last_used_port){ 347 249 // none found 348 250 return ENOTCONN; 349 251 } 350 } while (socket_ports_find(global_sockets, index)); 351 252 }while(socket_ports_find(global_sockets, index) != NULL); 352 253 // found, break immediately 353 254 break; 354 255 } 355 356 } while (socket_ports_find(global_sockets, index)); 357 256 }while(socket_ports_find(global_sockets, index) != NULL); 358 257 return socket_bind_insert(global_sockets, socket, index); 359 258 } 360 259 361 260 /** Tries to find a new free socket identifier. 362 * 363 * @param[in] local_sockets The local sockets to be searched. 364 * @param[in] positive A value indicating whether a positive identifier is 365 * requested. A negative identifier is requested if set to 366 * false. 367 * @returns The new socket identifier. 368 * @returns ELIMIT if there is no socket identifier available. 369 */ 370 static int socket_generate_new_id(socket_cores_ref local_sockets, int positive) 371 { 261 * @param[in] local_sockets The local sockets to be searched. 262 * @param[in] positive A value indicating whether a positive identifier is requested. A negative identifier is requested if set to false. 263 * @returns The new socket identifier. 264 * @returns ELIMIT if there is no socket identifier available. 265 */ 266 static int socket_generate_new_id(socket_cores_ref local_sockets, int positive){ 372 267 int socket_id; 373 268 int count; … … 375 270 count = 0; 376 271 // socket_id = socket_globals.last_id; 377 do 378 if (count < SOCKET_ID_TRIES){272 do{ 273 if(count < SOCKET_ID_TRIES){ 379 274 socket_id = rand() % INT_MAX; 380 ++ count;381 } else if (count == SOCKET_ID_TRIES){275 ++ count; 276 }else if(count == SOCKET_ID_TRIES){ 382 277 socket_id = 1; 383 ++ count;278 ++ count; 384 279 // only this branch for last_id 385 } else{386 if (socket_id < INT_MAX){280 }else{ 281 if(socket_id < INT_MAX){ 387 282 ++ socket_id; 388 /* } else if(socket_globals.last_id){283 /* }else if(socket_globals.last_id){ 389 284 * socket_globals.last_id = 0; 390 285 * socket_id = 1; 391 */ } else{286 */ }else{ 392 287 return ELIMIT; 393 288 } 394 289 } 395 } while (socket_cores_find(local_sockets, 396 ((positive ? 1 : -1) * socket_id))); 397 290 }while(socket_cores_find(local_sockets, ((positive ? 1 : -1) * socket_id))); 398 291 // last_id = socket_id 399 292 return socket_id; 400 293 } 401 294 402 /** Creates a new socket. 403 * 404 * @param[in,out] local_sockets The local sockets to be updated. 405 * @param[in] app_phone The application phone. 406 * @param[in] specific_data The socket specific data. 407 * @param[in,out] socket_id The new socket identifier. A new identifier is 408 * chosen if set to zero or negative. A negative identifier 409 * is chosen if set to negative. 410 * @returns EOK on success. 411 * @returns EINVAL if the socket_id parameter is NULL. 412 * @returns ENOMEM if there is not enough memory left. 413 */ 414 int 415 socket_create(socket_cores_ref local_sockets, int app_phone, 416 void *specific_data, int *socket_id) 417 { 295 int socket_create(socket_cores_ref local_sockets, int app_phone, void * specific_data, int * socket_id){ 418 296 ERROR_DECLARE; 419 297 … … 422 300 int positive; 423 301 424 if (!socket_id)302 if(! socket_id){ 425 303 return EINVAL; 426 304 } 427 305 // store the socket 428 if (*socket_id <= 0){306 if(*socket_id <= 0){ 429 307 positive = (*socket_id == 0); 430 308 *socket_id = socket_generate_new_id(local_sockets, positive); 431 if (*socket_id <= 0) 432 return *socket_id; 433 if (!positive) 309 if(*socket_id <= 0){ 310 return * socket_id; 311 } 312 if(! positive){ 434 313 *socket_id *= -1; 435 } else if(socket_cores_find(local_sockets, *socket_id)) { 314 } 315 }else if(socket_cores_find(local_sockets, * socket_id)){ 436 316 return EEXIST; 437 317 } 438 439 318 socket = (socket_core_ref) malloc(sizeof(*socket)); 440 if (!socket)319 if(! socket){ 441 320 return ENOMEM; 442 321 } 443 322 // initialize 444 323 socket->phone = app_phone; … … 447 326 socket->key_length = 0; 448 327 socket->specific_data = specific_data; 449 if (ERROR_OCCURRED(dyn_fifo_initialize(&socket->received, 450 SOCKET_INITIAL_RECEIVED_SIZE))) { 328 if(ERROR_OCCURRED(dyn_fifo_initialize(&socket->received, SOCKET_INITIAL_RECEIVED_SIZE))){ 451 329 free(socket); 452 330 return ERROR_CODE; 453 331 } 454 if (ERROR_OCCURRED(dyn_fifo_initialize(&socket->accepted, 455 SOCKET_INITIAL_ACCEPTED_SIZE))) { 332 if(ERROR_OCCURRED(dyn_fifo_initialize(&socket->accepted, SOCKET_INITIAL_ACCEPTED_SIZE))){ 456 333 dyn_fifo_destroy(&socket->received); 457 334 free(socket); 458 335 return ERROR_CODE; 459 336 } 460 socket->socket_id = * socket_id;337 socket->socket_id = * socket_id; 461 338 res = socket_cores_add(local_sockets, socket->socket_id, socket); 462 if (res < 0){339 if(res < 0){ 463 340 dyn_fifo_destroy(&socket->received); 464 341 dyn_fifo_destroy(&socket->accepted); … … 466 343 return res; 467 344 } 468 469 return EOK; 470 } 471 472 /** Destroys the socket. 473 * 474 * If the socket is bound, the port is released. 475 * Releases all buffered packets, calls the release function and removes the 476 * socket from the local sockets. 477 * 478 * @param[in] packet_phone The packet server phone to release buffered packets. 479 * @param[in] socket_id The socket identifier. 480 * @param[in,out] local_sockets The local sockets to be updated. 481 * @param[in,out] global_sockets The global sockets to be updated. 482 * @param[in] socket_release The client release callback function. 483 * @returns EOK on success. 484 * @returns ENOTSOCK if the socket is not found. 485 */ 486 int 487 socket_destroy(int packet_phone, int socket_id, socket_cores_ref local_sockets, 488 socket_ports_ref global_sockets, 489 void (*socket_release)(socket_core_ref socket)) 490 { 345 return EOK; 346 } 347 348 int socket_destroy(int packet_phone, int socket_id, socket_cores_ref local_sockets, socket_ports_ref global_sockets, void (*socket_release)(socket_core_ref socket)){ 491 349 socket_core_ref socket; 492 350 int accepted_id; … … 494 352 // find the socket 495 353 socket = socket_cores_find(local_sockets, socket_id); 496 if (!socket)354 if(! socket){ 497 355 return ENOTSOCK; 498 356 } 499 357 // destroy all accepted sockets 500 while ((accepted_id = dyn_fifo_pop(&socket->accepted)) >= 0) 501 socket_destroy(packet_phone, accepted_id, local_sockets, 502 global_sockets, socket_release); 503 504 socket_destroy_core(packet_phone, socket, local_sockets, global_sockets, 505 socket_release); 506 507 return EOK; 508 } 509 510 /** Replies the packet or the packet queue data to the application via the 511 * socket. 512 * 513 * Uses the current message processing fibril. 514 * 515 * @param[in] packet The packet to be transfered. 516 * @param[out] length The total data length. 517 * @returns EOK on success. 518 * @returns EBADMEM if the length parameter is NULL. 519 * @returns ENOMEM if there is not enough memory left. 520 * @returns Other error codes as defined for the data_reply() 521 * function. 522 */ 523 int socket_reply_packets(packet_t packet, size_t *length) 524 { 358 while((accepted_id = dyn_fifo_pop(&socket->accepted)) >= 0){ 359 socket_destroy(packet_phone, accepted_id, local_sockets, global_sockets, socket_release); 360 } 361 socket_destroy_core(packet_phone, socket, local_sockets, global_sockets, socket_release); 362 return EOK; 363 } 364 365 int socket_reply_packets(packet_t packet, size_t * length){ 525 366 ERROR_DECLARE; 526 367 527 368 packet_t next_packet; 528 369 size_t fragments; 529 size_t * lengths;370 size_t * lengths; 530 371 size_t index; 531 372 532 if (!length)373 if(! length){ 533 374 return EBADMEM; 534 375 } 535 376 next_packet = pq_next(packet); 536 if (!next_packet){377 if(! next_packet){ 537 378 // write all if only one fragment 538 ERROR_PROPAGATE(data_reply(packet_get_data(packet), 539 packet_get_data_length(packet))); 379 ERROR_PROPAGATE(data_reply(packet_get_data(packet), packet_get_data_length(packet))); 540 380 // store the total length 541 381 *length = packet_get_data_length(packet); 542 } else{382 }else{ 543 383 // count the packet fragments 544 384 fragments = 1; 545 385 next_packet = pq_next(packet); 546 while ((next_packet = pq_next(next_packet)))547 ++ fragments;548 386 while((next_packet = pq_next(next_packet))){ 387 ++ fragments; 388 } 549 389 // compute and store the fragment lengths 550 lengths = (size_t *) malloc(sizeof(size_t) * fragments + 551 sizeof(size_t)); 552 if (!lengths) 390 lengths = (size_t *) malloc(sizeof(size_t) * fragments + sizeof(size_t)); 391 if(! lengths){ 553 392 return ENOMEM; 554 393 } 555 394 lengths[0] = packet_get_data_length(packet); 556 395 lengths[fragments] = lengths[0]; 557 396 next_packet = pq_next(packet); 558 559 for (index = 1; index < fragments; ++index) { 397 for(index = 1; index < fragments; ++ index){ 560 398 lengths[index] = packet_get_data_length(next_packet); 561 399 lengths[fragments] += lengths[index]; 562 400 next_packet = pq_next(packet); 563 } 564 401 }while(next_packet); 565 402 // write the fragment lengths 566 if (ERROR_OCCURRED(data_reply(lengths, 567 sizeof(int) * (fragments + 1)))) { 568 free(lengths); 569 return ERROR_CODE; 570 } 403 ERROR_PROPAGATE(data_reply(lengths, sizeof(int) * (fragments + 1))); 571 404 next_packet = packet; 572 573 405 // write the fragments 574 for (index = 0; index < fragments; ++index) { 575 ERROR_CODE = data_reply(packet_get_data(next_packet), 576 lengths[index]); 577 if (ERROR_OCCURRED(ERROR_CODE)) { 578 free(lengths); 579 return ERROR_CODE; 580 } 406 for(index = 0; index < fragments; ++ index){ 407 ERROR_PROPAGATE(data_reply(packet_get_data(next_packet), lengths[index])); 581 408 next_packet = pq_next(next_packet); 582 } 583 409 }while(next_packet); 584 410 // store the total length 585 411 *length = lengths[fragments]; 586 412 free(lengths); 587 413 } 588 589 return EOK; 590 } 591 592 /** Finds the bound port socket. 593 * 594 * @param[in] global_sockets The global sockets to be searched. 595 * @param[in] port The port number. 596 * @param[in] key The socket key identifier. 597 * @param[in] key_length The socket key length. 598 * @returns The found socket. 599 * @returns NULL if no socket was found. 600 */ 601 socket_core_ref 602 socket_port_find(socket_ports_ref global_sockets, int port, const char *key, 603 size_t key_length) 604 { 414 return EOK; 415 } 416 417 socket_core_ref socket_port_find(socket_ports_ref global_sockets, int port, const char * key, size_t key_length){ 605 418 socket_port_ref socket_port; 606 socket_core_ref * socket_ref;419 socket_core_ref * socket_ref; 607 420 608 421 socket_port = socket_ports_find(global_sockets, port); 609 if (socket_port && (socket_port->count > 0)) { 610 socket_ref = socket_port_map_find(&socket_port->map, key, 611 key_length); 612 if (socket_ref) 613 return *socket_ref; 614 } 615 422 if(socket_port && (socket_port->count > 0)){ 423 socket_ref = socket_port_map_find(&socket_port->map, key, key_length); 424 if(socket_ref){ 425 return * socket_ref; 426 } 427 } 616 428 return NULL; 617 429 } 618 430 619 /** Releases the socket port. 620 * 621 * If the socket is bound the port entry is released. 622 * If there are no more port entries the port is release. 623 * 624 * @param[in] global_sockets The global sockets to be updated. 625 * @param[in] socket The socket to be unbound. 626 */ 627 void 628 socket_port_release(socket_ports_ref global_sockets, socket_core_ref socket) 629 { 431 void socket_port_release(socket_ports_ref global_sockets, socket_core_ref socket){ 630 432 socket_port_ref socket_port; 631 socket_core_ref *socket_ref; 632 633 if (!socket->port) 634 return; 635 636 // find ports 637 socket_port = socket_ports_find(global_sockets, socket->port); 638 if (socket_port) { 639 // find the socket 640 socket_ref = socket_port_map_find(&socket_port->map, 641 socket->key, socket->key_length); 642 643 if (socket_ref) { 644 --socket_port->count; 645 646 // release if empty 647 if (socket_port->count <= 0) { 648 // destroy the map 649 socket_port_map_destroy(&socket_port->map); 650 // release the port 651 socket_ports_exclude(global_sockets, 652 socket->port); 653 } else { 654 // remove 655 socket_port_map_exclude(&socket_port->map, 656 socket->key, socket->key_length); 657 } 658 } 659 } 660 661 socket->port = 0; 662 socket->key = NULL; 663 socket->key_length = 0; 664 } 665 666 /** Adds the socket to an already bound port. 667 * 668 * @param[in] global_sockets The global sockets to be updated. 669 * @param[in] port The port number to be bound to. 670 * @param[in] socket The socket to be added. 671 * @param[in] key The socket key identifier. 672 * @param[in] key_length The socket key length. 673 * @returns EOK on success. 674 * @returns ENOENT if the port is not already used. 675 * @returns Other error codes as defined for the 676 * socket_port_add_core() function. 677 */ 678 int 679 socket_port_add(socket_ports_ref global_sockets, int port, 680 socket_core_ref socket, const char *key, size_t key_length) 681 { 433 socket_core_ref * socket_ref; 434 435 if(socket->port){ 436 // find ports 437 socket_port = socket_ports_find(global_sockets, socket->port); 438 if(socket_port){ 439 // find the socket 440 socket_ref = socket_port_map_find(&socket_port->map, socket->key, socket->key_length); 441 if(socket_ref){ 442 -- socket_port->count; 443 // release if empty 444 if(socket_port->count <= 0){ 445 // destroy the map 446 socket_port_map_destroy(&socket_port->map); 447 // release the port 448 socket_ports_exclude(global_sockets, socket->port); 449 }else{ 450 // remove 451 socket_port_map_exclude(&socket_port->map, socket->key, socket->key_length); 452 } 453 } 454 } 455 socket->port = 0; 456 socket->key = NULL; 457 socket->key_length = 0; 458 } 459 } 460 461 int socket_port_add(socket_ports_ref global_sockets, int port, socket_core_ref socket, const char * key, size_t key_length){ 682 462 ERROR_DECLARE; 683 463 … … 686 466 // find ports 687 467 socket_port = socket_ports_find(global_sockets, port); 688 if (!socket_port)468 if(! socket_port){ 689 469 return ENOENT; 690 470 } 691 471 // add the socket 692 ERROR_PROPAGATE(socket_port_add_core(socket_port, socket, key, 693 key_length)); 694 472 ERROR_PROPAGATE(socket_port_add_core(socket_port, socket, key, key_length)); 695 473 socket->port = port; 696 474 return EOK; -
uspace/lib/net/il/arp_remote.c
ra7a85d16 ref689ef0 27 27 */ 28 28 29 /** @addtogroup libnet30 * @{29 /** @addtogroup arp 30 * @{ 31 31 */ 32 32 33 33 /** @file 34 * ARP interface implementation for remote modules.35 * @see arp_interface.h34 * ARP interface implementation for remote modules. 35 * @see arp_interface.h 36 36 */ 37 37 38 38 #include <arp_interface.h> 39 #include <arp_messages.h> 39 40 #include <generic.h> 40 41 … … 43 44 #include <ipc/ipc.h> 44 45 #include <ipc/services.h> 45 #include <ipc/arp.h>46 46 47 47 #include <net/modules.h> … … 49 49 #include <adt/measured_strings.h> 50 50 51 /** Connects to the ARP module. 52 * 53 * @param service The ARP module service. Ignored parameter. 54 * @returns The ARP module phone on success. 55 */ 56 int arp_connect_module(services_t service) 57 { 58 if (service != SERVICE_ARP) 51 int arp_connect_module(services_t service){ 52 if(service != SERVICE_ARP){ 59 53 return EINVAL; 60 54 } 61 55 return connect_to_service(SERVICE_ARP); 62 56 } 63 57 64 /** Cleans the cache. 65 * 66 * @param[in] arp_phone The ARP module phone used for (semi)remote calls. 67 * @returns EOK on success. 68 */ 69 int arp_clean_cache_req(int arp_phone) 70 { 58 int arp_clean_cache_req(int arp_phone){ 71 59 return (int) async_req_0_0(arp_phone, NET_ARP_CLEAN_CACHE); 72 60 } 73 61 74 /** Clears the given protocol address from the cache. 75 * 76 * @param[in] arp_phone The ARP module phone used for (semi)remote calls. 77 * @param[in] device_id The device identifier. 78 * @param[in] protocol The requesting protocol service. 79 * @param[in] address The protocol address to be cleared. 80 * @returns EOK on success. 81 * @returns ENOENT if the mapping is not found. 82 */ 83 int 84 arp_clear_address_req(int arp_phone, device_id_t device_id, services_t protocol, 85 measured_string_ref address) 86 { 62 int arp_clear_address_req(int arp_phone, device_id_t device_id, services_t protocol, measured_string_ref address){ 87 63 aid_t message_id; 88 64 ipcarg_t result; 89 65 90 message_id = async_send_2(arp_phone, NET_ARP_CLEAR_ADDRESS, 91 (ipcarg_t) device_id, protocol, NULL); 66 message_id = async_send_2(arp_phone, NET_ARP_CLEAR_ADDRESS, (ipcarg_t) device_id, protocol, NULL); 92 67 measured_strings_send(arp_phone, address, 1); 93 68 async_wait_for(message_id, &result); 94 95 69 return (int) result; 96 70 } 97 71 98 /** Clears the device cache. 99 * 100 * @param[in] arp_phone The ARP module phone used for (semi)remote calls. 101 * @param[in] device_id The device identifier. 102 * @returns EOK on success. 103 * @returns ENOENT if the device is not found. 104 */ 105 int arp_clear_device_req(int arp_phone, device_id_t device_id) 106 { 107 return (int) async_req_1_0(arp_phone, NET_ARP_CLEAR_DEVICE, 108 (ipcarg_t) device_id); 72 int arp_clear_device_req(int arp_phone, device_id_t device_id){ 73 return (int) async_req_1_0(arp_phone, NET_ARP_CLEAR_DEVICE, (ipcarg_t) device_id); 109 74 } 110 75 111 /** Registers the new device and the requesting protocol service. 112 * 113 * Connects to the network interface layer service. 114 * Determines the device broadcast address, its address lengths and packet size. 115 * 116 * @param[in] arp_phone The ARP module phone used for (semi)remote calls. 117 * @param[in] device_id The new device identifier. 118 * @param[in] protocol The requesting protocol service. 119 * @param[in] netif The underlying device network interface layer service. 120 * @param[in] address The local requesting protocol address of the device. 121 * @returns EOK on success. 122 * @returns EEXIST if the device is already used. 123 * @returns ENOMEM if there is not enough memory left. 124 * @returns ENOENT if the network interface service is not known. 125 * @returns EREFUSED if the network interface service is not 126 * responding. 127 * @returns Other error codes as defined for the 128 * nil_packet_get_size() function. 129 * @returns Other error codes as defined for the nil_get_addr() 130 * function. 131 * @returns Other error codes as defined for the 132 * nil_get_broadcast_addr() function. 133 */ 134 int arp_device_req(int arp_phone, device_id_t device_id, services_t protocol, 135 services_t netif, measured_string_ref address) 136 { 76 int arp_device_req(int arp_phone, device_id_t device_id, services_t protocol, services_t netif, measured_string_ref address){ 137 77 aid_t message_id; 138 78 ipcarg_t result; 139 79 140 message_id = async_send_3(arp_phone, NET_ARP_DEVICE, 141 (ipcarg_t) device_id, protocol, netif, NULL); 80 message_id = async_send_3(arp_phone, NET_ARP_DEVICE, (ipcarg_t) device_id, protocol, netif, NULL); 142 81 measured_strings_send(arp_phone, address, 1); 143 82 async_wait_for(message_id, &result); 144 145 83 return (int) result; 146 84 } 147 85 148 /** Translates the given protocol address to the network interface address. 149 * 150 * Broadcasts the ARP request if the mapping is not found. 151 * Allocates and returns the needed memory block as the data parameter. 152 * 153 * @param[in] arp_phone The ARP module phone used for (semi)remote calls. 154 * @param[in] device_id The device identifier. 155 * @param[in] protocol The requesting protocol service. 156 * @param[in] address The local requesting protocol address. 157 * @param[out] translation The translation of the local protocol address. 158 * @param[out] data The allocated raw translation data container. 159 * @returns EOK on success. 160 * @returns EINVAL if the address parameter is NULL. 161 * @returns EBADMEM if the translation or the data parameters are 162 * NULL. 163 * @returns ENOENT if the mapping is not found. 164 */ 165 int 166 arp_translate_req(int arp_phone, device_id_t device_id, services_t protocol, 167 measured_string_ref address, measured_string_ref *translation, char **data) 168 { 169 return generic_translate_req(arp_phone, NET_ARP_TRANSLATE, device_id, 170 protocol, address, 1, translation, data); 86 task_id_t arp_task_get_id(void){ 87 return 0; 88 } 89 90 int arp_translate_req(int arp_phone, device_id_t device_id, services_t protocol, measured_string_ref address, measured_string_ref * translation, char ** data){ 91 return generic_translate_req(arp_phone, NET_ARP_TRANSLATE, device_id, protocol, address, 1, translation, data); 171 92 } 172 93 -
uspace/lib/net/il/ip_client.c
ra7a85d16 ref689ef0 27 27 */ 28 28 29 /** @addtogroup libnet30 * @{29 /** @addtogroup ip 30 * @{ 31 31 */ 32 32 33 33 /** @file 34 * IP client interface implementation.35 * @see ip_client.h34 * IP client interface implementation. 35 * @see ip_client.h 36 36 */ 37 37 … … 45 45 #include <net/packet.h> 46 46 47 /** Returns the IP header length. 48 * 49 * @param[in] packet The packet. 50 * @returns The IP header length in bytes. 51 * @returns Zero if there is no IP header. 52 */ 53 size_t ip_client_header_length(packet_t packet) 54 { 47 size_t ip_client_header_length(packet_t packet){ 55 48 ip_header_ref header; 56 49 57 50 header = (ip_header_ref) packet_get_data(packet); 58 if (!header || (packet_get_data_length(packet) < sizeof(ip_header_t))) 51 if((! header) 52 || (packet_get_data_length(packet) < sizeof(ip_header_t))){ 59 53 return 0; 60 54 } 61 55 return IP_HEADER_LENGTH(header); 62 56 } 63 57 64 /** Constructs the IPv4 pseudo header. 65 * 66 * @param[in] protocol The transport protocol. 67 * @param[in] src The source address. 68 * @param[in] srclen The source address length. 69 * @param[in] dest The destination address. 70 * @param[in] destlen The destination address length. 71 * @param[in] data_length The data length to be set. 72 * @param[out] header The constructed IPv4 pseudo header. 73 * @param[out] headerlen The length of the IP pseudo header in bytes. 74 * @returns EOK on success. 75 * @returns EBADMEM if the header and/or the headerlen parameter is 76 * NULL. 77 * @returns EINVAL if the source address and/or the destination 78 * address parameter is NULL. 79 * @returns EINVAL if the source address length is less than struct 80 * sockaddr length. 81 * @returns EINVAL if the source address length differs from the 82 * destination address length. 83 * @returns EINVAL if the source address family differs from the 84 * destination family. 85 * @returns EAFNOSUPPORT if the address family is not supported. 86 * @returns ENOMEM if there is not enough memory left. 87 */ 88 int 89 ip_client_get_pseudo_header(ip_protocol_t protocol, struct sockaddr *src, 90 socklen_t srclen, struct sockaddr *dest, socklen_t destlen, 91 size_t data_length, void **header, size_t *headerlen) 92 { 58 int ip_client_get_pseudo_header(ip_protocol_t protocol, struct sockaddr * src, socklen_t srclen, struct sockaddr * dest, socklen_t destlen, size_t data_length, void **header, size_t * headerlen){ 93 59 ipv4_pseudo_header_ref header_in; 94 struct sockaddr_in * address_in;60 struct sockaddr_in * address_in; 95 61 96 if (!header || !headerlen)62 if(!(header && headerlen)){ 97 63 return EBADMEM; 98 99 if (!src || !dest || srclen <= 0 || 100 (((size_t) srclen < sizeof(struct sockaddr))) || 101 (srclen != destlen) || (src->sa_family != dest->sa_family)) { 64 } 65 if(!(src && dest && (srclen > 0) && ((size_t) srclen >= sizeof(struct sockaddr)) && (srclen == destlen) && (src->sa_family == dest->sa_family))){ 102 66 return EINVAL; 103 67 } 104 68 105 switch (src->sa_family) { 106 case AF_INET: 107 if (srclen != sizeof(struct sockaddr_in)) 108 return EINVAL; 109 110 *headerlen = sizeof(*header_in); 111 header_in = (ipv4_pseudo_header_ref) malloc(*headerlen); 112 if (!header_in) 113 return ENOMEM; 114 115 bzero(header_in, *headerlen); 116 address_in = (struct sockaddr_in *) dest; 117 header_in->destination_address = address_in->sin_addr.s_addr; 118 address_in = (struct sockaddr_in *) src; 119 header_in->source_address = address_in->sin_addr.s_addr; 120 header_in->protocol = protocol; 121 header_in->data_length = htons(data_length); 122 *header = header_in; 123 return EOK; 124 125 // TODO IPv6 126 /* case AF_INET6: 127 if (addrlen != sizeof(struct sockaddr_in6)) 128 return EINVAL; 129 130 address_in6 = (struct sockaddr_in6 *) addr; 131 return EOK; 132 */ 133 134 default: 135 return EAFNOSUPPORT; 69 switch(src->sa_family){ 70 case AF_INET: 71 if(srclen != sizeof(struct sockaddr_in)){ 72 return EINVAL; 73 } 74 *headerlen = sizeof(*header_in); 75 header_in = (ipv4_pseudo_header_ref) malloc(*headerlen); 76 if(! header_in){ 77 return ENOMEM; 78 } 79 bzero(header_in, * headerlen); 80 address_in = (struct sockaddr_in *) dest; 81 header_in->destination_address = address_in->sin_addr.s_addr; 82 address_in = (struct sockaddr_in *) src; 83 header_in->source_address = address_in->sin_addr.s_addr; 84 header_in->protocol = protocol; 85 header_in->data_length = htons(data_length); 86 *header = header_in; 87 return EOK; 88 // TODO IPv6 89 /* case AF_INET6: 90 if(addrlen != sizeof(struct sockaddr_in6)){ 91 return EINVAL; 92 } 93 address_in6 = (struct sockaddr_in6 *) addr; 94 return EOK; 95 */ default: 96 return EAFNOSUPPORT; 136 97 } 137 98 } 138 99 139 /** Prepares the packet to be transfered via IP. 140 * 141 * The IP header is prefixed. 142 * 143 * @param[in,out] packet The packet to be prepared. 144 * @param[in] protocol The transport protocol. 145 * @param[in] ttl The time to live counter. The IPDEFTTL is set if zero. 146 * @param[in] tos The type of service. 147 * @param[in] dont_fragment The value indicating whether fragmentation is 148 * disabled. 149 * @param[in] ipopt_length The prefixed IP options length in bytes. 150 * @returns EOK on success. 151 * @returns ENOMEM if there is not enough memory left in the packet. 152 */ 153 int 154 ip_client_prepare_packet(packet_t packet, ip_protocol_t protocol, ip_ttl_t ttl, 155 ip_tos_t tos, int dont_fragment, size_t ipopt_length) 156 { 100 int ip_client_prepare_packet(packet_t packet, ip_protocol_t protocol, ip_ttl_t ttl, ip_tos_t tos, int dont_fragment, size_t ipopt_length){ 157 101 ip_header_ref header; 158 uint8_t * data;102 uint8_t * data; 159 103 size_t padding; 160 104 … … 162 106 // multiple of 4 bytes 163 107 padding = ipopt_length % 4; 164 if (padding){108 if(padding){ 165 109 padding = 4 - padding; 166 110 ipopt_length += padding; … … 169 113 // prefix the header 170 114 data = (uint8_t *) packet_prefix(packet, sizeof(ip_header_t) + padding); 171 if (!data)115 if(! data){ 172 116 return ENOMEM; 117 } 173 118 174 119 // add the padding 175 while (padding--)120 while(padding --){ 176 121 data[sizeof(ip_header_t) + padding] = IPOPT_NOOP; 122 } 177 123 178 124 // set the header 179 125 header = (ip_header_ref) data; 180 header->header_length = IP_COMPUTE_HEADER_LENGTH(sizeof(ip_header_t) + 181 ipopt_length); 182 header->ttl = (ttl ? ttl : IPDEFTTL); 126 header->header_length = IP_COMPUTE_HEADER_LENGTH(sizeof(ip_header_t) + ipopt_length); 127 header->ttl = (ttl ? ttl : IPDEFTTL); //(((ttl) <= MAXTTL) ? ttl : MAXTTL) : IPDEFTTL; 183 128 header->tos = tos; 184 129 header->protocol = protocol; 185 130 186 if (dont_fragment)131 if(dont_fragment){ 187 132 header->flags = IPFLAG_DONT_FRAGMENT; 188 133 } 189 134 return EOK; 190 135 } 191 136 192 /** Processes the received IP packet. 193 * 194 * Fills set header fields. 195 * Returns the prefixed IP header length. 196 * 197 * @param[in] packet The received packet. 198 * @param[out] protocol The transport protocol. May be NULL if not desired. 199 * @param[out] ttl The time to live counter. May be NULL if not desired. 200 * @param[out] tos The type of service. May be NULL if not desired. 201 * @param[out] dont_fragment The value indicating whether the fragmentation is 202 * disabled. May be NULL if not desired. 203 * @param[out] ipopt_length The IP options length in bytes. May be NULL if not 204 * desired. 205 * @returns The prefixed IP header length in bytes on success. 206 * @returns ENOMEM if the packet is too short to contain the IP 207 * header. 208 */ 209 int 210 ip_client_process_packet(packet_t packet, ip_protocol_t *protocol, 211 ip_ttl_t *ttl, ip_tos_t *tos, int *dont_fragment, size_t *ipopt_length) 212 { 137 int ip_client_process_packet(packet_t packet, ip_protocol_t * protocol, ip_ttl_t * ttl, ip_tos_t * tos, int * dont_fragment, size_t * ipopt_length){ 213 138 ip_header_ref header; 214 139 215 140 header = (ip_header_ref) packet_get_data(packet); 216 if (!header || (packet_get_data_length(packet) < sizeof(ip_header_t))) 141 if((! header) 142 || (packet_get_data_length(packet) < sizeof(ip_header_t))){ 217 143 return ENOMEM; 144 } 218 145 219 if (protocol)146 if(protocol){ 220 147 *protocol = header->protocol; 221 if (ttl) 148 } 149 if(ttl){ 222 150 *ttl = header->ttl; 223 if (tos) 151 } 152 if(tos){ 224 153 *tos = header->tos; 225 if (dont_fragment) 226 *dont_fragment = header->flags & IPFLAG_DONT_FRAGMENT; 227 if (ipopt_length) { 154 } 155 if(dont_fragment){ 156 *dont_fragment = header->flags &IPFLAG_DONT_FRAGMENT; 157 } 158 if(ipopt_length){ 228 159 *ipopt_length = IP_HEADER_LENGTH(header) - sizeof(ip_header_t); 229 160 return sizeof(ip_header_t); 230 } else{161 }else{ 231 162 return IP_HEADER_LENGTH(header); 232 163 } 233 164 } 234 165 235 /** Updates the IPv4 pseudo header data length field. 236 * 237 * @param[in,out] header The IPv4 pseudo header to be updated. 238 * @param[in] headerlen The length of the IP pseudo header in bytes. 239 * @param[in] data_length The data length to be set. 240 * @returns EOK on success. 241 * @returns EBADMEM if the header parameter is NULL. 242 * @returns EINVAL if the headerlen parameter is not IPv4 pseudo 243 * header length. 244 */ 245 int 246 ip_client_set_pseudo_header_data_length(void *header, size_t headerlen, 247 size_t data_length) 248 { 166 int ip_client_set_pseudo_header_data_length(void *header, size_t headerlen, size_t data_length){ 249 167 ipv4_pseudo_header_ref header_in; 250 168 251 if (!header)169 if(! header){ 252 170 return EBADMEM; 171 } 253 172 254 if (headerlen == sizeof(ipv4_pseudo_header_t)){173 if(headerlen == sizeof(ipv4_pseudo_header_t)){ 255 174 header_in = (ipv4_pseudo_header_ref) header; 256 175 header_in->data_length = htons(data_length); 257 176 return EOK; 258 177 // TODO IPv6 259 } else{178 }else{ 260 179 return EINVAL; 261 180 } -
uspace/lib/net/il/ip_remote.c
ra7a85d16 ref689ef0 42 42 #include <ip_remote.h> 43 43 #include <ip_interface.h> 44 #include <ip_messages.h> 45 #include <il_messages.h> 44 46 #include <packet_client.h> 45 47 #include <generic.h> 46 48 47 49 #include <ipc/services.h> 48 #include <ipc/il.h>49 #include <ipc/ip.h>50 50 51 51 #include <net/modules.h> -
uspace/lib/net/include/adt/module_map.h
ra7a85d16 ref689ef0 27 27 */ 28 28 29 /** @addtogroup libnet30 * @{29 /** @addtogroup net 30 * @{ 31 31 */ 32 32 33 33 /** @file 34 * Character string to module map.34 * Character string to module map. 35 35 */ 36 36 37 #ifndef LIBNET_MODULES_MAP_H_38 #define LIBNET_MODULES_MAP_H_37 #ifndef __NET_MODULES_MAP_H__ 38 #define __NET_MODULES_MAP_H__ 39 39 40 40 #include <task.h> 41 41 42 #include <ipc/services.h> 43 42 44 #include <net/modules.h> 45 43 46 #include <adt/generic_char_map.h> 44 47 45 48 /** Type definition of the module structure. 46 * @see module_struct49 * @see module_struct 47 50 */ 48 typedef struct module_struct 51 typedef struct module_struct module_t; 49 52 50 53 /** Type definition of the module structure pointer. 51 * @see module_struct54 * @see module_struct 52 55 */ 53 typedef module_t * module_ref;56 typedef module_t * module_ref; 54 57 55 58 /** Module map. 56 * Sorted by module names.57 * @see generic_char_map.h59 * Sorted by module names. 60 * @see generic_char_map.h 58 61 */ 59 62 GENERIC_CHAR_MAP_DECLARE(modules, module_t) 60 63 61 /** Module structure. */ 62 struct module_struct { 63 /** Module task identifier if running. */ 64 /** Module structure. 65 */ 66 struct module_struct{ 67 /** Module task identifier if running. 68 */ 64 69 task_id_t task_id; 65 /** Module service identifier. */ 70 /** Module service identifier. 71 */ 66 72 services_t service; 67 /** Module phone if running and connected. */ 73 /** Module phone if running and connected. 74 */ 68 75 int phone; 69 /** Usage counter. */ 76 /** Usage counter. 77 */ 70 78 int usage; 71 /** Module name. */ 72 const char *name; 73 /** Module full path filename. */ 74 const char *filename; 75 /** Connecting function. */ 76 connect_module_t *connect_module; 79 /** Module name. 80 */ 81 const char * name; 82 /** Module full path filename. 83 */ 84 const char * filename; 85 /** Connecting function. 86 */ 87 connect_module_t * connect_module; 77 88 }; 78 89 79 extern int add_module(module_ref *, modules_ref, const char *, const char *, 80 services_t, task_id_t, connect_module_t *); 81 extern module_ref get_running_module(modules_ref, char *); 82 extern task_id_t spawn(const char *); 90 /** Adds module to the module map. 91 * @param[out] module The module structure added. 92 * @param[in] modules The module map. 93 * @param[in] name The module name. 94 * @param[in] filename The full path filename. 95 * @param[in] service The module service. 96 * @param[in] task_id The module current task identifier. Zero (0) means not running. 97 * @param[in] connect_module The module connecting function. 98 * @returns EOK on success. 99 * @returns ENOMEM if there is not enough memory left. 100 */ 101 int add_module(module_ref * module, modules_ref modules, const char * name, const char * filename, services_t service, task_id_t task_id, connect_module_t * connect_module); 102 103 /** Searches and returns the specified module. 104 * If the module is not running, the module filaname is spawned. 105 * If the module is not connected, the connect_function is called. 106 * @param[in] modules The module map. 107 * @param[in] name The module name. 108 * @returns The running module found. It does not have to be connected. 109 * @returns NULL if there is no such module. 110 */ 111 module_ref get_running_module(modules_ref modules, char * name); 112 113 /** Starts the given module. 114 * @param[in] fname The module full or relative path filename. 115 * @returns The new module task identifier on success. 116 * @returns 0 if there is no such module. 117 */ 118 task_id_t spawn(const char * fname); 83 119 84 120 #endif -
uspace/lib/net/include/arp_interface.h
ra7a85d16 ref689ef0 27 27 */ 28 28 29 /** @addtogroup libnet30 * @{29 /** @addtogroup arp 30 * @{ 31 31 */ 32 32 33 #ifndef LIBNET_ARP_INTERFACE_H_34 #define LIBNET_ARP_INTERFACE_H_33 #ifndef __NET_ARP_INTERFACE_H__ 34 #define __NET_ARP_INTERFACE_H__ 35 35 36 36 #include <adt/measured_strings.h> … … 43 43 44 44 /** @name ARP module interface 45 * This interface is used by other modules.45 * This interface is used by other modules. 46 46 */ 47 47 /*@{*/ 48 48 49 extern int arp_device_req(int, device_id_t, services_t, services_t, 50 measured_string_ref); 51 extern int arp_translate_req(int, device_id_t, services_t, measured_string_ref, 52 measured_string_ref *, char **); 53 extern int arp_clear_device_req(int, device_id_t); 54 extern int arp_clear_address_req(int, device_id_t, services_t, 55 measured_string_ref); 56 extern int arp_clean_cache_req(int); 57 extern int arp_connect_module(services_t); 49 /** Registers the new device and the requesting protocol service. 50 * Connects to the network interface layer service. 51 * Determines the device broadcast address, its address lengths and packet size. 52 * @param[in] arp_phone The ARP module phone used for (semi)remote calls. 53 * @param[in] device_id The new device identifier. 54 * @param[in] protocol The requesting protocol service. 55 * @param[in] netif The underlying device network interface layer service. 56 * @param[in] address The local requesting protocol address of the device. 57 * @returns EOK on success. 58 * @returns EEXIST if the device is already used. 59 * @returns ENOMEM if there is not enough memory left. 60 * @returns ENOENT if the network interface service is not known. 61 * @returns EREFUSED if the network interface service is not responding. 62 * @returns Other error codes as defined for the nil_packet_get_size() function. 63 * @returns Other error codes as defined for the nil_get_addr() function. 64 * @returns Other error codes as defined for the nil_get_broadcast_addr() function. 65 */ 66 extern int arp_device_req(int arp_phone, device_id_t device_id, services_t protocol, services_t netif, measured_string_ref address); 67 68 /** Translates the given protocol address to the network interface address. 69 * Broadcasts the ARP request if the mapping is not found. 70 * Allocates and returns the needed memory block as the data parameter. 71 * @param[in] arp_phone The ARP module phone used for (semi)remote calls. 72 * @param[in] device_id The device identifier. 73 * @param[in] protocol The requesting protocol service. 74 * @param[in] address The local requesting protocol address. 75 * @param[out] translation The translation of the local protocol address. 76 * @param[out] data The allocated raw translation data container. 77 * @returns EOK on success. 78 * @returns EINVAL if the address parameter is NULL. 79 * @returns EBADMEM if the translation or the data parameters are NULL. 80 * @returns ENOENT if the mapping is not found. 81 */ 82 extern int arp_translate_req(int arp_phone, device_id_t device_id, services_t protocol, measured_string_ref address, measured_string_ref * translation, char ** data); 83 84 /** Clears the device cache. 85 * @param[in] arp_phone The ARP module phone used for (semi)remote calls. 86 * @param[in] device_id The device identifier. 87 * @returns EOK on success. 88 * @returns ENOENT if the device is not found. 89 */ 90 extern int arp_clear_device_req(int arp_phone, device_id_t device_id); 91 92 /** Clears the given protocol address from the cache. 93 * @param[in] arp_phone The ARP module phone used for (semi)remote calls. 94 * @param[in] device_id The device identifier. 95 * @param[in] protocol The requesting protocol service. 96 * @param[in] address The protocol address to be cleared. 97 * @returns EOK on success. 98 * @returns ENOENT if the mapping is not found. 99 */ 100 extern int arp_clear_address_req(int arp_phone, device_id_t device_id, services_t protocol, measured_string_ref address); 101 102 /** Cleans the cache. 103 * @param[in] arp_phone The ARP module phone used for (semi)remote calls. 104 * @returns EOK on success. 105 */ 106 extern int arp_clean_cache_req(int arp_phone); 107 108 /** Connects to the ARP module. 109 * @param service The ARP module service. Ignored parameter. 110 * @returns The ARP module phone on success. 111 */ 112 extern int arp_connect_module(services_t service); 113 114 /** Returns the ARP task identifier. 115 * @returns 0 if called by the remote module. 116 */ 117 extern task_id_t arp_task_get_id(void); 58 118 59 119 /*@}*/ -
uspace/lib/net/include/generic.h
ra7a85d16 ref689ef0 27 27 */ 28 28 29 /** @addtogroup libnet29 /** @addtogroup net 30 30 * @{ 31 31 */ … … 35 35 */ 36 36 37 #ifndef LIBNET_GENERIC_H_38 #define LIBNET_GENERIC_H_37 #ifndef NET_GENERIC_H_ 38 #define NET_GENERIC_H_ 39 39 40 40 #include <async.h> -
uspace/lib/net/include/il_interface.h
ra7a85d16 ref689ef0 42 42 43 43 #include <ipc/services.h> 44 #include <ipc/il.h>45 44 46 45 #include <net/device.h> 47 46 #include <net/packet.h> 47 #include <il_messages.h> 48 48 49 49 #include <packet_client.h> -
uspace/lib/net/include/ip_client.h
ra7a85d16 ref689ef0 27 27 */ 28 28 29 /** @addtogroup libnet30 * @{29 /** @addtogroup ip 30 * @{ 31 31 */ 32 32 33 33 /** @file 34 * IP client interface.34 * IP client interface. 35 35 */ 36 36 37 #ifndef LIBNET_IP_CLIENT_H_38 #define LIBNET_IP_CLIENT_H_37 #ifndef __NET_IP_CLIENT_H__ 38 #define __NET_IP_CLIENT_H__ 39 39 40 40 #include <net/socket_codes.h> … … 45 45 #include <ip_interface.h> 46 46 47 extern int ip_client_prepare_packet(packet_t, ip_protocol_t, ip_ttl_t, ip_tos_t, 48 int, size_t); 49 extern int ip_client_process_packet(packet_t, ip_protocol_t *, ip_ttl_t *, 50 ip_tos_t *, int *, size_t *); 51 extern size_t ip_client_header_length(packet_t); 52 extern int ip_client_set_pseudo_header_data_length(void *, size_t, size_t); 53 extern int ip_client_get_pseudo_header(ip_protocol_t, struct sockaddr *, 54 socklen_t, struct sockaddr *, socklen_t, size_t, void **, size_t *); 47 /** Prepares the packet to be transfered via IP. 48 * The IP header is prefixed. 49 * @param[in,out] packet The packet to be prepared. 50 * @param[in] protocol The transport protocol. 51 * @param[in] ttl The time to live counter. The IPDEFTTL is set if zero (0). 52 * @param[in] tos The type of service. 53 * @param[in] dont_fragment The value indicating whether fragmentation is disabled. 54 * @param[in] ipopt_length The prefixed IP options length in bytes. 55 * @returns EOK on success. 56 * @returns ENOMEM if there is not enough memory left in the packet. 57 */ 58 extern int ip_client_prepare_packet(packet_t packet, ip_protocol_t protocol, ip_ttl_t ttl, ip_tos_t tos, int dont_fragment, size_t ipopt_length); 59 60 /** Processes the received IP packet. 61 * Fills set header fields. 62 * Returns the prefixed IP header length. 63 * @param[in] packet The received packet. 64 * @param[out] protocol The transport protocol. May be NULL if not desired. 65 * @param[out] ttl The time to live counter. May be NULL if not desired. 66 * @param[out] tos The type of service. May be NULL if not desired. 67 * @param[out] dont_fragment The value indicating whether the fragmentation is disabled. May be NULL if not desired. 68 * @param[out] ipopt_length The IP options length in bytes. May be NULL if not desired. 69 * @returns The prefixed IP header length in bytes on success. 70 * @returns ENOMEM if the packet is too short to contain the IP header. 71 */ 72 extern int ip_client_process_packet(packet_t packet, ip_protocol_t * protocol, ip_ttl_t * ttl, ip_tos_t * tos, int * dont_fragment, size_t * ipopt_length); 73 74 /** Returns the IP header length. 75 * @param[in] packet The packet. 76 * @returns The IP header length in bytes. 77 * @returns Zero (0) if there is no IP header. 78 */ 79 extern size_t ip_client_header_length(packet_t packet); 80 81 /** Updates the IPv4 pseudo header data length field. 82 * @param[in,out] header The IPv4 pseudo header to be updated. 83 * @param[in] headerlen The length of the IP pseudo header in bytes. 84 * @param[in] data_length The data length to be set. 85 * @returns EOK on success. 86 * @returns EBADMEM if the header parameter is NULL. 87 * @returns EINVAL if the headerlen parameter is not IPv4 pseudo header length. 88 */ 89 extern int ip_client_set_pseudo_header_data_length(void *header, size_t headerlen, size_t data_length); 90 91 /** Constructs the IPv4 pseudo header. 92 * @param[in] protocol The transport protocol. 93 * @param[in] src The source address. 94 * @param[in] srclen The source address length. 95 * @param[in] dest The destination address. 96 * @param[in] destlen The destination address length. 97 * @param[in] data_length The data length to be set. 98 * @param[out] header The constructed IPv4 pseudo header. 99 * @param[out] headerlen The length of the IP pseudo header in bytes. 100 * @returns EOK on success. 101 * @returns EBADMEM if the header and/or the headerlen parameter is NULL. 102 * @returns EINVAL if the source address and/or the destination address parameter is NULL. 103 * @returns EINVAL if the source address length is less than struct sockaddr length. 104 * @returns EINVAL if the source address length differs from the destination address length. 105 * @returns EINVAL if the source address family differs from the destination family. 106 * @returns EAFNOSUPPORT if the address family is not supported. 107 * @returns ENOMEM if there is not enough memory left. 108 */ 109 extern int ip_client_get_pseudo_header(ip_protocol_t protocol, struct sockaddr * src, socklen_t srclen, struct sockaddr * dest, socklen_t destlen, size_t data_length, void **header, size_t * headerlen); 55 110 56 111 // TODO ipopt manipulation -
uspace/lib/net/include/net_checksum.h
ra7a85d16 ref689ef0 27 27 */ 28 28 29 /** @addtogroup libnet30 * @{29 /** @addtogroup net 30 * @{ 31 31 */ 32 32 33 33 /** @file 34 * General CRC and checksum computation.34 * General CRC and checksum computation. 35 35 */ 36 36 37 #ifndef LIBNET_CHECKSUM_H_38 #define LIBNET_CHECKSUM_H_37 #ifndef __NET_CHECKSUM_H__ 38 #define __NET_CHECKSUM_H__ 39 39 40 40 #include <byteorder.h> 41 41 42 #include <sys/types.h> 42 43 43 44 /** IP checksum value for computed zero checksum. 44 * Zero is returned as 0xFFFF (not flipped)45 * Zero is returned as 0xFFFF (not flipped) 45 46 */ 46 #define IP_CHECKSUM_ZERO 0xffffU47 #define IP_CHECKSUM_ZERO 0xFFFFu 47 48 49 /** Computes CRC32 value. 50 * @param[in] seed Initial value. Often used as 0 or ~0. 51 * @param[in] data Pointer to the beginning of data to process. 52 * @param[in] length Length of the data in bits. 53 * @returns The computed CRC32 of the length bits of the data. 54 */ 48 55 #ifdef ARCH_IS_BIG_ENDIAN 49 #define compute_crc32(seed, data, length) \ 50 compute_crc32_be(seed, (uint8_t *) data, length) 56 #define compute_crc32(seed, data, length) compute_crc32_be(seed, (uint8_t *) data, length) 51 57 #else 52 #define compute_crc32(seed, data, length) \ 53 compute_crc32_le(seed, (uint8_t *) data, length) 58 #define compute_crc32(seed, data, length) compute_crc32_le(seed, (uint8_t *) data, length) 54 59 #endif 55 60 56 extern uint32_t compute_crc32_le(uint32_t, uint8_t *, size_t); 57 extern uint32_t compute_crc32_be(uint32_t, uint8_t *, size_t); 58 extern uint32_t compute_checksum(uint32_t, uint8_t *, size_t); 59 extern uint16_t compact_checksum(uint32_t); 60 extern uint16_t flip_checksum(uint16_t); 61 extern uint16_t ip_checksum(uint8_t *, size_t); 61 /** Computes CRC32 value in the little-endian environment. 62 * @param[in] seed Initial value. Often used as 0 or ~0. 63 * @param[in] data Pointer to the beginning of data to process. 64 * @param[in] length Length of the data in bits. 65 * @returns The computed CRC32 of the length bits of the data. 66 */ 67 extern uint32_t compute_crc32_le(uint32_t seed, uint8_t * data, size_t length); 68 69 /** Computes CRC32 value in the big-endian environment. 70 * @param[in] seed Initial value. Often used as 0 or ~0. 71 * @param[in] data Pointer to the beginning of data to process. 72 * @param[in] length Length of the data in bits. 73 * @returns The computed CRC32 of the length bits of the data. 74 */ 75 extern uint32_t compute_crc32_be(uint32_t seed, uint8_t * data, size_t length); 76 77 /** Computes sum of the 2 byte fields. 78 * Padds one zero (0) byte if odd. 79 * @param[in] seed Initial value. Often used as 0 or ~0. 80 * @param[in] data Pointer to the beginning of data to process. 81 * @param[in] length Length of the data in bytes. 82 * @returns The computed checksum of the length bytes of the data. 83 */ 84 extern uint32_t compute_checksum(uint32_t seed, uint8_t * data, size_t length); 85 86 /** Compacts the computed checksum to the 16 bit number adding the carries. 87 * @param[in] sum Computed checksum. 88 * @returns Compacted computed checksum to the 16 bits. 89 */ 90 extern uint16_t compact_checksum(uint32_t sum); 91 92 /** Returns or flips the checksum if zero. 93 * @param[in] checksum The computed checksum. 94 * @returns The internet protocol header checksum. 95 * @returns 0xFFFF if the computed checksum is zero. 96 */ 97 extern uint16_t flip_checksum(uint16_t checksum); 98 99 /** Computes the ip header checksum. 100 * To compute the checksum of a new packet, the checksum header field must be zero. 101 * To check the checksum of a received packet, the checksum may be left set. 102 * The zero (0) value will be returned in this case if valid. 103 * @param[in] data The header data. 104 * @param[in] length The header length in bytes. 105 * @returns The internet protocol header checksum. 106 * @returns 0xFFFF if the computed checksum is zero. 107 */ 108 extern uint16_t ip_checksum(uint8_t * data, size_t length); 62 109 63 110 #endif -
uspace/lib/net/include/net_interface.h
ra7a85d16 ref689ef0 27 27 */ 28 28 29 /** @addtogroup libnet29 /** @addtogroup net 30 30 * @{ 31 31 */ 32 32 33 #ifndef LIBNET_NET_INTERFACE_H_34 #define LIBNET_NET_INTERFACE_H_33 #ifndef __NET_NET_INTERFACE_H__ 34 #define __NET_NET_INTERFACE_H__ 35 35 36 36 #include <ipc/services.h> … … 40 40 41 41 /** @name Networking module interface 42 * This interface is used by other modules.42 * This interface is used by other modules. 43 43 */ 44 44 /*@{*/ 45 45 46 extern int net_get_device_conf_req(int, device_id_t, measured_string_ref *, 47 size_t, char **); 48 extern int net_get_conf_req(int, measured_string_ref *, size_t, char **); 49 extern void net_free_settings(measured_string_ref, char *); 50 extern int net_connect_module(void); 46 /** Returns the device specific configuration. 47 * Returns the global configuration if the device specific is not found. 48 * The configuration names are read and the appropriate settings are set instead. 49 * Call net_free_settings() function to release the returned configuration. 50 * @param[in] net_phone The networking module phone. 51 * @param[in] device_id The device identifier. 52 * @param[in,out] configuration The requested device configuration. The names are read and the appropriate settings are set instead. 53 * @param[in] count The configuration entries count. 54 * @param[in,out] data The configuration and settings data. 55 * @returns EOK on success. 56 * @returns EINVAL if the configuration is NULL. 57 * @returns EINVAL if the count is zero (0). 58 * @returns Other error codes as defined for the generic_translate_req() function. 59 */ 60 extern int net_get_device_conf_req(int net_phone, device_id_t device_id, measured_string_ref * configuration, size_t count, char ** data); 61 62 /** Returns the global configuration. 63 * The configuration names are read and the appropriate settings are set instead. 64 * Call net_free_settings() function to release the returned configuration. 65 * @param[in] net_phone The networking module phone. 66 * @param[in,out] configuration The requested configuration. The names are read and the appropriate settings are set instead. 67 * @param[in] count The configuration entries count. 68 * @param[in,out] data The configuration and settings data. 69 * @returns EOK on success. 70 * @returns EINVAL if the configuration is NULL. 71 * @returns EINVAL if the count is zero (0). 72 * @returns Other error codes as defined for the generic_translate_req() function. 73 */ 74 extern int net_get_conf_req(int net_phone, measured_string_ref * configuration, size_t count, char ** data); 75 76 /** Frees the received settings. 77 * @param[in] settings The received settings. 78 * @param[in] data The received settings data. 79 * @see net_get_device_conf_req() 80 * @see net_get_conf_req() 81 */ 82 extern void net_free_settings(measured_string_ref settings, char * data); 83 84 /** Connects to the networking module. 85 * @param service The networking module service. Ignored parameter. 86 * @returns The networking module phone on success. 87 */ 88 extern int net_connect_module(services_t service); 51 89 52 90 /*@}*/ -
uspace/lib/net/include/nil_interface.h
ra7a85d16 ref689ef0 38 38 39 39 #include <ipc/ipc.h> 40 #include <ipc/nil.h>41 40 42 41 #include <generic.h> 42 #include <nil_messages.h> 43 43 #include <nil_remote.h> 44 44 -
uspace/lib/net/include/packet_client.h
ra7a85d16 ref689ef0 27 27 */ 28 28 29 /** @addtogroup libnet29 /** @addtogroup packet 30 30 * @{ 31 31 */ 32 32 33 33 /** @file 34 * Packet client. 35 * 36 * To function correctly, initialization of the packet map by the pm_init() 37 * function has to happen at the first place. The module should not send the 38 * packet messages to the packet server but use the functions provided. The 39 * packet map should be released by the pm_destroy() function during the module 40 * termination. The packets and the packet queues can't be locked at all. The 41 * processing modules should process them sequentially - by passing the packets 42 * to the next module and stopping using the passed ones. 43 * 44 * @see packet.h 45 */ 46 47 #ifndef LIBNET_PACKET_CLIENT_H_ 48 #define LIBNET_PACKET_CLIENT_H_ 34 * Packet client. 35 * The hosting module has to be compiled with both the packet.c and the packet_client.c source files. 36 * To function correctly, initialization of the packet map by the pm_init() function has to happen at the first place. 37 * The module should not send the packet messages to the packet server but use the functions provided. 38 * The packet map should be released by the pm_destroy() function during the module termination. 39 * The packets and the packet queues can't be locked at all. 40 * The processing modules should process them sequentially - by passing the packets to the next module and stopping using the passed ones. 41 * @see packet.h 42 */ 43 44 #ifndef __NET_PACKET_CLIENT_H__ 45 #define __NET_PACKET_CLIENT_H__ 49 46 50 47 #include <net/packet.h> 51 48 52 /** @name Packet client interface */ 49 /** @name Packet client interface 50 */ 53 51 /*@{*/ 54 52 55 /** Allocates the specified type right before the actual packet content and 56 * returns its pointer. 57 * 58 * The wrapper of the packet_prepend() function. 59 * 60 * @param[in] packet The packet to be used. 61 * @param[in] type The type to be allocated at the beginning of the packet 62 * content. 63 * @returns The typed pointer to the allocated memory. 64 * @returns NULL if the packet is not valid. 65 * @returns NULL if there is not enough memory left. 66 */ 67 #define PACKET_PREFIX(packet, type) \ 68 (type *) packet_prefix((packet), sizeof(type)) 69 70 /** Allocates the specified type right after the actual packet content and 71 * returns its pointer. 72 * 73 * The wrapper of the packet_append() function. 74 * 75 * @param[in] packet The packet to be used. 76 * @param[in] type The type to be allocated at the end of the packet 77 * content. 78 * @returns The typed pointer to the allocated memory. 79 * @returns NULL if the packet is not valid. 80 * @returns NULL if there is not enough memory left. 81 */ 82 #define PACKET_SUFFIX(packet, type) \ 83 (type *) packet_suffix((packet), sizeof(type)) 53 /** Allocates the specified type right before the actual packet content and returns its pointer. 54 * The wrapper of the packet_prepend() function. 55 * @param[in] packet The packet to be used. 56 * @param[in] type The type to be allocated at the beginning of the packet content. 57 * @returns The typed pointer to the allocated memory. 58 * @returns NULL if the packet is not valid. 59 * @returns NULL if there is not enough memory left. 60 */ 61 #define PACKET_PREFIX(packet, type) (type *) packet_prefix((packet), sizeof(type)) 62 63 /** Allocates the specified type right after the actual packet content and returns its pointer. 64 * The wrapper of the packet_append() function. 65 * @param[in] packet The packet to be used. 66 * @param[in] type The type to be allocated at the end of the packet content. 67 * @returns The typed pointer to the allocated memory. 68 * @returns NULL if the packet is not valid. 69 * @returns NULL if there is not enough memory left. 70 */ 71 #define PACKET_SUFFIX(packet, type) (type *) packet_suffix((packet), sizeof(type)) 84 72 85 73 /** Trims the actual packet content by the specified prefix and suffix types. 86 * 87 * The wrapper of the packet_trim() function. 88 * 89 * @param[in] packet The packet to be trimmed. 90 * @param[in] prefix The type of the prefix to be removed from the beginning 91 * of the packet content. 92 * @param[in] suffix The type of the suffix to be removed from the end of 93 * the packet content. 94 * @returns EOK on success. 95 * @returns EINVAL if the packet is not valid. 96 * @returns ENOMEM if there is not enough memory left. 97 */ 98 #define PACKET_TRIM(packet, prefix, suffix) \ 99 packet_trim((packet), sizeof(prefix), sizeof(suffix)) 100 101 extern void *packet_prefix(packet_t, size_t); 102 extern void *packet_suffix(packet_t, size_t); 103 extern int packet_trim(packet_t, size_t, size_t); 104 extern int packet_copy_data(packet_t, const void *, size_t); 105 extern packet_id_t packet_get_id(const packet_t); 106 extern size_t packet_get_data_length(const packet_t); 107 extern void *packet_get_data(const packet_t); 108 extern int packet_get_addr(const packet_t, uint8_t **, uint8_t **); 109 extern int packet_set_addr(packet_t, const uint8_t *, const uint8_t *, size_t); 74 * The wrapper of the packet_trim() function. 75 * @param[in] packet The packet to be trimmed. 76 * @param[in] prefix The type of the prefix to be removed from the beginning of the packet content. 77 * @param[in] suffix The type of the suffix to be removed from the end of the packet content. 78 * @returns EOK on success. 79 * @returns EINVAL if the packet is not valid. 80 * @returns ENOMEM if there is not enough memory left. 81 */ 82 #define PACKET_TRIM(packet, prefix, suffix) packet_trim((packet), sizeof(prefix), sizeof(suffix)) 83 84 /** Allocates the specified space right before the actual packet content and returns its pointer. 85 * @param[in] packet The packet to be used. 86 * @param[in] length The space length to be allocated at the beginning of the packet content. 87 * @returns The pointer to the allocated memory. 88 * @returns NULL if there is not enough memory left. 89 */ 90 extern void * packet_prefix(packet_t packet, size_t length); 91 92 /** Allocates the specified space right after the actual packet content and returns its pointer. 93 * @param[in] packet The packet to be used. 94 * @param[in] length The space length to be allocated at the end of the packet content. 95 * @returns The pointer to the allocated memory. 96 * @returns NULL if there is not enough memory left. 97 */ 98 extern void * packet_suffix(packet_t packet, size_t length); 99 100 /** Trims the actual packet content by the specified prefix and suffix lengths. 101 * @param[in] packet The packet to be trimmed. 102 * @param[in] prefix The prefix length to be removed from the beginning of the packet content. 103 * @param[in] suffix The suffix length to be removed from the end of the packet content. 104 * @returns EOK on success. 105 * @returns EINVAL if the packet is not valid. 106 * @returns ENOMEM if there is not enough memory left. 107 */ 108 extern int packet_trim(packet_t packet, size_t prefix, size_t suffix); 109 110 /** Copies the specified data to the beginning of the actual packet content. 111 * Pushes the content end if needed. 112 * @param[in] packet The packet to be filled. 113 * @param[in] data The data to be copied. 114 * @param[in] length The length of the copied data. 115 * @returns EOK on success. 116 * @returns EINVAL if the packet is not valid. 117 * @returns ENOMEM if there is not enough memory left. 118 */ 119 extern int packet_copy_data(packet_t packet, const void * data, size_t length); 120 121 /** Returns the packet identifier. 122 * @param[in] packet The packet. 123 * @returns The packet identifier. 124 * @returns Zero (0) if the packet is not valid. 125 */ 126 extern packet_id_t packet_get_id(const packet_t packet); 127 128 /** Returns the packet content length. 129 * @param[in] packet The packet. 130 * @returns The packet content length in bytes. 131 * @returns Zero (0) if the packet is not valid. 132 */ 133 extern size_t packet_get_data_length(const packet_t packet); 134 135 /** Returns the pointer to the beginning of the packet content. 136 * @param[in] packet The packet. 137 * @returns The pointer to the beginning of the packet content. 138 * @returns NULL if the packet is not valid. 139 */ 140 extern void * packet_get_data(const packet_t packet); 141 142 /** Returns the stored packet addresses and their length. 143 * @param[in] packet The packet. 144 * @param[out] src The source address. May be NULL if not desired. 145 * @param[out] dest The destination address. May be NULL if not desired. 146 * @returns The stored addresses length. 147 * @returns Zero (0) if the addresses are not present. 148 * @returns EINVAL if the packet is not valid. 149 */ 150 extern int packet_get_addr(const packet_t packet, uint8_t ** src, uint8_t ** dest); 151 152 /** Sets the packet addresses. 153 * @param[in] packet The packet. 154 * @param[in] src The new source address. May be NULL. 155 * @param[in] dest The new destination address. May be NULL. 156 * @param[in] addr_len The addresses length. 157 * @returns EOK on success. 158 * @returns EINVAL if the packet is not valid. 159 * @returns ENOMEM if there is not enough memory left. 160 */ 161 extern int packet_set_addr(packet_t packet, const uint8_t * src, const uint8_t * dest, size_t addr_len); 162 163 /** Translates the packet identifier to the packet reference. 164 * Tries to find mapping first. 165 * Contacts the packet server to share the packet if the mapping is not present. 166 * @param[in] phone The packet server module phone. 167 * @param[out] packet The packet reference. 168 * @param[in] packet_id The packet identifier. 169 * @returns EOK on success. 170 * @returns EINVAL if the packet parameter is NULL. 171 * @returns Other error codes as defined for the NET_PACKET_GET_SIZE message. 172 * @returns Other error codes as defined for the packet_return() function. 173 */ 174 extern int packet_translate_remote(int phone, packet_ref packet, packet_id_t packet_id); 175 176 /** Obtains the packet of the given dimensions. 177 * Contacts the packet server to return the appropriate packet. 178 * @param[in] phone The packet server module phone. 179 * @param[in] addr_len The source and destination addresses maximal length in bytes. 180 * @param[in] max_prefix The maximal prefix length in bytes. 181 * @param[in] max_content The maximal content length in bytes. 182 * @param[in] max_suffix The maximal suffix length in bytes. 183 * @returns The packet reference. 184 * @returns NULL on error. 185 */ 186 extern packet_t packet_get_4_remote(int phone, size_t max_content, size_t addr_len, size_t max_prefix, size_t max_suffix); 187 188 /** Obtains the packet of the given content size. 189 * Contacts the packet server to return the appropriate packet. 190 * @param[in] phone The packet server module phone. 191 * @param[in] content The maximal content length in bytes. 192 * @returns The packet reference. 193 * @returns NULL on error. 194 */ 195 extern packet_t packet_get_1_remote(int phone, size_t content); 196 197 /** Releases the packet queue. 198 * All packets in the queue are marked as free for use. 199 * The packet queue may be one packet only. 200 * The module should not use the packets after this point until they are received or obtained again. 201 * @param[in] phone The packet server module phone. 202 * @param[in] packet_id The packet identifier. 203 */ 204 extern void pq_release_remote(int phone, packet_id_t packet_id); 205 206 /** Returns the packet copy. 207 * Copies the addresses, data, order and metric values. 208 * Does not copy the queue placement. 209 * @param[in] phone The packet server module phone. 210 * @param[in] packet The original packet. 211 * @returns The packet copy. 212 * @returns NULL on error. 213 */ 110 214 extern packet_t packet_get_copy(int phone, packet_t packet); 111 215 -
uspace/lib/net/include/packet_remote.h
ra7a85d16 ref689ef0 27 27 */ 28 28 29 /** @addtogroup libnet29 /** @addtogroup packet 30 30 * @{ 31 31 */ 32 32 33 #ifndef LIBNET_PACKET_REMOTE_H_34 #define LIBNET_PACKET_REMOTE_H_33 #ifndef __NET_PACKET_REMOTE_H__ 34 #define __NET_PACKET_REMOTE_H__ 35 35 36 36 #include <net/packet.h> 37 #include <sys/types.h>38 37 39 38 extern int packet_translate_remote(int, packet_ref, packet_id_t); -
uspace/lib/net/include/socket_core.h
ra7a85d16 ref689ef0 27 27 */ 28 28 29 /** @addtogroup libnet29 /** @addtogroup socket 30 30 * @{ 31 31 */ 32 32 33 33 /** @file 34 * Socket common core.35 */ 36 37 #ifndef LIBNET_SOCKET_CORE_H_38 #define LIBNET_SOCKET_CORE_H_34 * Socket common core. 35 */ 36 37 #ifndef __NET_SOCKET_CORE_H__ 38 #define __NET_SOCKET_CORE_H__ 39 39 40 40 #include <sys/types.h> 41 42 #include <net/in.h> 43 #include <net/device.h> 41 44 #include <adt/generic_char_map.h> 42 45 #include <adt/dynamic_fifo.h> 43 46 #include <adt/int_map.h> 44 #include <net/in.h>45 #include <net/device.h>46 47 #include <net/packet.h> 47 48 48 /** Initial size of the received packet queue. */ 49 /** Initial size of the received packet queue. 50 */ 49 51 #define SOCKET_INITIAL_RECEIVED_SIZE 4 50 52 51 /** Maximum size of the received packet queue. */ 52 #define SOCKET_MAX_RECEIVED_SIZE 0 53 54 /** Initial size of the sockets for acceptance queue. */ 53 /** Maximum size of the received packet queue. 54 */ 55 #define SOCKET_MAX_RECEIVED_SIZE 0 56 57 /** Initial size of the sockets for acceptance queue. 58 */ 55 59 #define SOCKET_INITIAL_ACCEPTED_SIZE 1 56 60 57 /** Maximum size of the sockets for acceptance queue. */ 58 #define SOCKET_MAX_ACCEPTEDED_SIZE 0 59 60 /** Listening sockets' port map key. */ 61 /** Maximum size of the sockets for acceptance queue. 62 */ 63 #define SOCKET_MAX_ACCEPTEDED_SIZE 0 64 65 /** Listening sockets' port map key. 66 */ 61 67 #define SOCKET_MAP_KEY_LISTENING "L" 62 68 63 69 /** Type definition of the socket core. 64 * @see socket_core65 */ 66 typedef struct socket_core 70 * @see socket_core 71 */ 72 typedef struct socket_core socket_core_t; 67 73 68 74 /** Type definition of the socket core pointer. 69 * @see socket_core70 */ 71 typedef socket_core_t * socket_core_ref;75 * @see socket_core 76 */ 77 typedef socket_core_t * socket_core_ref; 72 78 73 79 /** Type definition of the socket port. 74 * @see socket_port75 */ 76 typedef struct socket_port 80 * @see socket_port 81 */ 82 typedef struct socket_port socket_port_t; 77 83 78 84 /** Type definition of the socket port pointer. 79 * @see socket_port 80 */ 81 typedef socket_port_t *socket_port_ref; 82 83 /** Socket core. */ 84 struct socket_core { 85 /** Socket identifier. */ 85 * @see socket_port 86 */ 87 typedef socket_port_t * socket_port_ref; 88 89 /** Socket core. 90 */ 91 struct socket_core{ 92 /** Socket identifier. 93 */ 86 94 int socket_id; 87 /** Client application phone. */ 95 /** Client application phone. 96 */ 88 97 int phone; 89 /** Bound port. */ 98 /** Bound port. 99 */ 90 100 int port; 91 /** Received packets queue. */ 101 /** Received packets queue. 102 */ 92 103 dyn_fifo_t received; 93 /** Sockets for acceptance queue. */ 104 /** Sockets for acceptance queue. 105 */ 94 106 dyn_fifo_t accepted; 95 /** Protocol specific data. */ 96 void *specific_data; 97 /** Socket ports map key. */ 98 const char *key; 99 /** Length of the Socket ports map key. */ 107 /** Protocol specific data. 108 */ 109 void * specific_data; 110 /** Socket ports map key. 111 */ 112 const char * key; 113 /** Length of the Socket ports map key. 114 */ 100 115 size_t key_length; 101 116 }; 102 117 103 118 /** Sockets map. 104 * The key is the socket identifier.119 * The key is the socket identifier. 105 120 */ 106 121 INT_MAP_DECLARE(socket_cores, socket_core_t); 107 122 108 123 /** Bount port sockets map. 109 * 110 * The listening socket has the SOCKET_MAP_KEY_LISTENING key identifier whereas 111 * the other use the remote addresses. 124 * The listening socket has the SOCKET_MAP_KEY_LISTENING key identifier whereas the other use the remote addresses. 112 125 */ 113 126 GENERIC_CHAR_MAP_DECLARE(socket_port_map, socket_core_ref); 114 127 115 128 /** Ports map. 116 * The key is the port number.129 * The key is the port number. 117 130 */ 118 131 INT_MAP_DECLARE(socket_ports, socket_port_t); 119 132 120 extern void socket_cores_release(int, socket_cores_ref, socket_ports_ref, 121 void (*)(socket_core_ref)); 122 extern int socket_bind(socket_cores_ref, socket_ports_ref, int, void *, size_t, 123 int, int, int); 124 extern int socket_bind_free_port(socket_ports_ref, socket_core_ref, int, int, 125 int); 126 extern int socket_create(socket_cores_ref, int, void *, int *); 127 extern int socket_destroy(int, int, socket_cores_ref, socket_ports_ref, 128 void (*)(socket_core_ref)); 129 extern int socket_reply_packets(packet_t, size_t *); 130 extern socket_core_ref socket_port_find(socket_ports_ref, int, const char *, 131 size_t); 132 extern void socket_port_release(socket_ports_ref, socket_core_ref); 133 extern int socket_port_add(socket_ports_ref, int, socket_core_ref, 134 const char *, size_t); 133 /** Destroys local sockets. 134 * Releases all buffered packets and calls the release function for each of the sockets. 135 * @param[in] packet_phone The packet server phone to release buffered packets. 136 * @param[in] local_sockets The local sockets to be destroyed. 137 * @param[in,out] global_sockets The global sockets to be updated. 138 * @param[in] socket_release The client release callback function. 139 */ 140 extern void socket_cores_release(int packet_phone, socket_cores_ref local_sockets, socket_ports_ref global_sockets, void (*socket_release)(socket_core_ref socket)); 141 142 /** Binds the socket to the port. 143 * The address port is used if set, a free port is used if not. 144 * @param[in] local_sockets The local sockets to be searched. 145 * @param[in,out] global_sockets The global sockets to be updated. 146 * @param[in] socket_id The new socket identifier. 147 * @param[in] addr The address to be bound to. 148 * @param[in] addrlen The address length. 149 * @param[in] free_ports_start The minimum free port. 150 * @param[in] free_ports_end The maximum free port. 151 * @param[in] last_used_port The last used free port. 152 * @returns EOK on success. 153 * @returns ENOTSOCK if the socket was not found. 154 * @returns EAFNOSUPPORT if the address family is not supported. 155 * @returns EADDRINUSE if the port is already in use. 156 * @returns Other error codes as defined for the socket_bind_free_port() function. 157 * @returns Other error codes as defined for the socket_bind_insert() function. 158 */ 159 extern int socket_bind(socket_cores_ref local_sockets, socket_ports_ref global_sockets, int socket_id, void * addr, size_t addrlen, int free_ports_start, int free_ports_end, int last_used_port); 160 161 /** Binds the socket to a free port. 162 * The first free port is used. 163 * @param[in,out] global_sockets The global sockets to be updated. 164 * @param[in,out] socket The socket to be bound. 165 * @param[in] free_ports_start The minimum free port. 166 * @param[in] free_ports_end The maximum free port. 167 * @param[in] last_used_port The last used free port. 168 * @returns EOK on success. 169 * @returns ENOTCONN if no free port was found. 170 * @returns Other error codes as defined for the socket_bind_insert() function. 171 */ 172 extern int socket_bind_free_port(socket_ports_ref global_sockets, socket_core_ref socket, int free_ports_start, int free_ports_end, int last_used_port); 173 174 /** Creates a new socket. 175 * @param[in,out] local_sockets The local sockets to be updated. 176 * @param[in] app_phone The application phone. 177 * @param[in] specific_data The socket specific data. 178 * @param[in,out] socket_id The new socket identifier. A new identifier is chosen if set to zero (0) or negative. A negative identifier is chosen if set to negative. 179 * @returns EOK on success. 180 * @returns EINVAL if the socket_id parameter is NULL. 181 * @returns ENOMEM if there is not enough memory left. 182 */ 183 extern int socket_create(socket_cores_ref local_sockets, int app_phone, void * specific_data, int * socket_id); 184 185 /** Destroys the socket. 186 * If the socket is bound, the port is released. 187 * Releases all buffered packets, calls the release function and removes the socket from the local sockets. 188 * @param[in] packet_phone The packet server phone to release buffered packets. 189 * @param[in] socket_id The socket identifier. 190 * @param[in,out] local_sockets The local sockets to be updated. 191 * @param[in,out] global_sockets The global sockets to be updated. 192 * @param[in] socket_release The client release callback function. 193 * @returns EOK on success. 194 * @returns ENOTSOCK if the socket is not found. 195 */ 196 extern int socket_destroy(int packet_phone, int socket_id, socket_cores_ref local_sockets, socket_ports_ref global_sockets, void (*socket_release)(socket_core_ref socket)); 197 198 /** Replies the packet or the packet queue data to the application via the socket. 199 * Uses the current message processing fibril. 200 * @param[in] packet The packet to be transfered. 201 * @param[out] length The total data length. 202 * @returns EOK on success. 203 * @returns EBADMEM if the length parameter is NULL. 204 * @returns ENOMEM if there is not enough memory left. 205 * @returns Other error codes as defined for the data_reply() function. 206 */ 207 extern int socket_reply_packets(packet_t packet, size_t * length); 208 209 /** Finds the bound port socket. 210 * @param[in] global_sockets The global sockets to be searched. 211 * @param[in] port The port number. 212 * @param[in] key The socket key identifier. 213 * @param[in] key_length The socket key length. 214 * @returns The found socket. 215 * @returns NULL if no socket was found. 216 */ 217 extern socket_core_ref socket_port_find(socket_ports_ref global_sockets, int port, const char * key, size_t key_length); 218 219 /** Releases the socket port. 220 * If the socket is bound the port entry is released. 221 * If there are no more port entries the port is release. 222 * @param[in] global_sockets The global sockets to be updated. 223 * @param[in] socket The socket to be unbound. 224 */ 225 extern void socket_port_release(socket_ports_ref global_sockets, socket_core_ref socket); 226 227 /** Adds the socket to an already bound port. 228 * @param[in] global_sockets The global sockets to be updated. 229 * @param[in] port The port number to be bound to. 230 * @param[in] socket The socket to be added. 231 * @param[in] key The socket key identifier. 232 * @param[in] key_length The socket key length. 233 * @returns EOK on success. 234 * @returns ENOENT if the port is not already used. 235 * @returns Other error codes as defined for the socket_port_add_core() function. 236 */ 237 extern int socket_port_add(socket_ports_ref global_sockets, int port, socket_core_ref socket, const char * key, size_t key_length); 135 238 136 239 #endif -
uspace/lib/net/include/tl_interface.h
ra7a85d16 ref689ef0 40 40 #include <async.h> 41 41 #include <ipc/services.h> 42 #include <ipc/tl.h>43 42 44 43 #include <generic.h> … … 46 45 #include <net/packet.h> 47 46 #include <packet_client.h> 47 #include <tl_messages.h> 48 48 49 49 /** @name Transport layer module interface -
uspace/lib/net/netif/netif_local.c
ra7a85d16 ref689ef0 42 42 #include <ipc/ipc.h> 43 43 #include <ipc/services.h> 44 #include <ipc/netif.h>45 44 #include <err.h> 46 45 … … 54 53 #include <nil_interface.h> 55 54 #include <netif_local.h> 55 #include <netif_messages.h> 56 56 #include <netif_interface.h> 57 57 -
uspace/lib/net/netif/netif_remote.c
ra7a85d16 ref689ef0 36 36 37 37 #include <ipc/services.h> 38 #include <ipc/netif.h>39 38 40 39 #include <net/modules.h> … … 44 43 #include <net/device.h> 45 44 #include <netif_remote.h> 45 #include <netif_messages.h> 46 46 #include <generic.h> 47 47 -
uspace/lib/net/nil/nil_remote.c
ra7a85d16 ref689ef0 38 38 #include <nil_remote.h> 39 39 #include <nil_interface.h> 40 #include <nil_messages.h> 40 41 #include <generic.h> 41 42 #include <net/device.h> 42 43 #include <net/packet.h> 43 44 #include <packet_client.h> 44 45 #include <ipc/nil.h>46 45 47 46 /** Notify the network interface layer about the device state change. -
uspace/srv/net/il/arp/arp.c
ra7a85d16 ref689ef0 46 46 #include <ipc/services.h> 47 47 #include <ipc/net.h> 48 #include <ipc/arp.h>49 #include <ipc/il.h>50 48 #include <byteorder.h> 51 49 #include <err.h> … … 60 58 #include <packet_client.h> 61 59 #include <packet_remote.h> 60 #include <il_messages.h> 62 61 #include <il_interface.h> 63 62 #include <il_local.h> 63 #include <arp_messages.h> 64 64 65 65 #include "arp.h" … … 534 534 } 535 535 return EOK; 536 } 537 538 task_id_t arp_task_get_id(void){ 539 return task_get_id(); 536 540 } 537 541 -
uspace/srv/net/il/arp/arp_module.c
ra7a85d16 ref689ef0 80 80 81 81 async_set_client_connection(client_connection); 82 arp_globals.net_phone = net_connect_module( );82 arp_globals.net_phone = net_connect_module(SERVICE_NETWORKING); 83 83 ERROR_PROPAGATE(pm_init()); 84 84 -
uspace/srv/net/il/ip/ip.c
ra7a85d16 ref689ef0 45 45 #include <ipc/services.h> 46 46 #include <ipc/net.h> 47 #include <ipc/nil.h>48 #include <ipc/il.h>49 #include <ipc/ip.h>50 47 #include <sys/types.h> 51 48 #include <byteorder.h> … … 74 71 #include <packet_client.h> 75 72 #include <packet_remote.h> 73 #include <nil_messages.h> 74 #include <il_messages.h> 76 75 #include <il_local.h> 76 #include <ip_local.h> 77 77 78 78 #include "ip.h" 79 79 #include "ip_header.h" 80 #include "ip_messages.h" 80 81 #include "ip_module.h" 81 #include "ip_local.h"82 82 83 83 /** IP module name. … … 423 423 ip_globals.client_connection = client_connection; 424 424 ERROR_PROPAGATE(modules_initialize(&ip_globals.modules)); 425 ERROR_PROPAGATE(add_module(NULL, &ip_globals.modules, ARP_NAME, ARP_FILENAME, SERVICE_ARP, 0, arp_connect_module));425 ERROR_PROPAGATE(add_module(NULL, &ip_globals.modules, ARP_NAME, ARP_FILENAME, SERVICE_ARP, arp_task_get_id(), arp_connect_module)); 426 426 fibril_rwlock_write_unlock(&ip_globals.lock); 427 427 return EOK; -
uspace/srv/net/il/ip/ip_module.c
ra7a85d16 ref689ef0 79 79 80 80 async_set_client_connection(client_connection); 81 ip_globals.net_phone = net_connect_module( );81 ip_globals.net_phone = net_connect_module(SERVICE_NETWORKING); 82 82 ERROR_PROPAGATE(pm_init()); 83 83 -
uspace/srv/net/net/net.c
ra7a85d16 ref689ef0 46 46 47 47 #include <ipc/ipc.h> 48 #include <ipc/net.h> 48 49 #include <ipc/services.h> 49 #include <ipc/net.h>50 #include <ipc/net_net.h>51 #include <ipc/il.h>52 50 53 51 #include <net/modules.h> … … 57 55 #include <adt/module_map.h> 58 56 #include <net/packet.h> 57 #include <il_messages.h> 59 58 #include <netif_remote.h> 60 59 #include <net/device.h> … … 62 61 #include <net_interface.h> 63 62 #include <ip_interface.h> 63 #include <net_net_messages.h> 64 64 65 65 #include "net.h" -
uspace/srv/net/netif/lo/lo.c
ra7a85d16 ref689ef0 43 43 #include <ipc/ipc.h> 44 44 #include <ipc/services.h> 45 #include <ipc/nil.h>46 45 47 46 #include <net/modules.h> … … 50 49 #include <net/device.h> 51 50 #include <nil_interface.h> 51 #include <nil_messages.h> 52 52 #include <netif_interface.h> 53 53 #include <netif_local.h> -
uspace/srv/net/netstart/netstart.c
ra7a85d16 ref689ef0 48 48 #include <ipc/ipc.h> 49 49 #include <ipc/services.h> 50 #include <ipc/net_net.h>51 50 52 51 #include <net/modules.h> 52 #include <net_net_messages.h> 53 53 54 54 #include "self_test.h" -
uspace/srv/net/nil/eth/eth_module.c
ra7a85d16 ref689ef0 63 63 64 64 async_set_client_connection(client_connection); 65 int net_phone = net_connect_module( );65 int net_phone = net_connect_module(SERVICE_NETWORKING); 66 66 ERROR_PROPAGATE(pm_init()); 67 67 -
uspace/srv/net/nil/nildummy/nildummy_module.c
ra7a85d16 ref689ef0 71 71 72 72 async_set_client_connection(client_connection); 73 int net_phone = net_connect_module( );73 int net_phone = net_connect_module(SERVICE_NETWORKING); 74 74 ERROR_PROPAGATE(pm_init()); 75 75 -
uspace/srv/net/tl/icmp/icmp.c
ra7a85d16 ref689ef0 45 45 #include <ipc/services.h> 46 46 #include <ipc/net.h> 47 #include <ipc/tl.h>48 47 #include <ipc/icmp.h> 49 48 #include <sys/time.h> … … 70 69 #include <ip_interface.h> 71 70 #include <net_interface.h> 71 #include <tl_messages.h> 72 72 #include <tl_interface.h> 73 73 #include <tl_local.h> -
uspace/srv/net/tl/icmp/icmp_module.c
ra7a85d16 ref689ef0 69 69 70 70 async_set_client_connection(client_connection); 71 icmp_globals.net_phone = net_connect_module( );71 icmp_globals.net_phone = net_connect_module(SERVICE_NETWORKING); 72 72 if(icmp_globals.net_phone < 0){ 73 73 return icmp_globals.net_phone; -
uspace/srv/net/tl/tcp/tcp.c
ra7a85d16 ref689ef0 48 48 #include <ipc/services.h> 49 49 #include <ipc/net.h> 50 #include <ipc/tl.h>51 50 #include <ipc/socket.h> 52 51 … … 69 68 #include <socket_core.h> 70 69 #include <tl_common.h> 70 #include <tl_messages.h> 71 71 #include <tl_local.h> 72 72 #include <tl_interface.h> -
uspace/srv/net/tl/tcp/tcp_module.c
ra7a85d16 ref689ef0 71 71 72 72 async_set_client_connection(client_connection); 73 tcp_globals.net_phone = net_connect_module( );73 tcp_globals.net_phone = net_connect_module(SERVICE_NETWORKING); 74 74 ERROR_PROPAGATE(pm_init()); 75 75 -
uspace/srv/net/tl/udp/udp.c
ra7a85d16 ref689ef0 43 43 #include <ipc/services.h> 44 44 #include <ipc/net.h> 45 #include <ipc/tl.h>46 45 #include <ipc/socket.h> 47 46 #include <errno.h> … … 68 67 #include <tl_local.h> 69 68 #include <tl_interface.h> 69 #include <tl_messages.h> 70 70 71 71 #include "udp.h" -
uspace/srv/net/tl/udp/udp_module.c
ra7a85d16 ref689ef0 69 69 70 70 async_set_client_connection(client_connection); 71 udp_globals.net_phone = net_connect_module( );71 udp_globals.net_phone = net_connect_module(SERVICE_NETWORKING); 72 72 if(udp_globals.net_phone < 0){ 73 73 return udp_globals.net_phone;
Note:
See TracChangeset
for help on using the changeset viewer.