Annotation of qemu/roms/SLOF/clients/net-snk/app/netlib/udp.c, revision 1.1

1.1     ! root        1: /******************************************************************************
        !             2:  * Copyright (c) 2004, 2008 IBM Corporation
        !             3:  * All rights reserved.
        !             4:  * This program and the accompanying materials
        !             5:  * are made available under the terms of the BSD License
        !             6:  * which accompanies this distribution, and is available at
        !             7:  * http://www.opensource.org/licenses/bsd-license.php
        !             8:  *
        !             9:  * Contributors:
        !            10:  *     IBM Corporation - initial implementation
        !            11:  *****************************************************************************/
        !            12: 
        !            13: /*>>>>>>>>>>>>>>>>>>>>>>> DEFINITIONS & DECLARATIONS <<<<<<<<<<<<<<<<<<<<*/
        !            14: 
        !            15: #include <udp.h>
        !            16: #include <sys/socket.h>
        !            17: #include <dhcp.h>
        !            18: //#include <dhcpv6.h>
        !            19: #include <dns.h>
        !            20: #ifdef USE_MTFTP
        !            21: #include <mtftp.h>
        !            22: #else
        !            23: #include <tftp.h>
        !            24: #endif
        !            25: 
        !            26: 
        !            27: 
        !            28: /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>> LOCAL VARIABLES <<<<<<<<<<<<<<<<<<<<<<<<<*/
        !            29: 
        !            30: 
        !            31: #ifdef USE_MTFTP
        !            32: 
        !            33: uint16_t net_tftp_uport;
        !            34: uint16_t net_mtftp_uport;
        !            35: 
        !            36: void net_set_tftp_port(uint16_t tftp_port) {
        !            37:        net_tftp_uport = tftp_port;
        !            38: }
        !            39: 
        !            40: void net_set_mtftp_port(uint16_t tftp_port) {
        !            41:        net_mtftp_uport = tftp_port;
        !            42: }
        !            43: 
        !            44: #endif
        !            45: 
        !            46: /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>> IMPLEMENTATION <<<<<<<<<<<<<<<<<<<<<<<<<<*/
        !            47: 
        !            48: 
        !            49: /**
        !            50:  * NET: Handles UDP-packets according to Receive-handle diagram.
        !            51:  *
        !            52:  * @param  udp_packet UDP-packet to be handled
        !            53:  * @param  packetsize Length of the packet
        !            54:  * @return            ZERO - packet handled successfully;
        !            55:  *                    NON ZERO - packet was not handled (e.g. bad format)
        !            56:  * @see               receive_ether
        !            57:  * @see               udphdr
        !            58:  */
        !            59: int8_t
        !            60: handle_udp(uint8_t * udp_packet, int32_t packetsize) {
        !            61:        struct udphdr * udph = (struct udphdr *) udp_packet;
        !            62: 
        !            63:        if (packetsize < sizeof(struct udphdr))
        !            64:                return -1; // packet is too small
        !            65: 
        !            66:        switch (htons(udph -> uh_dport)) {
        !            67:        case UDPPORT_BOOTPC:
        !            68:                if (udph -> uh_sport == htons(UDPPORT_BOOTPS))
        !            69:                        return handle_dhcp(udp_packet + sizeof(struct udphdr),
        !            70:                                            packetsize - sizeof(struct udphdr));
        !            71:                else
        !            72:                        return -1;
        !            73:        case UDPPORT_DNSC:
        !            74:                if (udph -> uh_sport == htons(UDPPORT_DNSS))
        !            75:                        return handle_dns(udp_packet + sizeof(struct udphdr),
        !            76:                                          packetsize - sizeof(struct udphdr));
        !            77:                else
        !            78:                        return -1;
        !            79: /*
        !            80:         case UDPPORT_DHCPV6C:
        !            81:                 return handle_dhcpv6(udp_packet+sizeof(struct udphdr),
        !            82:                                      packetsize - sizeof(struct udphdr));
        !            83: */
        !            84:        case UDPPORT_TFTPC:
        !            85: #ifdef USE_MTFTP
        !            86:        return handle_tftp(udp_packet + sizeof(struct udphdr),
        !            87:                                       packetsize - sizeof(struct udphdr));
        !            88: #else
        !            89:        return handle_tftp(udp_packet, packetsize);
        !            90: #endif
        !            91:        default:
        !            92: #ifdef USE_MTFTP
        !            93:                if (htons(udph -> uh_dport) == net_tftp_uport)
        !            94:                return handle_tftp(udp_packet + sizeof(struct udphdr),
        !            95:                        packetsize - sizeof(struct udphdr));
        !            96:                else if (htons(udph -> uh_dport) == net_mtftp_uport)
        !            97:                return handle_tftp(udp_packet + sizeof(struct udphdr),
        !            98:                        packetsize - sizeof(struct udphdr));
        !            99: #endif
        !           100:                return -1;
        !           101:        }
        !           102: }
        !           103: 
        !           104: /**
        !           105:  * NET: This function handles situation when "Destination unreachable"
        !           106:  *      ICMP-error occurs during sending UDP-packet.
        !           107:  *
        !           108:  * @param  err_code   Error Code (e.g. "Host unreachable")
        !           109:  * @param  packet     original UDP-packet
        !           110:  * @param  packetsize length of the packet
        !           111:  * @see               handle_icmp
        !           112:  */
        !           113: void
        !           114: handle_udp_dun(uint8_t * udp_packet, uint32_t packetsize, uint8_t err_code) {
        !           115:        struct udphdr * udph = (struct udphdr *) udp_packet;
        !           116: 
        !           117:        if (packetsize < sizeof(struct udphdr))
        !           118:                return; // packet is too small
        !           119: 
        !           120:        switch (htons(udph -> uh_sport)) {
        !           121:        case UDPPORT_TFTPC:
        !           122:                handle_tftp_dun(err_code);
        !           123:                break;
        !           124:        }
        !           125: }
        !           126: 
        !           127: /**
        !           128:  * NET: Creates UDP-packet. Places UDP-header in a packet and fills it
        !           129:  *      with corresponding information.
        !           130:  *      <p>
        !           131:  *      Use this function with similar functions for other network layers
        !           132:  *      (fill_ethhdr, fill_iphdr, fill_dnshdr, fill_btphdr).
        !           133:  *
        !           134:  * @param  packet      Points to the place where UDP-header must be placed.
        !           135:  * @param  packetsize  Size of the packet in bytes incl. this hdr and data.
        !           136:  * @param  src_port    UDP source port
        !           137:  * @param  dest_port   UDP destination port
        !           138:  * @see                udphdr
        !           139:  * @see                fill_ethhdr
        !           140:  * @see                fill_iphdr
        !           141:  * @see                fill_dnshdr
        !           142:  * @see                fill_btphdr
        !           143:  */
        !           144: void
        !           145: fill_udphdr(uint8_t * packet, uint16_t packetsize,
        !           146:             uint16_t src_port, uint16_t dest_port) {
        !           147:        struct udphdr * udph = (struct udphdr *) packet;
        !           148: 
        !           149:        udph -> uh_sport = htons(src_port);
        !           150:        udph -> uh_dport = htons(dest_port);
        !           151:        udph -> uh_ulen = htons(packetsize);
        !           152:        udph -> uh_sum = htons(0);
        !           153: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.