Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/net/il/ip/ip.c

    rccca251 r00d7e1b  
    120120GENERIC_FIELD_IMPLEMENT(ip_routes, ip_route_t);
    121121
    122 static void ip_receiver(ipc_callid_t, ipc_call_t *);
    123 
    124 /** Releases the packet and returns the result.
    125  *
    126  * @param[in] packet    The packet queue to be released.
    127  * @param[in] result    The result to be returned.
    128  * @return              The result parameter.
     122static void ip_receiver(ipc_callid_t, ipc_call_t *, void *);
     123
     124/** Release the packet and returns the result.
     125 *
     126 * @param[in] packet Packet queue to be released.
     127 * @param[in] result Result to be returned.
     128 *
     129 * @return Result parameter.
     130 *
    129131 */
    130132static int ip_release_and_return(packet_t *packet, int result)
    131133{
    132         pq_release_remote(ip_globals.net_phone, packet_get_id(packet));
     134        pq_release_remote(ip_globals.net_sess, packet_get_id(packet));
    133135        return result;
    134136}
    135137
    136 /** Returns the ICMP phone.
    137  *
    138  * Searches the registered protocols.
    139  *
    140  * @return              The found ICMP phone.
    141  * @return              ENOENT if the ICMP is not registered.
    142  */
    143 static int ip_get_icmp_phone(void)
    144 {
    145         ip_proto_t *proto;
    146         int phone;
    147 
     138/** Return the ICMP session.
     139 *
     140 * Search the registered protocols.
     141 *
     142 * @return Found ICMP session.
     143 * @return NULL if the ICMP is not registered.
     144 *
     145 */
     146static async_sess_t *ip_get_icmp_session(void)
     147{
    148148        fibril_rwlock_read_lock(&ip_globals.protos_lock);
    149         proto = ip_protos_find(&ip_globals.protos, IPPROTO_ICMP);
    150         phone = proto ? proto->phone : ENOENT;
     149        ip_proto_t *proto = ip_protos_find(&ip_globals.protos, IPPROTO_ICMP);
     150        async_sess_t *sess = proto ? proto->sess : NULL;
    151151        fibril_rwlock_read_unlock(&ip_globals.protos_lock);
    152         return phone;
     152       
     153        return sess;
    153154}
    154155
     
    179180        next = pq_detach(packet);
    180181        if (next)
    181                 pq_release_remote(ip_globals.net_phone, packet_get_id(next));
     182                pq_release_remote(ip_globals.net_sess, packet_get_id(next));
    182183
    183184        if (!header) {
     
    201202
    202203        /* Set the destination address */
    203         switch (header->version) {
     204        switch (GET_IP_HEADER_VERSION(header)) {
    204205        case IPVERSION:
    205206                addrlen = sizeof(dest_in);
     
    218219}
    219220
    220 /** Prepares the ICMP notification packet.
    221  *
    222  * Releases additional packets and keeps only the first one.
     221/** Prepare the ICMP notification packet.
     222 *
     223 * Release additional packets and keep only the first one.
    223224 * All packets are released on error.
    224225 *
    225  * @param[in] error     The packet error service.
    226  * @param[in] packet    The packet or the packet queue to be reported as faulty.
    227  * @param[in] header    The first packet IP header. May be NULL.
    228  * @return              The found ICMP phone.
    229  * @return              EINVAL if the error parameter is set.
    230  * @return              EINVAL if the ICMP phone is not found.
    231  * @return              EINVAL if the ip_prepare_icmp() fails.
    232  */
    233 static int
    234 ip_prepare_icmp_and_get_phone(services_t error, packet_t *packet,
    235     ip_header_t *header)
    236 {
    237         int phone;
    238 
    239         phone = ip_get_icmp_phone();
    240         if (error || (phone < 0) || ip_prepare_icmp(packet, header))
    241                 return ip_release_and_return(packet, EINVAL);
    242         return phone;
    243 }
    244 
    245 int il_initialize(int net_phone)
     226 * @param[in] error  Packet error service.
     227 * @param[in] packet Packet or the packet queue to be reported as faulty.
     228 * @param[in] header First packet IP header. May be NULL.
     229 *
     230 * @return Found ICMP session.
     231 * @return NULL if the error parameter is set.
     232 * @return NULL if the ICMP session is not found.
     233 * @return NULL if the ip_prepare_icmp() fails.
     234 *
     235 */
     236static async_sess_t *ip_prepare_icmp_and_get_session(services_t error,
     237    packet_t *packet, ip_header_t *header)
     238{
     239        async_sess_t *sess = ip_get_icmp_session();
     240       
     241        if ((error) || (!sess) || (ip_prepare_icmp(packet, header))) {
     242                pq_release_remote(ip_globals.net_sess, packet_get_id(packet));
     243                return NULL;
     244        }
     245       
     246        return sess;
     247}
     248
     249int il_initialize(async_sess_t *net_sess)
    246250{
    247251        fibril_rwlock_initialize(&ip_globals.lock);
     
    250254        fibril_rwlock_initialize(&ip_globals.netifs_lock);
    251255       
    252         ip_globals.net_phone = net_phone;
     256        ip_globals.net_sess = net_sess;
    253257        ip_globals.packet_counter = 0;
    254258        ip_globals.gateway.address.s_addr = 0;
     
    350354        ip_netif->routing = NET_DEFAULT_IP_ROUTING;
    351355        configuration = &names[0];
    352 
     356       
    353357        /* Get configuration */
    354         rc = net_get_device_conf_req(ip_globals.net_phone, ip_netif->device_id,
     358        rc = net_get_device_conf_req(ip_globals.net_sess, ip_netif->device_id,
    355359            &configuration, count, &data);
    356360        if (rc != EOK)
     
    402406                        return ENOTSUP;
    403407                }
    404 
     408               
    405409                if (configuration[6].value) {
    406410                        ip_netif->arp = get_running_module(&ip_globals.modules,
     
    413417                        }
    414418                }
     419               
    415420                if (configuration[7].value)
    416421                        ip_netif->routing = (configuration[7].value[0] == 'y');
    417 
     422               
    418423                net_free_settings(configuration, data);
    419424        }
    420 
     425       
    421426        /* Bind netif service which also initializes the device */
    422         ip_netif->phone = nil_bind_service(ip_netif->service,
     427        ip_netif->sess = nil_bind_service(ip_netif->service,
    423428            (sysarg_t) ip_netif->device_id, SERVICE_IP,
    424429            ip_receiver);
    425         if (ip_netif->phone < 0) {
     430        if (ip_netif->sess == NULL) {
    426431                printf("Failed to contact the nil service %d\n",
    427432                    ip_netif->service);
    428                 return ip_netif->phone;
    429         }
    430 
     433                return ENOENT;
     434        }
     435       
    431436        /* Has to be after the device netif module initialization */
    432437        if (ip_netif->arp) {
     
    435440                        address.length = sizeof(in_addr_t);
    436441                       
    437                         rc = arp_device_req(ip_netif->arp->phone,
     442                        rc = arp_device_req(ip_netif->arp->sess,
    438443                            ip_netif->device_id, SERVICE_IP, ip_netif->service,
    439444                            &address);
     
    444449                }
    445450        }
    446 
     451       
    447452        /* Get packet dimensions */
    448         rc = nil_packet_size_req(ip_netif->phone, ip_netif->device_id,
     453        rc = nil_packet_size_req(ip_netif->sess, ip_netif->device_id,
    449454            &ip_netif->packet_dimension);
    450455        if (rc != EOK)
     
    457462                ip_netif->packet_dimension.content = IP_MIN_CONTENT;
    458463        }
    459 
     464       
    460465        index = ip_netifs_add(&ip_globals.netifs, ip_netif->device_id, ip_netif);
    461466        if (index < 0)
     
    474479                printf("%s: Default gateway (%s)\n", NAME, defgateway);
    475480        }
    476 
     481       
    477482        return EOK;
    478483}
    479484
    480 static int ip_device_req_local(int il_phone, device_id_t device_id,
    481     services_t netif)
     485static int ip_device_req_local(nic_device_id_t device_id, services_t netif)
    482486{
    483487        ip_netif_t *ip_netif;
     
    495499                return rc;
    496500        }
    497 
     501       
    498502        ip_netif->device_id = device_id;
    499503        ip_netif->service = netif;
    500         ip_netif->state = NETIF_STOPPED;
    501 
     504        ip_netif->state = NIC_STATE_STOPPED;
     505       
    502506        fibril_rwlock_write_lock(&ip_globals.netifs_lock);
    503507
     
    513517
    514518        /* Print the settings */
    515         printf("%s: Device registered (id: %d, phone: %d, ipv: %d, conf: %s)\n",
    516             NAME, ip_netif->device_id, ip_netif->phone, ip_netif->ipv,
     519        printf("%s: Device registered (id: %d, ipv: %d, conf: %s)\n",
     520            NAME, ip_netif->device_id, ip_netif->ipv,
    517521            ip_netif->dhcp ? "dhcp" : "static");
    518522       
     
    591595        while (index >= 0) {
    592596                netif = ip_netifs_get_index(&ip_globals.netifs, index);
    593                 if (netif && (netif->state == NETIF_ACTIVE)) {
     597                if (netif && (netif->state == NIC_STATE_ACTIVE)) {
    594598                        route = ip_netif_find_route(netif, destination);
    595599                        if (route)
     
    635639
    636640        /* Process all IP options */
    637         while (next < first->header_length) {
     641        while (next < GET_IP_HEADER_LENGTH(first)) {
    638642                option = (ip_option_t *) (((uint8_t *) first) + next);
    639643                /* Skip end or noop */
     
    656660        if (length % 4) {
    657661                bzero(((uint8_t *) last) + length, 4 - (length % 4));
    658                 last->header_length = length / 4 + 1;
     662                SET_IP_HEADER_LENGTH(last, (length / 4 + 1));
    659663        } else {
    660                 last->header_length = length / 4;
     664                SET_IP_HEADER_LENGTH(last, (length / 4));
    661665        }
    662666
     
    706710                return rc;
    707711       
    708         header->version = IPV4;
    709         header->fragment_offset_high = 0;
     712        SET_IP_HEADER_VERSION(header, IPV4);
     713        SET_IP_HEADER_FRAGMENT_OFFSET_HIGH(header, 0);
    710714        header->fragment_offset_low = 0;
    711715        header->header_checksum = 0;
     
    735739                        memcpy(middle_header, last_header,
    736740                            IP_HEADER_LENGTH(last_header));
    737                         header->flags |= IPFLAG_MORE_FRAGMENTS;
     741                        SET_IP_HEADER_FLAGS(header,
     742                            (GET_IP_HEADER_FLAGS(header) | IPFLAG_MORE_FRAGMENTS));
    738743                        middle_header->total_length =
    739744                            htons(packet_get_data_length(next));
    740                         middle_header->fragment_offset_high =
    741                             IP_COMPUTE_FRAGMENT_OFFSET_HIGH(length);
     745                        SET_IP_HEADER_FRAGMENT_OFFSET_HIGH(middle_header,
     746                            IP_COMPUTE_FRAGMENT_OFFSET_HIGH(length));
    742747                        middle_header->fragment_offset_low =
    743748                            IP_COMPUTE_FRAGMENT_OFFSET_LOW(length);
     
    768773                middle_header->total_length =
    769774                    htons(packet_get_data_length(next));
    770                 middle_header->fragment_offset_high =
    771                     IP_COMPUTE_FRAGMENT_OFFSET_HIGH(length);
     775                SET_IP_HEADER_FRAGMENT_OFFSET_HIGH(middle_header,
     776                    IP_COMPUTE_FRAGMENT_OFFSET_HIGH(length));
    772777                middle_header->fragment_offset_low =
    773778                    IP_COMPUTE_FRAGMENT_OFFSET_LOW(length);
     
    785790                length += packet_get_data_length(next);
    786791                free(last_header);
    787                 header->flags |= IPFLAG_MORE_FRAGMENTS;
     792                SET_IP_HEADER_FLAGS(header,
     793                    (GET_IP_HEADER_FLAGS(header) | IPFLAG_MORE_FRAGMENTS));
    788794        }
    789795
     
    834840        new_header->total_length = htons(IP_HEADER_LENGTH(new_header) + length);
    835841        offset = IP_FRAGMENT_OFFSET(header) + IP_HEADER_DATA_LENGTH(header);
    836         new_header->fragment_offset_high =
    837             IP_COMPUTE_FRAGMENT_OFFSET_HIGH(offset);
     842        SET_IP_HEADER_FRAGMENT_OFFSET_HIGH(new_header,
     843            IP_COMPUTE_FRAGMENT_OFFSET_HIGH(offset));
    838844        new_header->fragment_offset_low =
    839845            IP_COMPUTE_FRAGMENT_OFFSET_LOW(offset);
     
    865871                return NULL;
    866872        memcpy(middle, last, IP_HEADER_LENGTH(last));
    867         middle->flags |= IPFLAG_MORE_FRAGMENTS;
     873        SET_IP_HEADER_FLAGS(middle,
     874            (GET_IP_HEADER_FLAGS(middle) | IPFLAG_MORE_FRAGMENTS));
    868875        return middle;
    869876}
     
    922929
    923930        /* Fragmentation forbidden? */
    924         if(header->flags & IPFLAG_DONT_FRAGMENT)
     931        if(GET_IP_HEADER_FLAGS(header) & IPFLAG_DONT_FRAGMENT)
    925932                return EPERM;
    926933
    927934        /* Create the last fragment */
    928         new_packet = packet_get_4_remote(ip_globals.net_phone, prefix, length,
     935        new_packet = packet_get_4_remote(ip_globals.net_sess, prefix, length,
    929936            suffix, ((addrlen > addr_len) ? addrlen : addr_len));
    930937        if (!new_packet)
     
    958965
    959966        /* Mark the first as fragmented */
    960         header->flags |= IPFLAG_MORE_FRAGMENTS;
     967        SET_IP_HEADER_FLAGS(header,
     968            (GET_IP_HEADER_FLAGS(header) | IPFLAG_MORE_FRAGMENTS));
    961969
    962970        /* Create middle fragments */
    963971        while (IP_TOTAL_LENGTH(header) > length) {
    964                 new_packet = packet_get_4_remote(ip_globals.net_phone, prefix,
     972                new_packet = packet_get_4_remote(ip_globals.net_sess, prefix,
    965973                    length, suffix,
    966974                    ((addrlen >= addr_len) ? addrlen : addr_len));
     
    987995}
    988996
    989 /** Checks the packet queue lengths and fragments the packets if needed.
     997/** Check the packet queue lengths and fragments the packets if needed.
    990998 *
    991999 * The ICMP_FRAG_NEEDED error notification may be sent if the packet needs to
    9921000 * be fragmented and the fragmentation is not allowed.
    9931001 *
    994  * @param[in,out] packet The packet or the packet queue to be checked.
    995  * @param[in] prefix    The minimum prefix size.
    996  * @param[in] content   The maximum content size.
    997  * @param[in] suffix    The minimum suffix size.
    998  * @param[in] addr_len  The minimum address length.
    999  * @param[in] error     The error module service.
    1000  * @return              The packet or the packet queue of the allowed length.
    1001  * @return              NULL if there are no packets left.
    1002  */
    1003 static packet_t *
    1004 ip_split_packet(packet_t *packet, size_t prefix, size_t content, size_t suffix,
    1005     socklen_t addr_len, services_t error)
     1002 * @param[in,out] packet   Packet or the packet queue to be checked.
     1003 * @param[in]     prefix   Minimum prefix size.
     1004 * @param[in]     content  Maximum content size.
     1005 * @param[in]     suffix   Minimum suffix size.
     1006 * @param[in]     addr_len Minimum address length.
     1007 * @param[in]     error    Error module service.
     1008 *
     1009 * @return The packet or the packet queue of the allowed length.
     1010 * @return NULL if there are no packets left.
     1011 *
     1012 */
     1013static packet_t *ip_split_packet(packet_t *packet, size_t prefix, size_t content,
     1014    size_t suffix, socklen_t addr_len, services_t error)
    10061015{
    10071016        size_t length;
     
    10091018        packet_t *new_packet;
    10101019        int result;
    1011         int phone;
    1012 
     1020        async_sess_t *sess;
     1021       
    10131022        next = packet;
    10141023        /* Check all packets */
     
    10321041                        /* Fragmentation needed? */
    10331042                        if (result == EPERM) {
    1034                                 phone = ip_prepare_icmp_and_get_phone(
    1035                                     error, next, NULL);
    1036                                 if (phone >= 0) {
     1043                                sess = ip_prepare_icmp_and_get_session(error, next, NULL);
     1044                                if (sess) {
    10371045                                        /* Fragmentation necessary ICMP */
    1038                                         icmp_destination_unreachable_msg(phone,
     1046                                        icmp_destination_unreachable_msg(sess,
    10391047                                            ICMP_FRAG_NEEDED, content, next);
    10401048                                }
    10411049                        } else {
    1042                                 pq_release_remote(ip_globals.net_phone,
     1050                                pq_release_remote(ip_globals.net_sess,
    10431051                                    packet_get_id(next));
    10441052                        }
     
    10541062}
    10551063
    1056 /** Sends the packet or the packet queue via the specified route.
     1064/** Send the packet or the packet queue via the specified route.
    10571065 *
    10581066 * The ICMP_HOST_UNREACH error notification may be sent if route hardware
    10591067 * destination address is found.
    10601068 *
    1061  * @param[in,out] packet The packet to be sent.
    1062  * @param[in] netif     The target network interface.
    1063  * @param[in] route     The target route.
    1064  * @param[in] src       The source address.
    1065  * @param[in] dest      The destination address.
    1066  * @param[in] error     The error module service.
    1067  * @return              EOK on success.
    1068  * @return              Other error codes as defined for the arp_translate_req()
    1069  *                      function.
    1070  * @return              Other error codes as defined for the ip_prepare_packet()
    1071  *                      function.
     1069 * @param[in,out] packet Packet to be sent.
     1070 * @param[in]     netif  Target network interface.
     1071 * @param[in]     route  Target route.
     1072 * @param[in]     src    Source address.
     1073 * @param[in]     dest   Destination address.
     1074 * @param[in]     error  Error module service.
     1075 *
     1076 * @return EOK on success.
     1077 * @return Other error codes as defined for arp_translate_req().
     1078 * @return Other error codes as defined for ip_prepare_packet().
     1079 *
    10721080 */
    10731081static int ip_send_route(packet_t *packet, ip_netif_t *netif,
     
    10771085        measured_string_t *translation;
    10781086        uint8_t *data;
    1079         int phone;
     1087        async_sess_t *sess;
    10801088        int rc;
    10811089
     
    10861094                destination.length = sizeof(dest.s_addr);
    10871095
    1088                 rc = arp_translate_req(netif->arp->phone, netif->device_id,
     1096                rc = arp_translate_req(netif->arp->sess, netif->device_id,
    10891097                    SERVICE_IP, &destination, &translation, &data);
    10901098                if (rc != EOK) {
    1091                         pq_release_remote(ip_globals.net_phone,
     1099                        pq_release_remote(ip_globals.net_sess,
    10921100                            packet_get_id(packet));
    10931101                        return rc;
     
    10991107                                free(data);
    11001108                        }
    1101                         phone = ip_prepare_icmp_and_get_phone(error, packet,
     1109                        sess = ip_prepare_icmp_and_get_session(error, packet,
    11021110                            NULL);
    1103                         if (phone >= 0) {
     1111                        if (sess) {
    11041112                                /* Unreachable ICMP if no routing */
    1105                                 icmp_destination_unreachable_msg(phone,
     1113                                icmp_destination_unreachable_msg(sess,
    11061114                                    ICMP_HOST_UNREACH, 0, packet);
    11071115                        }
     
    11151123        rc = ip_prepare_packet(src, dest, packet, translation);
    11161124        if (rc != EOK) {
    1117                 pq_release_remote(ip_globals.net_phone, packet_get_id(packet));
     1125                pq_release_remote(ip_globals.net_sess, packet_get_id(packet));
    11181126        } else {
    11191127                packet = ip_split_packet(packet, netif->packet_dimension.prefix,
     
    11221130                    netif->packet_dimension.addr_len, error);
    11231131                if (packet) {
    1124                         nil_send_msg(netif->phone, netif->device_id, packet,
     1132                        nil_send_msg(netif->sess, netif->device_id, packet,
    11251133                            SERVICE_IP);
    11261134                }
     
    11351143}
    11361144
    1137 static int ip_send_msg_local(int il_phone, device_id_t device_id,
    1138     packet_t *packet, services_t sender, services_t error)
     1145static int ip_send_msg_local(nic_device_id_t device_id, packet_t *packet,
     1146    services_t sender, services_t error)
    11391147{
    11401148        int addrlen;
     
    11451153        in_addr_t *dest;
    11461154        in_addr_t *src;
    1147         int phone;
     1155        async_sess_t *sess;
    11481156        int rc;
    11491157
     
    11901198        if (!netif || !route) {
    11911199                fibril_rwlock_read_unlock(&ip_globals.netifs_lock);
    1192                 phone = ip_prepare_icmp_and_get_phone(error, packet, NULL);
    1193                 if (phone >= 0) {
     1200                sess = ip_prepare_icmp_and_get_session(error, packet, NULL);
     1201                if (sess) {
    11941202                        /* Unreachable ICMP if no routing */
    1195                         icmp_destination_unreachable_msg(phone,
     1203                        icmp_destination_unreachable_msg(sess,
    11961204                            ICMP_NET_UNREACH, 0, packet);
    11971205                }
     
    12211229                if (!netif || !route) {
    12221230                        fibril_rwlock_read_unlock(&ip_globals.netifs_lock);
    1223                         phone = ip_prepare_icmp_and_get_phone(error, packet,
     1231                        sess = ip_prepare_icmp_and_get_session(error, packet,
    12241232                            NULL);
    1225                         if (phone >= 0) {
     1233                        if (sess) {
    12261234                                /* Unreachable ICMP if no routing */
    1227                                 icmp_destination_unreachable_msg(phone,
     1235                                icmp_destination_unreachable_msg(sess,
    12281236                                    ICMP_HOST_UNREACH, 0, packet);
    12291237                        }
     
    12511259 * @return              ENOENT if device is not found.
    12521260 */
    1253 static int ip_device_state_message(device_id_t device_id, device_state_t state)
     1261static int ip_device_state_message(nic_device_id_t device_id,
     1262    nic_device_state_t state)
    12541263{
    12551264        ip_netif_t *netif;
     
    12651274        fibril_rwlock_write_unlock(&ip_globals.netifs_lock);
    12661275
    1267         printf("%s: Device %d changed state to %d\n", NAME, device_id, state);
     1276        printf("%s: Device %d changed state to '%s'\n", NAME, device_id,
     1277            nic_device_state_to_string(state));
    12681278
    12691279        return EOK;
     
    13051315 *                      tl_received_msg() function.
    13061316 */
    1307 static int ip_deliver_local(device_id_t device_id, packet_t *packet,
     1317static int ip_deliver_local(nic_device_id_t device_id, packet_t *packet,
    13081318    ip_header_t *header, services_t error)
    13091319{
    13101320        ip_proto_t *proto;
    1311         int phone;
     1321        async_sess_t *sess;
    13121322        services_t service;
    13131323        tl_received_msg_t received_msg;
     
    13191329        int rc;
    13201330
    1321         if ((header->flags & IPFLAG_MORE_FRAGMENTS) ||
     1331        if ((GET_IP_HEADER_FLAGS(header) & IPFLAG_MORE_FRAGMENTS) ||
    13221332            IP_FRAGMENT_OFFSET(header)) {
    13231333                // TODO fragmented
     
    13251335        }
    13261336       
    1327         switch (header->version) {
     1337        switch (GET_IP_HEADER_VERSION(header)) {
    13281338        case IPVERSION:
    13291339                addrlen = sizeof(src_in);
     
    13621372        if (!proto) {
    13631373                fibril_rwlock_read_unlock(&ip_globals.protos_lock);
    1364                 phone = ip_prepare_icmp_and_get_phone(error, packet, header);
    1365                 if (phone >= 0) {
     1374                sess = ip_prepare_icmp_and_get_session(error, packet, header);
     1375                if (sess) {
    13661376                        /* Unreachable ICMP */
    1367                         icmp_destination_unreachable_msg(phone,
     1377                        icmp_destination_unreachable_msg(sess,
    13681378                            ICMP_PROT_UNREACH, 0, packet);
    13691379                }
     
    13771387                rc = received_msg(device_id, packet, service, error);
    13781388        } else {
    1379                 rc = tl_received_msg(proto->phone, device_id, packet,
     1389                rc = tl_received_msg(proto->sess, device_id, packet,
    13801390                    proto->service, error);
    13811391                fibril_rwlock_read_unlock(&ip_globals.protos_lock);
     
    14061416 *                      is disabled.
    14071417 */
    1408 static int ip_process_packet(device_id_t device_id, packet_t *packet)
     1418static int ip_process_packet(nic_device_id_t device_id, packet_t *packet)
    14091419{
    14101420        ip_header_t *header;
    14111421        in_addr_t dest;
    14121422        ip_route_t *route;
    1413         int phone;
     1423        async_sess_t *sess;
    14141424        struct sockaddr *addr;
    14151425        struct sockaddr_in addr_in;
     
    14241434        if ((header->header_checksum) &&
    14251435            (IP_HEADER_CHECKSUM(header) != IP_CHECKSUM_ZERO)) {
    1426                 phone = ip_prepare_icmp_and_get_phone(0, packet, header);
    1427                 if (phone >= 0) {
     1436                sess = ip_prepare_icmp_and_get_session(0, packet, header);
     1437                if (sess) {
    14281438                        /* Checksum error ICMP */
    1429                         icmp_parameter_problem_msg(phone, ICMP_PARAM_POINTER,
     1439                        icmp_parameter_problem_msg(sess, ICMP_PARAM_POINTER,
    14301440                            ((size_t) ((void *) &header->header_checksum)) -
    14311441                            ((size_t) ((void *) header)), packet);
     
    14351445
    14361446        if (header->ttl <= 1) {
    1437                 phone = ip_prepare_icmp_and_get_phone(0, packet, header);
    1438                 if (phone >= 0) {
     1447                sess = ip_prepare_icmp_and_get_session(0, packet, header);
     1448                if (sess) {
    14391449                        /* TTL exceeded ICMP */
    1440                         icmp_time_exceeded_msg(phone, ICMP_EXC_TTL, packet);
     1450                        icmp_time_exceeded_msg(sess, ICMP_EXC_TTL, packet);
    14411451                }
    14421452                return EINVAL;
     
    14471457
    14481458        /* Set the destination address */
    1449         switch (header->version) {
     1459        switch (GET_IP_HEADER_VERSION(header)) {
    14501460        case IPVERSION:
    14511461                addrlen = sizeof(addr_in);
     
    14661476        route = ip_find_route(dest);
    14671477        if (!route) {
    1468                 phone = ip_prepare_icmp_and_get_phone(0, packet, header);
    1469                 if (phone >= 0) {
     1478                sess = ip_prepare_icmp_and_get_session(0, packet, header);
     1479                if (sess) {
    14701480                        /* Unreachable ICMP */
    1471                         icmp_destination_unreachable_msg(phone,
     1481                        icmp_destination_unreachable_msg(sess,
    14721482                            ICMP_HOST_UNREACH, 0, packet);
    14731483                }
     
    14861496        }
    14871497
    1488         phone = ip_prepare_icmp_and_get_phone(0, packet, header);
    1489         if (phone >= 0) {
     1498        sess = ip_prepare_icmp_and_get_session(0, packet, header);
     1499        if (sess) {
    14901500                /* Unreachable ICMP if no routing */
    1491                 icmp_destination_unreachable_msg(phone, ICMP_HOST_UNREACH, 0,
     1501                icmp_destination_unreachable_msg(sess, ICMP_HOST_UNREACH, 0,
    14921502                    packet);
    14931503        }
     
    14961506}
    14971507
    1498 /** Returns the device packet dimensions for sending.
    1499  *
    1500  * @param[in] phone     The service module phone.
    1501  * @param[in] message   The service specific message.
    1502  * @param[in] device_id The device identifier.
    1503  * @param[out] addr_len The minimum reserved address length.
    1504  * @param[out] prefix   The minimum reserved prefix size.
    1505  * @param[out] content  The maximum content size.
    1506  * @param[out] suffix   The minimum reserved suffix size.
    1507  * @return              EOK on success.
    1508  */
    1509 static int ip_packet_size_message(device_id_t device_id, size_t *addr_len,
     1508/** Return the device packet dimensions for sending.
     1509 *
     1510 * @param[in]  device_id Device identifier.
     1511 * @param[out] addr_len  Minimum reserved address length.
     1512 * @param[out] prefix    Minimum reserved prefix size.
     1513 * @param[out] content   Maximum content size.
     1514 * @param[out] suffix    Minimum reserved suffix size.
     1515 *
     1516 * @return EOK on success.
     1517 *
     1518 */
     1519static int ip_packet_size_message(nic_device_id_t device_id, size_t *addr_len,
    15101520    size_t *prefix, size_t *content, size_t *suffix)
    15111521{
     
    15651575 * @return              ENOENT if device is not found.
    15661576 */
    1567 static int ip_mtu_changed_message(device_id_t device_id, size_t mtu)
     1577static int ip_mtu_changed_message(nic_device_id_t device_id, size_t mtu)
    15681578{
    15691579        ip_netif_t *netif;
     
    15871597 * @param[in]     iid   Message identifier.
    15881598 * @param[in,out] icall Message parameters.
    1589  *
    1590  */
    1591 static void ip_receiver(ipc_callid_t iid, ipc_call_t *icall)
     1599 * @param[in]     arg   Local argument.
     1600 *
     1601 */
     1602static void ip_receiver(ipc_callid_t iid, ipc_call_t *icall, void *arg)
    15921603{
    15931604        packet_t *packet;
     
    16031614               
    16041615                case NET_IL_RECEIVED:
    1605                         rc = packet_translate_remote(ip_globals.net_phone, &packet,
     1616                        rc = packet_translate_remote(ip_globals.net_sess, &packet,
    16061617                            IPC_GET_PACKET(*icall));
    16071618                        if (rc == EOK) {
     
    16211632                        async_answer_0(iid, (sysarg_t) rc);
    16221633                        break;
    1623                
     1634                case NET_IL_ADDR_CHANGED:
     1635                        async_answer_0(iid, (sysarg_t) EOK);
     1636                        break;
     1637
    16241638                default:
    16251639                        async_answer_0(iid, (sysarg_t) ENOTSUP);
     
    16301644}
    16311645
    1632 /** Registers the transport layer protocol.
     1646/** Register the transport layer protocol.
    16331647 *
    16341648 * The traffic of this protocol will be supplied using either the receive
    16351649 * function or IPC message.
    16361650 *
    1637  * @param[in] protocol  The transport layer module protocol.
    1638  * @param[in] service   The transport layer module service.
    1639  * @param[in] phone     The transport layer module phone.
    1640  * @param[in] received_msg The receiving function.
    1641  * @return              EOK on success.
    1642  * @return              EINVAL if the protocol parameter and/or the service
    1643  *                      parameter is zero.
    1644  * @return              EINVAL if the phone parameter is not a positive number
    1645  *                      and the tl_receive_msg is NULL.
    1646  * @return              ENOMEM if there is not enough memory left.
    1647  */
    1648 static int
    1649 ip_register(int protocol, services_t service, int phone,
     1651 * @param[in] protocol     Transport layer module protocol.
     1652 * @param[in] service      Transport layer module service.
     1653 * @param[in] sess         Transport layer module session.
     1654 * @param[in] received_msg Receiving function.
     1655 *
     1656 * @return EOK on success.
     1657 * @return EINVAL if the protocol parameter and/or the service
     1658 *         parameter is zero.
     1659 * @return EINVAL if the phone parameter is not a positive number
     1660 *         and the tl_receive_msg is NULL.
     1661 * @return ENOMEM if there is not enough memory left.
     1662 *
     1663 */
     1664static int ip_register(int protocol, services_t service, async_sess_t *sess,
    16501665    tl_received_msg_t received_msg)
    16511666{
     
    16531668        int index;
    16541669
    1655         if (!protocol || !service || ((phone < 0) && !received_msg))
     1670        if ((!protocol) || (!service) || ((!sess) && (!received_msg)))
    16561671                return EINVAL;
    1657 
     1672       
    16581673        proto = (ip_proto_t *) malloc(sizeof(ip_protos_t));
    16591674        if (!proto)
     
    16621677        proto->protocol = protocol;
    16631678        proto->service = service;
    1664         proto->phone = phone;
     1679        proto->sess = sess;
    16651680        proto->received_msg = received_msg;
    16661681
     
    16741689        fibril_rwlock_write_unlock(&ip_globals.protos_lock);
    16751690
    1676         printf("%s: Protocol registered (protocol: %d, phone: %d)\n",
    1677             NAME, proto->protocol, proto->phone);
     1691        printf("%s: Protocol registered (protocol: %d)\n",
     1692            NAME, proto->protocol);
    16781693
    16791694        return EOK;
    16801695}
    16811696
    1682 
    1683 static int
    1684 ip_add_route_req_local(int ip_phone, device_id_t device_id, in_addr_t address,
     1697static int ip_add_route_req_local(nic_device_id_t device_id, in_addr_t address,
    16851698    in_addr_t netmask, in_addr_t gateway)
    16861699{
     
    17161729}
    17171730
    1718 static int
    1719 ip_set_gateway_req_local(int ip_phone, device_id_t device_id, in_addr_t gateway)
     1731static int ip_set_gateway_req_local(nic_device_id_t device_id,
     1732    in_addr_t gateway)
    17201733{
    17211734        ip_netif_t *netif;
     
    17411754/** Notify the IP module about the received error notification packet.
    17421755 *
    1743  * @param[in] ip_phone  The IP module phone used for (semi)remote calls.
    1744  * @param[in] device_id The device identifier.
    1745  * @param[in] packet    The received packet or the received packet queue.
    1746  * @param[in] target    The target internetwork module service to be
    1747  *                      delivered to.
    1748  * @param[in] error     The packet error reporting service. Prefixes the
    1749  *                      received packet.
    1750  * @return              EOK on success.
    1751  *
    1752  */
    1753 static int
    1754 ip_received_error_msg_local(int ip_phone, device_id_t device_id,
     1756 * @param[in] device_id Device identifier.
     1757 * @param[in] packet    Received packet or the received packet queue.
     1758 * @param[in] target    Target internetwork module service to be
     1759 *                      delivered to.
     1760 * @param[in] error     Packet error reporting service. Prefixes the
     1761 *                      received packet.
     1762 *
     1763 * @return EOK on success.
     1764 *
     1765 */
     1766static int ip_received_error_msg_local(nic_device_id_t device_id,
    17551767    packet_t *packet, services_t target, services_t error)
    17561768{
     
    17971809                        address.value = (uint8_t *) &header->destination_address;
    17981810                        address.length = sizeof(header->destination_address);
    1799                         arp_clear_address_req(netif->arp->phone,
     1811                        arp_clear_address_req(netif->arp->sess,
    18001812                            netif->device_id, SERVICE_IP, &address);
    18011813                }
     
    18111823}
    18121824
    1813 static int
    1814 ip_get_route_req_local(int ip_phone, ip_protocol_t protocol,
     1825static int ip_get_route_req_local(ip_protocol_t protocol,
    18151826    const struct sockaddr *destination, socklen_t addrlen,
    1816     device_id_t *device_id, void **header, size_t *headerlen)
     1827    nic_device_id_t *device_id, void **header, size_t *headerlen)
    18171828{
    18181829        struct sockaddr_in *address_in;
     
    19051916        size_t suffix;
    19061917        size_t content;
    1907         device_id_t device_id;
     1918        nic_device_id_t device_id;
    19081919        int rc;
    19091920       
    19101921        *answer_count = 0;
     1922       
     1923        if (!IPC_GET_IMETHOD(*call))
     1924                return EOK;
     1925       
     1926        async_sess_t *callback =
     1927            async_callback_receive_start(EXCHANGE_SERIALIZE, call);
     1928        if (callback)
     1929                return ip_register(IL_GET_PROTO(*call), IL_GET_SERVICE(*call),
     1930                    callback, NULL);
     1931       
    19111932        switch (IPC_GET_IMETHOD(*call)) {
    1912         case IPC_M_PHONE_HUNGUP:
    1913                 return EOK;
    1914        
    1915         case IPC_M_CONNECT_TO_ME:
    1916                 return ip_register(IL_GET_PROTO(*call), IL_GET_SERVICE(*call),
    1917                     IPC_GET_PHONE(*call), NULL);
    1918        
    19191933        case NET_IP_DEVICE:
    1920                 return ip_device_req_local(0, IPC_GET_DEVICE(*call),
     1934                return ip_device_req_local(IPC_GET_DEVICE(*call),
    19211935                    IPC_GET_SERVICE(*call));
    19221936       
    19231937        case NET_IP_RECEIVED_ERROR:
    1924                 rc = packet_translate_remote(ip_globals.net_phone, &packet,
     1938                rc = packet_translate_remote(ip_globals.net_sess, &packet,
    19251939                    IPC_GET_PACKET(*call));
    19261940                if (rc != EOK)
    19271941                        return rc;
    1928                 return ip_received_error_msg_local(0, IPC_GET_DEVICE(*call),
     1942                return ip_received_error_msg_local(IPC_GET_DEVICE(*call),
    19291943                    packet, IPC_GET_TARGET(*call), IPC_GET_ERROR(*call));
    19301944       
    19311945        case NET_IP_ADD_ROUTE:
    1932                 return ip_add_route_req_local(0, IPC_GET_DEVICE(*call),
     1946                return ip_add_route_req_local(IPC_GET_DEVICE(*call),
    19331947                    IP_GET_ADDRESS(*call), IP_GET_NETMASK(*call),
    19341948                    IP_GET_GATEWAY(*call));
    19351949
    19361950        case NET_IP_SET_GATEWAY:
    1937                 return ip_set_gateway_req_local(0, IPC_GET_DEVICE(*call),
     1951                return ip_set_gateway_req_local(IPC_GET_DEVICE(*call),
    19381952                    IP_GET_GATEWAY(*call));
    19391953
     
    19441958                        return rc;
    19451959               
    1946                 rc = ip_get_route_req_local(0, IP_GET_PROTOCOL(*call), addr,
     1960                rc = ip_get_route_req_local(IP_GET_PROTOCOL(*call), addr,
    19471961                    (socklen_t) addrlen, &device_id, &header, &headerlen);
    19481962                if (rc != EOK)
     
    19751989       
    19761990        case NET_IP_SEND:
    1977                 rc = packet_translate_remote(ip_globals.net_phone, &packet,
     1991                rc = packet_translate_remote(ip_globals.net_sess, &packet,
    19781992                    IPC_GET_PACKET(*call));
    19791993                if (rc != EOK)
    19801994                        return rc;
    19811995               
    1982                 return ip_send_msg_local(0, IPC_GET_DEVICE(*call), packet, 0,
     1996                return ip_send_msg_local(IPC_GET_DEVICE(*call), packet, 0,
    19831997                    IPC_GET_ERROR(*call));
    19841998        }
Note: See TracChangeset for help on using the changeset viewer.