Changes in / [a7a85d16:ef689ef0] in mainline


Ignore:
Location:
uspace
Files:
8 added
8 deleted
41 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/include/net/icmp_api.h

    ra7a85d16 ref689ef0  
    4444
    4545#include <adt/measured_strings.h>
     46#include <net/packet.h>
    4647#include <net/ip_codes.h>
    4748#include <net/icmp_codes.h>
  • uspace/lib/net/adt/module_map.c

    ra7a85d16 ref689ef0  
    2727 */
    2828
    29 /** @addtogroup libnet
    30  * @{
     29/** @addtogroup net
     30 *  @{
    3131 */
    3232
    3333/** @file
    34  * Character string to module map implementation.
     34 *  Character string to module map implementation.
    3535 */
    3636
     
    4949GENERIC_CHAR_MAP_IMPLEMENT(modules, module_t)
    5050
    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 {
     51int 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){
    6952        ERROR_DECLARE;
    7053
     
    7255
    7356        tmp_module = (module_ref) malloc(sizeof(module_t));
    74         if (!tmp_module)
     57        if(! tmp_module){
    7558                return ENOMEM;
    76 
     59        }
    7760        tmp_module->task_id = task_id;
    7861        tmp_module->phone = 0;
     
    8265        tmp_module->service = service;
    8366        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))){
    8768                free(tmp_module);
    8869                return ERROR_CODE;
    8970        }
    90         if (module)
     71        if(module){
    9172                *module = tmp_module;
    92 
     73        }
    9374        return EOK;
    9475}
    9576
    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 {
     77module_ref get_running_module(modules_ref modules, char * name){
    10978        module_ref module;
    11079
    11180        module = modules_find(modules, name, 0);
    112         if (!module)
     81        if(! module){
    11382                return NULL;
    114 
    115         if (!module->task_id) {
     83        }
     84        if(! module->task_id){
    11685                module->task_id = spawn(module->filename);
    117                 if (!module->task_id)
     86                if(! module->task_id){
    11887                        return NULL;
     88                }
    11989        }
    120         if (!module->phone)
     90        if(! module->phone){
    12191                module->phone = module->connect_module(module->service);
    122 
     92        }
    12393        return module;
    12494}
    12595
    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  */
    13296task_id_t spawn(const char *fname)
    13397{
  • uspace/lib/net/generic/generic.c

    ra7a85d16 ref689ef0  
    2727 */
    2828
    29 /** @addtogroup libnet
     29/** @addtogroup net
    3030 * @{
    3131 */
  • uspace/lib/net/generic/net_checksum.c

    ra7a85d16 ref689ef0  
    2727 */
    2828
    29 /** @addtogroup libnet
    30  * @{
     29/** @addtogroup net
     30 *  @{
    3131 */
    3232
    3333/** @file
    34  * General CRC and checksum computation implementation.
     34 *  General CRC and checksum computation implementation.
    3535 */
    3636
     
    3939#include <net_checksum.h>
    4040
    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
    4344
    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
    4648
    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 {
     49uint16_t compact_checksum(uint32_t sum){
    5450        // 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        }
    5754
    5855        return (uint16_t) sum;
    5956}
    6057
    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 {
     58uint32_t compute_checksum(uint32_t seed, uint8_t * data, size_t length){
    7259        size_t index;
    7360
    7461        // sum all the 16 bit fields
    75         for (index = 0; index + 1 < length; index += 2)
     62        for(index = 0; index + 1 < length; index += 2){
    7663                seed += (data[index] << 8) + data[index + 1];
     64        }
    7765
    7866        // last odd byte with zero padding
    79         if (index + 1 == length)
     67        if(index + 1 == length){
    8068                seed += data[index] << 8;
     69        }
    8170
    8271        return seed;
    8372}
    8473
    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 {
     74uint32_t compute_crc32_be(uint32_t seed, uint8_t * data, size_t length){
    9475        size_t index;
    9576
    9677        // process full bytes
    97         while (length >= 8) {
     78        while(length >= 8){
    9879                // add the data
    9980                seed ^= (*data) << 24;
    100                
    10181                // for each added bit
    102                 for (index = 0; index < 8; ++index) {
     82                for(index = 0; index < 8; ++ index){
    10383                        // if the first bit is set
    104                         if (seed & 0x80000000) {
     84                        if(seed &0x80000000){
    10585                                // shift and divide the checksum
    10686                                seed = (seed << 1) ^ ((uint32_t) CRC_DIVIDER_BE);
    107                         } else {
     87                        }else{
    10888                                // shift otherwise
    10989                                seed <<= 1;
    11090                        }
    11191                }
    112                
    11392                // move to the next byte
    114                 ++data;
     93                ++ data;
    11594                length -= 8;
    11695        }
    11796
    11897        // process the odd bits
    119         if (length > 0) {
     98        if(length > 0){
    12099                // add the data with zero padding
    121                 seed ^= ((*data) & (0xff << (8 - length))) << 24;
    122                
     100                seed ^= ((*data) &(0xFF << (8 - length))) << 24;
    123101                // for each added bit
    124                 for (index = 0; index < length; ++index) {
     102                for(index = 0; index < length; ++ index){
    125103                        // if the first bit is set
    126                         if (seed & 0x80000000) {
     104                        if(seed &0x80000000){
    127105                                // shift and divide the checksum
    128106                                seed = (seed << 1) ^ ((uint32_t) CRC_DIVIDER_BE);
    129                         } else {
     107                        }else{
    130108                                // shift otherwise
    131109                                seed <<= 1;
     
    137115}
    138116
    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 {
     117uint32_t compute_crc32_le(uint32_t seed, uint8_t * data, size_t length){
    148118        size_t index;
    149119
    150120        // process full bytes
    151         while (length >= 8) {
     121        while(length >= 8){
    152122                // add the data
    153123                seed ^= (*data);
    154                
    155124                // for each added bit
    156                 for (index = 0; index < 8; ++index) {
     125                for(index = 0; index < 8; ++ index){
    157126                        // if the last bit is set
    158                         if (seed & 1) {
     127                        if(seed &1){
    159128                                // shift and divide the checksum
    160129                                seed = (seed >> 1) ^ ((uint32_t) CRC_DIVIDER_LE);
    161                         } else {
     130                        }else{
    162131                                // shift otherwise
    163132                                seed >>= 1;
    164133                        }
    165134                }
    166                
    167135                // move to the next byte
    168                 ++data;
     136                ++ data;
    169137                length -= 8;
    170138        }
    171139
    172140        // process the odd bits
    173         if (length > 0) {
     141        if(length > 0){
    174142                // add the data with zero padding
    175143                seed ^= (*data) >> (8 - length);
    176                
    177                 for (index = 0; index < length; ++index) {
     144                for(index = 0; index < length; ++ index){
    178145                        // if the last bit is set
    179                         if (seed & 1) {
     146                        if(seed &1){
    180147                                // shift and divide the checksum
    181148                                seed = (seed >> 1) ^ ((uint32_t) CRC_DIVIDER_LE);
    182                         } else {
     149                        }else{
    183150                                // shift otherwise
    184151                                seed >>= 1;
     
    190157}
    191158
    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 {
     159uint16_t flip_checksum(uint16_t checksum){
    200160        // flip, zero is returned as 0xFFFF (not flipped)
    201         checksum = ~checksum;
     161        checksum = ~ checksum;
    202162        return checksum ? checksum : IP_CHECKSUM_ZERO;
    203163}
    204164
    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 {
     165uint16_t ip_checksum(uint8_t * data, size_t length){
    218166        // 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)));
    221168}
    222169
  • uspace/lib/net/generic/net_remote.c

    ra7a85d16 ref689ef0  
    2727 */
    2828
    29 /** @addtogroup libnet
    30  * @{
     29/** @addtogroup net
     30 *  @{
    3131 */
    3232
    3333/** @file
    34  * Networking interface implementation for remote modules.
    35  * @see net_interface.h
     34 *  Networking interface implementation for remote modules.
     35 *  @see net_interface.h
    3636 */
    3737
    3838#include <ipc/services.h>
    39 #include <ipc/net_net.h>
    4039
    4140#include <malloc.h>
     
    4645#include <net_interface.h>
    4746#include <adt/measured_strings.h>
     47#include <net_net_messages.h>
    4848
    49 /** Connects to the networking module.
    50  *
    51  * @returns             The networking module phone on success.
    52  */
    53 int net_connect_module(void)
     49int net_connect_module(services_t service)
    5450{
    5551        return connect_to_service(SERVICE_NETWORKING);
    5652}
    5753
    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)
     54void net_free_settings(measured_string_ref settings, char * data)
    6655{
    6756        if (settings)
    6857                free(settings);
     58
    6959        if (data)
    7060                free(data);
    7161}
    7262
    73 /** Returns the global configuration.
    74  *
    75  * The configuration names are read and the appropriate settings are set
    76  * instead. Call net_free_settings() function to release the returned
    77  * configuration.
    78  *
    79  * @param[in] net_phone The networking module phone.
    80  * @param[in,out] configuration The requested configuration. The names are read
    81  * 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 the
    89  *                      generic_translate_req() function.
    90  */
    9163int
    92 net_get_conf_req(int net_phone, measured_string_ref *configuration,
    93     size_t count, char **data)
     64net_get_conf_req(int net_phone, measured_string_ref * configuration,
     65    size_t count, char ** data)
    9466{
    9567        return generic_translate_req(net_phone, NET_NET_GET_DEVICE_CONF, 0, 0,
     
    9769}
    9870
    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 set
    103  * instead. Call net_free_settings() function to release the returned
    104  * 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 names
    109  *                      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 the
    116  *                      generic_translate_req() function.
    117  */
    11871int
    11972net_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)
    12174{
    12275        return generic_translate_req(net_phone, NET_NET_GET_DEVICE_CONF,
  • uspace/lib/net/generic/packet_client.c

    ra7a85d16 ref689ef0  
    2727 */
    2828
    29 /** @addtogroup libnet
    30  * @{
     29/** @addtogroup packet
     30 *  @{
    3131 */
    3232
    3333/** @file
    34  * Packet client implementation.
     34 *  Packet client implementation.
    3535 */
    3636
     
    3838#include <mem.h>
    3939#include <unistd.h>
     40
    4041#include <sys/mman.h>
    4142
    4243#include <packet_client.h>
    43 #include <packet_remote.h>
    4444
    4545#include <net/packet.h>
    4646#include <net/packet_header.h>
    4747
    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)
     48int packet_copy_data(packet_t packet, const void * data, size_t length)
    6049{
    6150        if (!packet_is_valid(packet))
     
    7261}
    7362
    74 /** Allocates the specified space right before the actual packet content and
    75  * 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 the
    79  *                      packet content.
    80  * @returns             The pointer to the allocated memory.
    81  * @returns             NULL if there is not enough memory left.
    82  */
    8363void *packet_prefix(packet_t packet, size_t length)
    8464{
     
    9373}
    9474
    95 /** Allocates the specified space right after the actual packet content and
    96  * 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 the
    100  *                       packet content.
    101  * @returns             The pointer to the allocated memory.
    102  * @returns             NULL if there is not enough memory left.
    103  */
    10475void *packet_suffix(packet_t packet, size_t length)
    10576{
     
    11384}
    11485
    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 of
    119  *                      the packet content.
    120  * @param[in] suffix    The suffix length to be removed from the end of the
    121  *                      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  */
    12686int packet_trim(packet_t packet, size_t prefix, size_t suffix)
    12787{
     
    13797}
    13898
    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  */
    14599packet_id_t packet_get_id(const packet_t packet)
    146100{
     
    148102}
    149103
    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)
     104int packet_get_addr(const packet_t packet, uint8_t ** src, uint8_t ** dest)
    160105{
    161106        if (!packet_is_valid(packet))
     
    171116}
    172117
    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  */
    179118size_t packet_get_data_length(const packet_t packet)
    180119{
     
    185124}
    186125
    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  */
    193126void *packet_get_data(const packet_t packet)
    194127{
     
    199132}
    200133
    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  */
    211134int
    212 packet_set_addr(packet_t packet, const uint8_t *src, const uint8_t *dest,
     135packet_set_addr(packet_t packet, const uint8_t * src, const uint8_t * dest,
    213136    size_t addr_len)
    214137{
     
    247170}
    248171
    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  */
    259172packet_t packet_get_copy(int phone, packet_t packet)
    260173{
  • uspace/lib/net/generic/packet_remote.c

    ra7a85d16 ref689ef0  
    2727 */
    2828
    29 /** @addtogroup libnet
    30  * @{
     29/** @addtogroup packet
     30 *  @{
    3131 */
    3232
    3333/** @file
    34  * Packet client interface implementation for remote modules.
    35  * @see packet_client.h
     34 *  Packet client interface implementation for remote modules.
     35 *  @see packet_client.h
    3636 */
    3737
     
    8686}
    8787
    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_SIZE
    99  *                      message.
    100  * @returns             Other error codes as defined for the packet_return()
    101  *                      function.
    102  */
    10388int packet_translate_remote(int phone, packet_ref packet, packet_id_t packet_id)
    10489{
     
    125110}
    126111
    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 in
    133  *                      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  */
    140112packet_t packet_get_4_remote(int phone, size_t max_content, size_t addr_len,
    141113    size_t max_prefix, size_t max_suffix)
     
    161133}
    162134
    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  */
    172135packet_t packet_get_1_remote(int phone, size_t content)
    173136{
     
    191154}
    192155
    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 are
    198  * received or obtained again.
    199  *
    200  * @param[in] phone     The packet server module phone.
    201  * @param[in] packet_id The packet identifier.
    202  */
    203156void pq_release_remote(int phone, packet_id_t packet_id)
    204157{
  • uspace/lib/net/generic/socket_core.c

    ra7a85d16 ref689ef0  
    2727 */
    2828
    29 /** @addtogroup libnet
    30  * @{
     29/** @addtogroup socket
     30 *  @{
    3131 */
    3232
    3333/** @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 */
    4036
    4137#include <net/socket_codes.h>
    4238#include <net/in.h>
    4339#include <net/inet.h>
    44 #include <net/packet.h>
    45 #include <net/modules.h>
    4640
    4741#include <stdint.h>
     
    5246#include <adt/dynamic_fifo.h>
    5347#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 */
     60struct socket_port{
     61        /** The bound sockets map.
     62         */
    6463        socket_port_map_t map;
    65         /** The bound sockets count. */
     64        /** The bound sockets count.
     65         */
    6666        int count;
    6767};
     
    7474
    7575/** 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 */
     84static 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)){
    9285        int packet_id;
    9386
    9487        // if bound
    95         if (socket->port) {
     88        if(socket->port){
    9689                // release the port
    9790                socket_port_release(global_sockets, socket);
    9891        }
    99        
    10092        // release all received packets
    101         while ((packet_id = dyn_fifo_pop(&socket->received)) >= 0)
     93        while((packet_id = dyn_fifo_pop(&socket->received)) >= 0){
    10294                pq_release_remote(packet_phone, packet_id);
    103 
     95        }
    10496        dyn_fifo_destroy(&socket->received);
    10597        dyn_fifo_destroy(&socket->accepted);
    106 
    107         if (socket_release)
     98        if(socket_release){
    10899                socket_release(socket);
    109 
     100        }
    110101        socket_cores_exclude(local_sockets, socket->socket_id);
    111102}
    112103
    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);
     104void 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        }
    151121}
    152122
    153123/** 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 */
     131static int socket_port_add_core(socket_port_ref socket_port, socket_core_ref socket, const char * key, size_t key_length){
    166132        ERROR_DECLARE;
    167133
    168         socket_core_ref *socket_ref;
     134        socket_core_ref * socket_ref;
    169135
    170136        // create a wrapper
    171137        socket_ref = malloc(sizeof(*socket_ref));
    172         if (!socket_ref)
     138        if(! socket_ref){
    173139                return ENOMEM;
    174 
     140        }
    175141        *socket_ref = socket;
    176142        // 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))){
    179144                free(socket_ref);
    180145                return ERROR_CODE;
    181146        }
    182        
    183         ++socket_port->count;
     147        ++ socket_port->count;
    184148        socket->key = key;
    185149        socket->key_length = key_length;
    186        
    187150        return EOK;
    188151}
    189152
    190153/** 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 */
     162static int socket_bind_insert(socket_ports_ref global_sockets, socket_core_ref socket, int port){
    206163        ERROR_DECLARE;
    207164
     
    210167        // create a wrapper
    211168        socket_port = malloc(sizeof(*socket_port));
    212         if (!socket_port)
     169        if(! socket_port){
    213170                return ENOMEM;
    214 
     171        }
    215172        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))){
    219175                socket_port_map_destroy(&socket_port->map);
    220176                free(socket_port);
    221177                return ERROR_CODE;
    222178        }
    223        
    224179        // register the incomming port
    225180        ERROR_CODE = socket_ports_add(global_sockets, port, socket_port);
    226         if (ERROR_CODE < 0) {
     181        if(ERROR_CODE < 0){
    227182                socket_port_map_destroy(&socket_port->map);
    228183                free(socket_port);
    229184                return ERROR_CODE;
    230185        }
    231        
    232186        socket->port = port;
    233187        return EOK;
    234188}
    235189
    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 {
     190int 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){
    262191        socket_core_ref socket;
    263192        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)){
    268197                return EINVAL;
    269 
     198        }
    270199        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;
    306229                // TODO IPv6
    307                 break;
    308         }
    309        
     230        }
    310231        return EAFNOSUPPORT;
    311232}
    312233
    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 {
     234int 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){
    331235        int index;
    332236
    333237        // from the last used one
    334238        index = last_used_port;
    335        
    336         do {
    337                 ++index;
    338                
     239        do{
     240                ++ index;
    339241                // til the range end
    340                 if (index >= free_ports_end) {
     242                if(index >= free_ports_end){
    341243                        // start from the range beginning
    342244                        index = free_ports_start - 1;
    343                         do {
    344                                 ++index;
     245                        do{
     246                                ++ index;
    345247                                // til the last used one
    346                                 if (index >= last_used_port) {
     248                                if(index >= last_used_port){
    347249                                        // none found
    348250                                        return ENOTCONN;
    349251                                }
    350                         } while (socket_ports_find(global_sockets, index));
    351                        
     252                        }while(socket_ports_find(global_sockets, index) != NULL);
    352253                        // found, break immediately
    353254                        break;
    354255                }
    355                
    356         } while (socket_ports_find(global_sockets, index));
    357        
     256        }while(socket_ports_find(global_sockets, index) != NULL);
    358257        return socket_bind_insert(global_sockets, socket, index);
    359258}
    360259
    361260/** 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 */
     266static int socket_generate_new_id(socket_cores_ref local_sockets, int positive){
    372267        int socket_id;
    373268        int count;
     
    375270        count = 0;
    376271//      socket_id = socket_globals.last_id;
    377         do {
    378                 if (count < SOCKET_ID_TRIES) {
     272        do{
     273                if(count < SOCKET_ID_TRIES){
    379274                        socket_id = rand() % INT_MAX;
    380                         ++count;
    381                 } else if (count == SOCKET_ID_TRIES) {
     275                        ++ count;
     276                }else if(count == SOCKET_ID_TRIES){
    382277                        socket_id = 1;
    383                         ++count;
     278                        ++ count;
    384279                // only this branch for last_id
    385                 } else {
    386                         if (socket_id < INT_MAX) {
     280                }else{
     281                        if(socket_id < INT_MAX){
    387282                                ++ socket_id;
    388 /*                      } else if(socket_globals.last_id) {
     283/*                      }else if(socket_globals.last_id){
    389284*                               socket_globals.last_id = 0;
    390285*                               socket_id = 1;
    391 */                      } else {
     286*/                      }else{
    392287                                return ELIMIT;
    393288                        }
    394289                }
    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)));
    398291//      last_id = socket_id
    399292        return socket_id;
    400293}
    401294
    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 {
     295int socket_create(socket_cores_ref local_sockets, int app_phone, void * specific_data, int * socket_id){
    418296        ERROR_DECLARE;
    419297
     
    422300        int positive;
    423301
    424         if (!socket_id)
     302        if(! socket_id){
    425303                return EINVAL;
    426        
     304        }
    427305        // store the socket
    428         if (*socket_id <= 0) {
     306        if(*socket_id <= 0){
    429307                positive = (*socket_id == 0);
    430308                *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){
    434313                        *socket_id *= -1;
    435         } else if(socket_cores_find(local_sockets, *socket_id)) {
     314                }
     315        }else if(socket_cores_find(local_sockets, * socket_id)){
    436316                return EEXIST;
    437317        }
    438        
    439318        socket = (socket_core_ref) malloc(sizeof(*socket));
    440         if (!socket)
     319        if(! socket){
    441320                return ENOMEM;
    442        
     321        }
    443322        // initialize
    444323        socket->phone = app_phone;
     
    447326        socket->key_length = 0;
    448327        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))){
    451329                free(socket);
    452330                return ERROR_CODE;
    453331        }
    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))){
    456333                dyn_fifo_destroy(&socket->received);
    457334                free(socket);
    458335                return ERROR_CODE;
    459336        }
    460         socket->socket_id = *socket_id;
     337        socket->socket_id = * socket_id;
    461338        res = socket_cores_add(local_sockets, socket->socket_id, socket);
    462         if (res < 0) {
     339        if(res < 0){
    463340                dyn_fifo_destroy(&socket->received);
    464341                dyn_fifo_destroy(&socket->accepted);
     
    466343                return res;
    467344        }
    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
     348int 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)){
    491349        socket_core_ref socket;
    492350        int accepted_id;
     
    494352        // find the socket
    495353        socket = socket_cores_find(local_sockets, socket_id);
    496         if (!socket)
     354        if(! socket){
    497355                return ENOTSOCK;
    498        
     356        }
    499357        // 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
     365int socket_reply_packets(packet_t packet, size_t * length){
    525366        ERROR_DECLARE;
    526367
    527368        packet_t next_packet;
    528369        size_t fragments;
    529         size_t *lengths;
     370        size_t * lengths;
    530371        size_t index;
    531372
    532         if (!length)
     373        if(! length){
    533374                return EBADMEM;
    534 
     375        }
    535376        next_packet = pq_next(packet);
    536         if (!next_packet) {
     377        if(! next_packet){
    537378                // 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)));
    540380                // store the total length
    541381                *length = packet_get_data_length(packet);
    542         } else {
     382        }else{
    543383                // count the packet fragments
    544384                fragments = 1;
    545385                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                }
    549389                // 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){
    553392                        return ENOMEM;
    554                
     393                }
    555394                lengths[0] = packet_get_data_length(packet);
    556395                lengths[fragments] = lengths[0];
    557396                next_packet = pq_next(packet);
    558                
    559                 for (index = 1; index < fragments; ++index) {
     397                for(index = 1; index < fragments; ++ index){
    560398                        lengths[index] = packet_get_data_length(next_packet);
    561399                        lengths[fragments] += lengths[index];
    562400                        next_packet = pq_next(packet);
    563                 }
    564                
     401                }while(next_packet);
    565402                // 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)));
    571404                next_packet = packet;
    572                
    573405                // 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]));
    581408                        next_packet = pq_next(next_packet);
    582                 }
    583                
     409                }while(next_packet);
    584410                // store the total length
    585411                *length = lengths[fragments];
    586412                free(lengths);
    587413        }
    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
     417socket_core_ref socket_port_find(socket_ports_ref global_sockets, int port, const char * key, size_t key_length){
    605418        socket_port_ref socket_port;
    606         socket_core_ref *socket_ref;
     419        socket_core_ref * socket_ref;
    607420
    608421        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        }
    616428        return NULL;
    617429}
    618430
    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 {
     431void socket_port_release(socket_ports_ref global_sockets, socket_core_ref socket){
    630432        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
     461int socket_port_add(socket_ports_ref global_sockets, int port, socket_core_ref socket, const char * key, size_t key_length){
    682462        ERROR_DECLARE;
    683463
     
    686466        // find ports
    687467        socket_port = socket_ports_find(global_sockets, port);
    688         if (!socket_port)
     468        if(! socket_port){
    689469                return ENOENT;
    690        
     470        }
    691471        // 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));
    695473        socket->port = port;
    696474        return EOK;
  • uspace/lib/net/il/arp_remote.c

    ra7a85d16 ref689ef0  
    2727 */
    2828
    29 /** @addtogroup libnet
    30  * @{
     29/** @addtogroup arp
     30 *  @{
    3131 */
    3232
    3333/** @file
    34  * ARP interface implementation for remote modules.
    35  * @see arp_interface.h
     34 *  ARP interface implementation for remote modules.
     35 *  @see arp_interface.h
    3636 */
    3737
    3838#include <arp_interface.h>
     39#include <arp_messages.h>
    3940#include <generic.h>
    4041
     
    4344#include <ipc/ipc.h>
    4445#include <ipc/services.h>
    45 #include <ipc/arp.h>
    4646
    4747#include <net/modules.h>
     
    4949#include <adt/measured_strings.h>
    5050
    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)
     51int arp_connect_module(services_t service){
     52        if(service != SERVICE_ARP){
    5953                return EINVAL;
    60 
     54        }
    6155        return connect_to_service(SERVICE_ARP);
    6256}
    6357
    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 {
     58int arp_clean_cache_req(int arp_phone){
    7159        return (int) async_req_0_0(arp_phone, NET_ARP_CLEAN_CACHE);
    7260}
    7361
    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 {
     62int arp_clear_address_req(int arp_phone, device_id_t device_id, services_t protocol, measured_string_ref address){
    8763        aid_t message_id;
    8864        ipcarg_t result;
    8965
    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);
    9267        measured_strings_send(arp_phone, address, 1);
    9368        async_wait_for(message_id, &result);
    94 
    9569        return (int) result;
    9670}
    9771
    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);
     72int 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);
    10974}
    11075
    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 {
     76int arp_device_req(int arp_phone, device_id_t device_id, services_t protocol, services_t netif, measured_string_ref address){
    13777        aid_t message_id;
    13878        ipcarg_t result;
    13979
    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);
    14281        measured_strings_send(arp_phone, address, 1);
    14382        async_wait_for(message_id, &result);
    144 
    14583        return (int) result;
    14684}
    14785
    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);
     86task_id_t arp_task_get_id(void){
     87        return 0;
     88}
     89
     90int 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);
    17192}
    17293
  • uspace/lib/net/il/ip_client.c

    ra7a85d16 ref689ef0  
    2727 */
    2828
    29 /** @addtogroup libnet
    30  * @{
     29/** @addtogroup ip
     30 *  @{
    3131 */
    3232
    3333/** @file
    34  * IP client interface implementation.
    35  * @see ip_client.h
     34 *  IP client interface implementation.
     35 *  @see ip_client.h
    3636 */
    3737
     
    4545#include <net/packet.h>
    4646
    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 {
     47size_t ip_client_header_length(packet_t packet){
    5548        ip_header_ref header;
    5649
    5750        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))){
    5953                return 0;
    60 
     54        }
    6155        return IP_HEADER_LENGTH(header);
    6256}
    6357
    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 {
     58int 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){
    9359        ipv4_pseudo_header_ref header_in;
    94         struct sockaddr_in *address_in;
     60        struct sockaddr_in * address_in;
    9561
    96         if (!header || !headerlen)
     62        if(!(header && headerlen)){
    9763                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))){
    10266                return EINVAL;
    10367        }
    10468
    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;
    13697        }
    13798}
    13899
    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 {
     100int 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){
    157101        ip_header_ref header;
    158         uint8_t *data;
     102        uint8_t * data;
    159103        size_t padding;
    160104
     
    162106        // multiple of 4 bytes
    163107        padding =  ipopt_length % 4;
    164         if (padding) {
     108        if(padding){
    165109                padding = 4 - padding;
    166110                ipopt_length += padding;
     
    169113        // prefix the header
    170114        data = (uint8_t *) packet_prefix(packet, sizeof(ip_header_t) + padding);
    171         if (!data)
     115        if(! data){
    172116                return ENOMEM;
     117        }
    173118
    174119        // add the padding
    175         while (padding--)
     120        while(padding --){
    176121                data[sizeof(ip_header_t) + padding] = IPOPT_NOOP;
     122        }
    177123
    178124        // set the header
    179125        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;
    183128        header->tos = tos;
    184129        header->protocol = protocol;
    185130
    186         if (dont_fragment)
     131        if(dont_fragment){
    187132                header->flags = IPFLAG_DONT_FRAGMENT;
    188 
     133        }
    189134        return EOK;
    190135}
    191136
    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 {
     137int 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){
    213138        ip_header_ref header;
    214139
    215140        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))){
    217143                return ENOMEM;
     144        }
    218145
    219         if (protocol)
     146        if(protocol){
    220147                *protocol = header->protocol;
    221         if (ttl)
     148        }
     149        if(ttl){
    222150                *ttl = header->ttl;
    223         if (tos)
     151        }
     152        if(tos){
    224153                *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){
    228159                *ipopt_length = IP_HEADER_LENGTH(header) - sizeof(ip_header_t);
    229160                return sizeof(ip_header_t);
    230         } else {
     161        }else{
    231162                return IP_HEADER_LENGTH(header);
    232163        }
    233164}
    234165
    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 {
     166int ip_client_set_pseudo_header_data_length(void *header, size_t headerlen, size_t data_length){
    249167        ipv4_pseudo_header_ref header_in;
    250168
    251         if (!header)
     169        if(! header){
    252170                return EBADMEM;
     171        }
    253172
    254         if (headerlen == sizeof(ipv4_pseudo_header_t)) {
     173        if(headerlen == sizeof(ipv4_pseudo_header_t)){
    255174                header_in = (ipv4_pseudo_header_ref) header;
    256175                header_in->data_length = htons(data_length);
    257176                return EOK;
    258177        // TODO IPv6
    259         } else {
     178        }else{
    260179                return EINVAL;
    261180        }
  • uspace/lib/net/il/ip_remote.c

    ra7a85d16 ref689ef0  
    4242#include <ip_remote.h>
    4343#include <ip_interface.h>
     44#include <ip_messages.h>
     45#include <il_messages.h>
    4446#include <packet_client.h>
    4547#include <generic.h>
    4648
    4749#include <ipc/services.h>
    48 #include <ipc/il.h>
    49 #include <ipc/ip.h>
    5050
    5151#include <net/modules.h>
  • uspace/lib/net/include/adt/module_map.h

    ra7a85d16 ref689ef0  
    2727 */
    2828
    29 /** @addtogroup libnet
    30  * @{
     29/** @addtogroup net
     30 *  @{
    3131 */
    3232
    3333/** @file
    34  * Character string to module map.
     34 *  Character string to module map.
    3535 */
    3636
    37 #ifndef LIBNET_MODULES_MAP_H_
    38 #define LIBNET_MODULES_MAP_H_
     37#ifndef __NET_MODULES_MAP_H__
     38#define __NET_MODULES_MAP_H__
    3939
    4040#include <task.h>
     41
    4142#include <ipc/services.h>
     43
    4244#include <net/modules.h>
     45
    4346#include <adt/generic_char_map.h>
    4447
    4548/** Type definition of the module structure.
    46  * @see module_struct
     49 *  @see module_struct
    4750 */
    48 typedef struct module_struct module_t;
     51typedef struct module_struct    module_t;
    4952
    5053/** Type definition of the module structure pointer.
    51  * @see module_struct
     54 *  @see module_struct
    5255 */
    53 typedef module_t *module_ref;
     56typedef module_t *                              module_ref;
    5457
    5558/** Module map.
    56  * Sorted by module names.
    57  * @see generic_char_map.h
     59 *  Sorted by module names.
     60 *  @see generic_char_map.h
    5861 */
    5962GENERIC_CHAR_MAP_DECLARE(modules, module_t)
    6063
    61 /** Module structure. */
    62 struct module_struct {
    63         /** Module task identifier if running. */
     64/** Module structure.
     65 */
     66struct  module_struct{
     67        /** Module task identifier if running.
     68         */
    6469        task_id_t task_id;
    65         /** Module service identifier. */
     70        /** Module service identifier.
     71         */
    6672        services_t service;
    67         /** Module phone if running and connected. */
     73        /** Module phone if running and connected.
     74         */
    6875        int phone;
    69         /** Usage counter. */
     76        /** Usage counter.
     77         */
    7078        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;
    7788};
    7889
    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 */
     101int 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 */
     111module_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 */
     118task_id_t spawn(const char * fname);
    83119
    84120#endif
  • uspace/lib/net/include/arp_interface.h

    ra7a85d16 ref689ef0  
    2727 */
    2828
    29 /** @addtogroup libnet
    30  * @{
     29/** @addtogroup arp
     30 *  @{
    3131 */
    3232
    33 #ifndef LIBNET_ARP_INTERFACE_H_
    34 #define LIBNET_ARP_INTERFACE_H_
     33#ifndef __NET_ARP_INTERFACE_H__
     34#define __NET_ARP_INTERFACE_H__
    3535
    3636#include <adt/measured_strings.h>
     
    4343
    4444/** @name ARP module interface
    45  * This interface is used by other modules.
     45 *  This interface is used by other modules.
    4646 */
    4747/*@{*/
    4848
    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 */
     66extern 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 */
     82extern 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 */
     90extern 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 */
     100extern 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 */
     106extern 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 */
     112extern int arp_connect_module(services_t service);
     113
     114/** Returns the ARP task identifier.
     115 *  @returns 0 if called by the remote module.
     116 */
     117extern task_id_t arp_task_get_id(void);
    58118
    59119/*@}*/
  • uspace/lib/net/include/generic.h

    ra7a85d16 ref689ef0  
    2727 */
    2828
    29 /** @addtogroup libnet
     29/** @addtogroup net
    3030 * @{
    3131 */
     
    3535 */
    3636
    37 #ifndef LIBNET_GENERIC_H_
    38 #define LIBNET_GENERIC_H_
     37#ifndef NET_GENERIC_H_
     38#define NET_GENERIC_H_
    3939
    4040#include <async.h>
  • uspace/lib/net/include/il_interface.h

    ra7a85d16 ref689ef0  
    4242
    4343#include <ipc/services.h>
    44 #include <ipc/il.h>
    4544
    4645#include <net/device.h>
    4746#include <net/packet.h>
     47#include <il_messages.h>
    4848
    4949#include <packet_client.h>
  • uspace/lib/net/include/ip_client.h

    ra7a85d16 ref689ef0  
    2727 */
    2828
    29 /** @addtogroup libnet
    30  * @{
     29/** @addtogroup ip
     30 *  @{
    3131 */
    3232
    3333/** @file
    34  * IP client interface.
     34 *  IP client interface.
    3535 */
    3636
    37 #ifndef LIBNET_IP_CLIENT_H_
    38 #define LIBNET_IP_CLIENT_H_
     37#ifndef __NET_IP_CLIENT_H__
     38#define __NET_IP_CLIENT_H__
    3939
    4040#include <net/socket_codes.h>
     
    4545#include <ip_interface.h>
    4646
    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 */
     58extern 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 */
     72extern 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 */
     79extern 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 */
     89extern 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 */
     109extern 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);
    55110
    56111// TODO ipopt manipulation
  • uspace/lib/net/include/net_checksum.h

    ra7a85d16 ref689ef0  
    2727 */
    2828
    29 /** @addtogroup libnet
    30  * @{
     29/** @addtogroup net
     30 *  @{
    3131 */
    3232
    3333/** @file
    34  * General CRC and checksum computation.
     34 *  General CRC and checksum computation.
    3535 */
    3636
    37 #ifndef LIBNET_CHECKSUM_H_
    38 #define LIBNET_CHECKSUM_H_
     37#ifndef __NET_CHECKSUM_H__
     38#define __NET_CHECKSUM_H__
    3939
    4040#include <byteorder.h>
     41
    4142#include <sys/types.h>
    4243
    4344/** IP checksum value for computed zero checksum.
    44  * Zero is returned as 0xFFFF (not flipped)
     45 *  Zero is returned as 0xFFFF (not flipped)
    4546 */
    46 #define IP_CHECKSUM_ZERO        0xffffU
     47#define IP_CHECKSUM_ZERO                        0xFFFFu
    4748
     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 */
    4855#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)
    5157#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)
    5459#endif
    5560
    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 */
     67extern 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 */
     75extern 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 */
     84extern 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 */
     90extern 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 */
     97extern 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 */
     108extern uint16_t ip_checksum(uint8_t * data, size_t length);
    62109
    63110#endif
  • uspace/lib/net/include/net_interface.h

    ra7a85d16 ref689ef0  
    2727 */
    2828
    29 /** @addtogroup libnet
     29/** @addtogroup net
    3030 *  @{
    3131 */
    3232
    33 #ifndef LIBNET_NET_INTERFACE_H_
    34 #define LIBNET_NET_INTERFACE_H_
     33#ifndef __NET_NET_INTERFACE_H__
     34#define __NET_NET_INTERFACE_H__
    3535
    3636#include <ipc/services.h>
     
    4040
    4141/** @name Networking module interface
    42  * This interface is used by other modules.
     42 *  This interface is used by other modules.
    4343 */
    4444/*@{*/
    4545
    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 */
     60extern 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 */
     74extern 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 */
     82extern 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 */
     88extern int net_connect_module(services_t service);
    5189
    5290/*@}*/
  • uspace/lib/net/include/nil_interface.h

    ra7a85d16 ref689ef0  
    3838
    3939#include <ipc/ipc.h>
    40 #include <ipc/nil.h>
    4140
    4241#include <generic.h>
     42#include <nil_messages.h>
    4343#include <nil_remote.h>
    4444
  • uspace/lib/net/include/packet_client.h

    ra7a85d16 ref689ef0  
    2727 */
    2828
    29 /** @addtogroup libnet
     29/** @addtogroup packet
    3030 *  @{
    3131 */
    3232
    3333/** @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 -&nbsp;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__
    4946
    5047#include <net/packet.h>
    5148
    52 /** @name Packet client interface */
     49/** @name Packet client interface
     50 */
    5351/*@{*/
    5452
    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))
    8472
    8573/** 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 */
     90extern 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 */
     98extern 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 */
     108extern 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 */
     119extern 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 */
     126extern 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 */
     133extern 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 */
     140extern 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 */
     150extern 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 */
     161extern 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 */
     174extern 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 */
     186extern 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 */
     195extern 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 */
     204extern 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 */
    110214extern packet_t packet_get_copy(int phone, packet_t packet);
    111215
  • uspace/lib/net/include/packet_remote.h

    ra7a85d16 ref689ef0  
    2727 */
    2828
    29 /** @addtogroup libnet
     29/** @addtogroup packet
    3030 * @{
    3131 */
    3232
    33 #ifndef LIBNET_PACKET_REMOTE_H_
    34 #define LIBNET_PACKET_REMOTE_H_
     33#ifndef __NET_PACKET_REMOTE_H__
     34#define __NET_PACKET_REMOTE_H__
    3535
    3636#include <net/packet.h>
    37 #include <sys/types.h>
    3837
    3938extern int packet_translate_remote(int, packet_ref, packet_id_t);
  • uspace/lib/net/include/socket_core.h

    ra7a85d16 ref689ef0  
    2727 */
    2828
    29 /** @addtogroup libnet
     29/** @addtogroup socket
    3030 *  @{
    3131 */
    3232
    3333/** @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__
    3939
    4040#include <sys/types.h>
     41
     42#include <net/in.h>
     43#include <net/device.h>
    4144#include <adt/generic_char_map.h>
    4245#include <adt/dynamic_fifo.h>
    4346#include <adt/int_map.h>
    44 #include <net/in.h>
    45 #include <net/device.h>
    4647#include <net/packet.h>
    4748
    48 /** Initial size of the received packet queue. */
     49/** Initial size of the received packet queue.
     50 */
    4951#define SOCKET_INITIAL_RECEIVED_SIZE    4
    5052
    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 */
    5559#define SOCKET_INITIAL_ACCEPTED_SIZE    1
    5660
    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 */
    6167#define SOCKET_MAP_KEY_LISTENING        "L"
    6268
    6369/** Type definition of the socket core.
    64  * @see socket_core
    65  */
    66 typedef struct socket_core socket_core_t;
     70 *  @see socket_core
     71 */
     72typedef struct socket_core      socket_core_t;
    6773
    6874/** Type definition of the socket core pointer.
    69  * @see socket_core
    70  */
    71 typedef socket_core_t *socket_core_ref;
     75 *  @see socket_core
     76 */
     77typedef socket_core_t * socket_core_ref;
    7278
    7379/** Type definition of the socket port.
    74  * @see socket_port
    75  */
    76 typedef struct socket_port socket_port_t;
     80 *  @see socket_port
     81 */
     82typedef struct socket_port      socket_port_t;
    7783
    7884/** 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 */
     87typedef socket_port_t * socket_port_ref;
     88
     89/** Socket core.
     90 */
     91struct socket_core{
     92        /** Socket identifier.
     93         */
    8694        int socket_id;
    87         /** Client application phone. */
     95        /** Client application phone.
     96         */
    8897        int phone;
    89         /** Bound port. */
     98        /** Bound port.
     99         */
    90100        int port;
    91         /** Received packets queue. */
     101        /** Received packets queue.
     102         */
    92103        dyn_fifo_t received;
    93         /** Sockets for acceptance queue. */
     104        /** Sockets for acceptance queue.
     105         */
    94106        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         */
    100115        size_t key_length;
    101116};
    102117
    103118/** Sockets map.
    104  * The key is the socket identifier.
     119 *  The key is the socket identifier.
    105120 */
    106121INT_MAP_DECLARE(socket_cores, socket_core_t);
    107122
    108123/** 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.
    112125 */
    113126GENERIC_CHAR_MAP_DECLARE(socket_port_map, socket_core_ref);
    114127
    115128/** Ports map.
    116  * The key is the port number.
     129 *  The key is the port number.
    117130 */
    118131INT_MAP_DECLARE(socket_ports, socket_port_t);
    119132
    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 */
     140extern 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 */
     159extern 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 */
     172extern 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 */
     183extern 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 */
     196extern 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 */
     207extern 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 */
     217extern 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 */
     225extern 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 */
     237extern int socket_port_add(socket_ports_ref global_sockets, int port, socket_core_ref socket, const char * key, size_t key_length);
    135238
    136239#endif
  • uspace/lib/net/include/tl_interface.h

    ra7a85d16 ref689ef0  
    4040#include <async.h>
    4141#include <ipc/services.h>
    42 #include <ipc/tl.h>
    4342
    4443#include <generic.h>
     
    4645#include <net/packet.h>
    4746#include <packet_client.h>
     47#include <tl_messages.h>
    4848
    4949/** @name Transport layer module interface
  • uspace/lib/net/netif/netif_local.c

    ra7a85d16 ref689ef0  
    4242#include <ipc/ipc.h>
    4343#include <ipc/services.h>
    44 #include <ipc/netif.h>
    4544#include <err.h>
    4645
     
    5453#include <nil_interface.h>
    5554#include <netif_local.h>
     55#include <netif_messages.h>
    5656#include <netif_interface.h>
    5757
  • uspace/lib/net/netif/netif_remote.c

    ra7a85d16 ref689ef0  
    3636
    3737#include <ipc/services.h>
    38 #include <ipc/netif.h>
    3938
    4039#include <net/modules.h>
     
    4443#include <net/device.h>
    4544#include <netif_remote.h>
     45#include <netif_messages.h>
    4646#include <generic.h>
    4747
  • uspace/lib/net/nil/nil_remote.c

    ra7a85d16 ref689ef0  
    3838#include <nil_remote.h>
    3939#include <nil_interface.h>
     40#include <nil_messages.h>
    4041#include <generic.h>
    4142#include <net/device.h>
    4243#include <net/packet.h>
    4344#include <packet_client.h>
    44 
    45 #include <ipc/nil.h>
    4645
    4746/** Notify the network interface layer about the device state change.
  • uspace/srv/net/il/arp/arp.c

    ra7a85d16 ref689ef0  
    4646#include <ipc/services.h>
    4747#include <ipc/net.h>
    48 #include <ipc/arp.h>
    49 #include <ipc/il.h>
    5048#include <byteorder.h>
    5149#include <err.h>
     
    6058#include <packet_client.h>
    6159#include <packet_remote.h>
     60#include <il_messages.h>
    6261#include <il_interface.h>
    6362#include <il_local.h>
     63#include <arp_messages.h>
    6464
    6565#include "arp.h"
     
    534534        }
    535535        return EOK;
     536}
     537
     538task_id_t arp_task_get_id(void){
     539        return task_get_id();
    536540}
    537541
  • uspace/srv/net/il/arp/arp_module.c

    ra7a85d16 ref689ef0  
    8080       
    8181        async_set_client_connection(client_connection);
    82         arp_globals.net_phone = net_connect_module();
     82        arp_globals.net_phone = net_connect_module(SERVICE_NETWORKING);
    8383        ERROR_PROPAGATE(pm_init());
    8484       
  • uspace/srv/net/il/ip/ip.c

    ra7a85d16 ref689ef0  
    4545#include <ipc/services.h>
    4646#include <ipc/net.h>
    47 #include <ipc/nil.h>
    48 #include <ipc/il.h>
    49 #include <ipc/ip.h>
    5047#include <sys/types.h>
    5148#include <byteorder.h>
     
    7471#include <packet_client.h>
    7572#include <packet_remote.h>
     73#include <nil_messages.h>
     74#include <il_messages.h>
    7675#include <il_local.h>
     76#include <ip_local.h>
    7777
    7878#include "ip.h"
    7979#include "ip_header.h"
     80#include "ip_messages.h"
    8081#include "ip_module.h"
    81 #include "ip_local.h"
    8282
    8383/** IP module name.
     
    423423        ip_globals.client_connection = client_connection;
    424424        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));
    426426        fibril_rwlock_write_unlock(&ip_globals.lock);
    427427        return EOK;
  • uspace/srv/net/il/ip/ip_module.c

    ra7a85d16 ref689ef0  
    7979       
    8080        async_set_client_connection(client_connection);
    81         ip_globals.net_phone = net_connect_module();
     81        ip_globals.net_phone = net_connect_module(SERVICE_NETWORKING);
    8282        ERROR_PROPAGATE(pm_init());
    8383       
  • uspace/srv/net/net/net.c

    ra7a85d16 ref689ef0  
    4646
    4747#include <ipc/ipc.h>
     48#include <ipc/net.h>
    4849#include <ipc/services.h>
    49 #include <ipc/net.h>
    50 #include <ipc/net_net.h>
    51 #include <ipc/il.h>
    5250
    5351#include <net/modules.h>
     
    5755#include <adt/module_map.h>
    5856#include <net/packet.h>
     57#include <il_messages.h>
    5958#include <netif_remote.h>
    6059#include <net/device.h>
     
    6261#include <net_interface.h>
    6362#include <ip_interface.h>
     63#include <net_net_messages.h>
    6464
    6565#include "net.h"
  • uspace/srv/net/netif/lo/lo.c

    ra7a85d16 ref689ef0  
    4343#include <ipc/ipc.h>
    4444#include <ipc/services.h>
    45 #include <ipc/nil.h>
    4645
    4746#include <net/modules.h>
     
    5049#include <net/device.h>
    5150#include <nil_interface.h>
     51#include <nil_messages.h>
    5252#include <netif_interface.h>
    5353#include <netif_local.h>
  • uspace/srv/net/netstart/netstart.c

    ra7a85d16 ref689ef0  
    4848#include <ipc/ipc.h>
    4949#include <ipc/services.h>
    50 #include <ipc/net_net.h>
    5150
    5251#include <net/modules.h>
     52#include <net_net_messages.h>
    5353
    5454#include "self_test.h"
  • uspace/srv/net/nil/eth/eth_module.c

    ra7a85d16 ref689ef0  
    6363       
    6464        async_set_client_connection(client_connection);
    65         int net_phone = net_connect_module();
     65        int net_phone = net_connect_module(SERVICE_NETWORKING);
    6666        ERROR_PROPAGATE(pm_init());
    6767       
  • uspace/srv/net/nil/nildummy/nildummy_module.c

    ra7a85d16 ref689ef0  
    7171       
    7272        async_set_client_connection(client_connection);
    73         int net_phone = net_connect_module();
     73        int net_phone = net_connect_module(SERVICE_NETWORKING);
    7474        ERROR_PROPAGATE(pm_init());
    7575       
  • uspace/srv/net/tl/icmp/icmp.c

    ra7a85d16 ref689ef0  
    4545#include <ipc/services.h>
    4646#include <ipc/net.h>
    47 #include <ipc/tl.h>
    4847#include <ipc/icmp.h>
    4948#include <sys/time.h>
     
    7069#include <ip_interface.h>
    7170#include <net_interface.h>
     71#include <tl_messages.h>
    7272#include <tl_interface.h>
    7373#include <tl_local.h>
  • uspace/srv/net/tl/icmp/icmp_module.c

    ra7a85d16 ref689ef0  
    6969
    7070        async_set_client_connection(client_connection);
    71         icmp_globals.net_phone = net_connect_module();
     71        icmp_globals.net_phone = net_connect_module(SERVICE_NETWORKING);
    7272        if(icmp_globals.net_phone < 0){
    7373                return icmp_globals.net_phone;
  • uspace/srv/net/tl/tcp/tcp.c

    ra7a85d16 ref689ef0  
    4848#include <ipc/services.h>
    4949#include <ipc/net.h>
    50 #include <ipc/tl.h>
    5150#include <ipc/socket.h>
    5251
     
    6968#include <socket_core.h>
    7069#include <tl_common.h>
     70#include <tl_messages.h>
    7171#include <tl_local.h>
    7272#include <tl_interface.h>
  • uspace/srv/net/tl/tcp/tcp_module.c

    ra7a85d16 ref689ef0  
    7171       
    7272        async_set_client_connection(client_connection);
    73         tcp_globals.net_phone = net_connect_module();
     73        tcp_globals.net_phone = net_connect_module(SERVICE_NETWORKING);
    7474        ERROR_PROPAGATE(pm_init());
    7575       
  • uspace/srv/net/tl/udp/udp.c

    ra7a85d16 ref689ef0  
    4343#include <ipc/services.h>
    4444#include <ipc/net.h>
    45 #include <ipc/tl.h>
    4645#include <ipc/socket.h>
    4746#include <errno.h>
     
    6867#include <tl_local.h>
    6968#include <tl_interface.h>
     69#include <tl_messages.h>
    7070
    7171#include "udp.h"
  • uspace/srv/net/tl/udp/udp_module.c

    ra7a85d16 ref689ef0  
    6969
    7070        async_set_client_connection(client_connection);
    71         udp_globals.net_phone = net_connect_module();
     71        udp_globals.net_phone = net_connect_module(SERVICE_NETWORKING);
    7272        if(udp_globals.net_phone < 0){
    7373                return udp_globals.net_phone;
Note: See TracChangeset for help on using the changeset viewer.