OSDN Git Service

2013.10.24
[uclinux-h8/uClinux-dist.git] / lib / Libnet / src / libnet_build_ip.c
1 /*
2  *  $Id: libnet_build_ip.c,v 1.1.1.1 2000/05/25 00:28:49 route Exp $
3  *
4  *  libnet
5  *  libnet_build_ip.c - IP packet assembler
6  *
7  *  Copyright (c) 1998 - 2001 Mike D. Schiffman <mike@infonexus.com>
8  *  All rights reserved.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29  * SUCH DAMAGE.
30  *
31  */
32
33 #if (HAVE_CONFIG_H)
34 #include "../include/config.h"
35 #endif
36 #include "../include/libnet.h"
37
38
39 int
40 libnet_build_ipv4(u_short len, u_char tos, u_short id, u_short frag,
41             u_char ttl, u_char prot, u_long src, u_long dst,
42             const u_char *payload, int payload_s, u_char *buf)
43 {
44     return (libnet_build_ip(len, tos, id, frag, ttl, prot, src, dst, payload,
45             payload_s, buf));
46 }
47
48
49 int
50 libnet_build_ip(u_short len, u_char tos, u_short id, u_short frag, u_char ttl,
51             u_char prot, u_long src, u_long dst, const u_char *payload,
52             int payload_s, u_char *buf)
53 {
54     struct libnet_ip_hdr ip_hdr;
55
56     if (!buf)
57     {
58         return (-1);
59     }
60
61     ip_hdr.ip_v    = 4;                             /* version 4 */
62     ip_hdr.ip_hl   = 5;                             /* 20 byte header */
63     ip_hdr.ip_tos  = tos;                           /* IP tos */
64     ip_hdr.ip_len  = htons(LIBNET_IP_H + len);      /* total length */
65     ip_hdr.ip_id   = htons(id);                     /* IP ID */
66     ip_hdr.ip_off  = htons(frag);                   /* fragmentation flags */
67     ip_hdr.ip_ttl  = ttl;                           /* time to live */
68     ip_hdr.ip_p    = prot;                          /* transport protocol */
69     ip_hdr.ip_sum  = 0;                             /* do this later */
70     ip_hdr.ip_src.s_addr = src;
71     ip_hdr.ip_dst.s_addr = dst;
72     if (payload && payload_s)
73     {
74         /*
75          *  Unchecked runtime error for buf + IP_H + payload to be greater than
76          *  the allocated heap memory.
77          */
78         memcpy(buf + LIBNET_IP_H, payload, payload_s);
79     }
80     memcpy((u_char *)buf, (u_char *)&ip_hdr, sizeof(ip_hdr));
81     return (1);
82 }
83
84
85 /* EOF */