Annotation of qemu/roms/SLOF/clients/net-snk/app/netlib/udp.c, revision 1.1.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.