Subversion Repositories HelenOS

Rev

Rev 4743 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4743 Rev 4750
Line 203... Line 203...
203
    }
203
    }
204
    udp_globals.ip_phone = ip_bind_service( SERVICE_IP, IPPROTO_UDP, SERVICE_UDP, client_connection, udp_received_msg );
204
    udp_globals.ip_phone = ip_bind_service( SERVICE_IP, IPPROTO_UDP, SERVICE_UDP, client_connection, udp_received_msg );
205
    if( udp_globals.ip_phone < 0 ){
205
    if( udp_globals.ip_phone < 0 ){
206
        return udp_globals.ip_phone;
206
        return udp_globals.ip_phone;
207
    }
207
    }
-
 
208
    // read default packet dimensions
208
    ERROR_PROPAGATE( ip_packet_size_req( udp_globals.ip_phone, -1, & udp_globals.packet_dimension.addr_len, & udp_globals.packet_dimension.prefix, & udp_globals.packet_dimension.content, & udp_globals.packet_dimension.suffix ));
209
    ERROR_PROPAGATE( ip_packet_size_req( udp_globals.ip_phone, -1, & udp_globals.packet_dimension.addr_len, & udp_globals.packet_dimension.prefix, & udp_globals.packet_dimension.content, & udp_globals.packet_dimension.suffix ));
209
    ERROR_PROPAGATE( socket_ports_initialize( & udp_globals.sockets ));
210
    ERROR_PROPAGATE( socket_ports_initialize( & udp_globals.sockets ));
-
 
211
    if( ERROR_OCCURRED( packet_dimensions_initialize( & udp_globals.dimensions ))){
-
 
212
        socket_ports_destroy( & udp_globals.sockets );
-
 
213
        return ERROR_CODE;
-
 
214
    }
210
    udp_globals.packet_dimension.prefix += sizeof( udp_header_t );
215
    udp_globals.packet_dimension.prefix += sizeof( udp_header_t );
211
    udp_globals.packet_dimension.content -= sizeof( udp_header_t );
216
    udp_globals.packet_dimension.content -= sizeof( udp_header_t );
212
    udp_globals.last_used_port = UDP_FREE_PORTS_START - 1;
217
    udp_globals.last_used_port = UDP_FREE_PORTS_START - 1;
213
    // get configuration
218
    // get configuration
214
    udp_globals.checksum_computing = NET_DEFAULT_UDP_CHECKSUM_COMPUTING;
219
    udp_globals.checksum_computing = NET_DEFAULT_UDP_CHECKSUM_COMPUTING;
Line 523... Line 528...
523
    uint16_t                dest_port;
528
    uint16_t                dest_port;
524
    uint32_t                checksum;
529
    uint32_t                checksum;
525
    ip_pseudo_header_ref    ip_header;
530
    ip_pseudo_header_ref    ip_header;
526
    size_t                  headerlen;
531
    size_t                  headerlen;
527
    device_id_t             device_id;
532
    device_id_t             device_id;
-
 
533
    packet_dimension_ref    packet_dimension;
528
 
534
 
529
    ERROR_PROPAGATE( tl_get_address_port( addr, addrlen, & dest_port ));
535
    ERROR_PROPAGATE( tl_get_address_port( addr, addrlen, & dest_port ));
530
 
536
 
531
    socket = socket_cores_find( local_sockets, socket_id );
537
    socket = socket_cores_find( local_sockets, socket_id );
532
    if( ! socket ) return ENOTSOCK;
538
    if( ! socket ) return ENOTSOCK;
Line 551... Line 557...
551
//          fibril_rwlock_read_lock( & udp_globals.lock );
557
//          fibril_rwlock_read_lock( & udp_globals.lock );
552
            // might be changed in the meantime
558
            // might be changed in the meantime
553
//      }while( socket->port <= 0 );
559
//      }while( socket->port <= 0 );
554
    }
560
    }
555
 
561
 
-
 
562
    if( udp_globals.checksum_computing ){
-
 
563
        if( ERROR_OCCURRED( ip_get_route_req( udp_globals.ip_phone, IPPROTO_UDP, addr, addrlen, & device_id, & ip_header, & headerlen ))){
-
 
564
            return udp_release_and_return( packet, ERROR_CODE );
-
 
565
        }
-
 
566
        // get the device packet dimension
-
 
567
//      ERROR_PROPAGATE( tl_get_ip_packet_dimension( udp_globals.ip_phone, & udp_globals.dimensions, device_id, & packet_dimension ));
-
 
568
    }
-
 
569
//  }else{
556
    // TODO do not ask all the time
570
        // do not ask all the time
557
    ERROR_PROPAGATE( ip_packet_size_req( udp_globals.ip_phone, -1, & udp_globals.packet_dimension.addr_len, & udp_globals.packet_dimension.prefix, & udp_globals.packet_dimension.content, & udp_globals.packet_dimension.suffix ));
571
        ERROR_PROPAGATE( ip_packet_size_req( udp_globals.ip_phone, -1, & udp_globals.packet_dimension.addr_len, & udp_globals.packet_dimension.prefix, & udp_globals.packet_dimension.content, & udp_globals.packet_dimension.suffix ));
-
 
572
        packet_dimension = & udp_globals.packet_dimension;
-
 
573
//  }
558
 
574
 
559
    // read the first packet fragment
575
    // read the first packet fragment
560
    result = tl_socket_read_packet_data( udp_globals.net_phone, & packet, sizeof( udp_header_t ), & udp_globals.packet_dimension, addr, addrlen );
576
    result = tl_socket_read_packet_data( udp_globals.net_phone, & packet, sizeof( udp_header_t ), packet_dimension, addr, addrlen );
561
    if( result < 0 ) return result;
577
    if( result < 0 ) return result;
562
    total_length = ( size_t ) result;
578
    total_length = ( size_t ) result;
563
    if( udp_globals.checksum_computing ){
579
    if( udp_globals.checksum_computing ){
564
        checksum = compute_checksum( 0, packet_get_data( packet ), packet_get_data_length( packet ));
580
        checksum = compute_checksum( 0, packet_get_data( packet ), packet_get_data_length( packet ));
565
    }else{
581
    }else{
Line 571... Line 587...
571
        return udp_release_and_return( packet, ENOMEM );
587
        return udp_release_and_return( packet, ENOMEM );
572
    }
588
    }
573
    bzero( header, sizeof( * header ));
589
    bzero( header, sizeof( * header ));
574
    // read the rest of the packet fragments
590
    // read the rest of the packet fragments
575
    for( index = 1; index < fragments; ++ index ){
591
    for( index = 1; index < fragments; ++ index ){
576
        result = tl_socket_read_packet_data( udp_globals.net_phone, & next_packet, 0, & udp_globals.packet_dimension, addr, addrlen );
592
        result = tl_socket_read_packet_data( udp_globals.net_phone, & next_packet, 0, packet_dimension, addr, addrlen );
577
        if( result < 0 ){
593
        if( result < 0 ){
578
            return udp_release_and_return( packet, result );
594
            return udp_release_and_return( packet, result );
579
        }
595
        }
580
        packet = pq_add( packet, next_packet, index, 0 );
596
        packet = pq_add( packet, next_packet, index, 0 );
581
        total_length += ( size_t ) result;
597
        total_length += ( size_t ) result;
Line 587... Line 603...
587
    header->source_port = htons(( socket->port > 0 ) ? socket->port : 0 );
603
    header->source_port = htons(( socket->port > 0 ) ? socket->port : 0 );
588
    header->destination_port = htons( dest_port );
604
    header->destination_port = htons( dest_port );
589
    header->total_length = htons( total_length + sizeof( * header ));
605
    header->total_length = htons( total_length + sizeof( * header ));
590
    header->checksum = 0;
606
    header->checksum = 0;
591
    if( udp_globals.checksum_computing ){
607
    if( udp_globals.checksum_computing ){
592
        if( ERROR_OCCURRED( ip_get_route_req( udp_globals.ip_phone, IPPROTO_UDP, addr, addrlen, & device_id, & ip_header, & headerlen ))){
608
//      if( ERROR_OCCURRED( ip_get_route_req( udp_globals.ip_phone, IPPROTO_UDP, addr, addrlen, & device_id, & ip_header, & headerlen ))){
593
            return udp_release_and_return( packet, ERROR_CODE );
609
//          return udp_release_and_return( packet, ERROR_CODE );
594
        }
610
//      }
595
        if( ERROR_OCCURRED( ip_client_set_pseudo_header_data_length( ip_header, headerlen, total_length + sizeof( udp_header_t )))){
611
        if( ERROR_OCCURRED( ip_client_set_pseudo_header_data_length( ip_header, headerlen, total_length + sizeof( udp_header_t )))){
596
            free( ip_header );
612
            free( ip_header );
597
            return udp_release_and_return( packet, ERROR_CODE );
613
            return udp_release_and_return( packet, ERROR_CODE );
598
        }
614
        }
599
        checksum = compute_checksum( checksum, ip_header, headerlen );
615
        checksum = compute_checksum( checksum, ip_header, headerlen );