/******************************************************************************
 * Copyright (c) 2004, 2008 IBM Corporation
 * All rights reserved.
 * This program and the accompanying materials
 * are made available under the terms of the BSD License
 * which accompanies this distribution, and is available at
 * http://www.opensource.org/licenses/bsd-license.php
 *
 * Contributors:
 *     IBM Corporation - initial implementation
 *****************************************************************************/

#ifndef _UDP_H
#define _UDP_H

#include <stdint.h>

#define IPTYPE_UDP         17

#define UDPPORT_BOOTPS     67   /**< UDP port of BootP/DHCP-server */
#define UDPPORT_BOOTPC     68   /**< UDP port of BootP/DHCP-client */
#define UDPPORT_DNSS       53   /**< UDP port of DNS-server        */
#define UDPPORT_DNSC    32769   /**< UDP port of DNS-client        */
#define UDPPORT_TFTPC    2001   /**< UDP port of TFTP-client	   */
#define UDPPORT_DHCPV6C   546   /**< UDP port of DHCPv6-client     */

/** \struct udphdr
 *  A header for UDP-packets.
 *  For more information see RFC 768.
 */
struct udphdr {
	uint16_t uh_sport;   /**< Source port                                  */
	uint16_t uh_dport;   /**< Destinantion port                            */
	uint16_t uh_ulen;    /**< Length in octets, incl. this header and data */
	uint16_t uh_sum;     /**< Checksum                                     */
};
typedef struct udphdr udp_hdr_t;

typedef int32_t *(*handle_upper_udp_t)(uint8_t *, int32_t);
typedef void    *(*handle_upper_udp_dun_t)(uint8_t);

/* Handles UDP-packets that are detected by any network layer. */
extern int8_t handle_udp(int fd, uint8_t * udp_packet, uint32_t packetsize);

/* Handles UDP related ICMP-Dest.Unreachable packets that are detected by
 * the network layers. */
extern void handle_udp_dun(uint8_t * udp_packet, uint32_t packetsize, uint8_t err_code);

/* fills udp header */
extern void fill_udphdr(uint8_t *packet, uint16_t packetsize,
                        uint16_t src_port, uint16_t dest_port);

#endif
