Building.Open.Source.Network.Security.Tools.Components.And.Techniques [Electronic resources]

Mike D. Schiffman

نسخه متنی -صفحه : 135/ 33
نمايش فراداده

Packet Builder Functions

The core of libnet is the platform-independent packet-building functionality. These functions enable an application programmer to build protocol headers (and data) in a simple and consistent manner without having to worry (too much) about low-level network odds and ends. Each libnet_build() function builds a piece of a packet (generally a protocol header). While it is perfectly possible to build an entire, ready-to-transmit packet with a single call to a libnet_build() function, generally more than one builder-class function call is required to construct a full packet. A "complete" wire-ready packet generally consists of more than one piece.

Every function that builds a protocol header takes a series of arguments roughly corresponding to the header values as they appear on the wire. This process is intuitive but often makes for functions with huge prototypes and large stack frames.

One important thing to note is that you must call these functions in order, corresponding to how they should appear on the wire (from the highest protocol layer on down). This building process is intuitive; it approximates what happens in an operating system kernel. In other words, to build a Network Time Protocol (NTP) packet by using the link-layer interface, the application programmer would call the libnet_build() functions in the following order:

libnet_build_ntp()

libnet_build_udp()

libnet_build_ipv4()

libnet_build_ethernet()

This ordering is essential for libnet 1.1.0 to properly link together the packet internally (previous libnet versions did not have the requirement).

Figure 3.2 shows the protocols that libnet's packet construction functionality support and their general relationships within the context of the ISO Open Systems Interconnectivity (OSI) 7 layer model. Note that libnet supports arbitrary application programmer specified protocols via the libnet_build_data() interface (the "other" protocols).

Figure 3.2: Libnet-supported protocols and their relationships.

All standard libnet_build() functions take the same final four arguments, as Table 3.3 summarizes.

Table 3.3: Packet Builder Function Final Four Arguments

ARGUMENT

DATATYPE

MEANING

OPTIONAL?


payload

u_char *

Pointer to a byte array containing a payload

Yes (NULL)


payload_s

u_long

Size of the payload

Yes (0)


1

libnet_t

Pointer to the libnet descriptor

No


ptag

libnet_ptag_t

ID of the protocol unit to modify

Yes (0)

The optional arguments are just that, and the value in parentheses can replace them if they are not to be used.

The four libnet_build() functions that do not take the same final four arguments are as follows:

libnet_autobuild_ethernet(). No payload or ptag

libnet_autobuild_ipv4(). No payload, payload_s, or ptag

libnet_build_ipv4_options(). No payload or payload_s

libnet_build_tcp_options(). No payload or payload_s

The Payload Interface

The payload interface specifies an optional way to include data directly after the protocol header in question. You can use this function for a variety of purposes, including the following:

Including additional or arbitrary protocol header information that is not available from a libnet interface

Including a packet payload (data segment)

Building another protocol header that is not available from a libnet interface

To employ the interface, the application programmer should construct the payload data and pass a u_char * to this data and its size to the desired libnet_build() function. Libnet handles the rest. The example code at the end of this chapter employs this interface to include a packet payload after a UDP header.

Libnet Header Sizes

Certain libnet_build() functions require packet length arguments. For example, libnet_build_ipv4() requires the application programmer to specify the entire IP packet length as the first argument. To make this process easier, libnet includes a list of symbolic constants corresponding to header length values in bytes for every supported protocol (for protocols with variable sized headers, the only base header size is defined). This list appears in Table 3.4.

Table 3.4: Header Sizes

PROTOCOL

HEADER SIZE

SYMBOLIC CONSTANT


802.1q

18 bytes

LIBNET_802_1Q_H


802.2 (LLC)

3 bytes

LIBNET_802_2_H


802.2 (LLC/SNAP)

8 bytes

LIBNET_802_2SNAP_H


802.3

14 bytes

LIBNET_802_3_H


ARP (base)

8 bytes

LIBNET_ARP_H


ARP (Ethernet)

28 bytes

LIBNET_ARP_ETH_H


CDP

8 bytes

LIBNET_CDP_H


DHCPv4

240 bytes

LIBNET_DHCPV4_H


DNSv4

12 bytes

LIBNET_DNS_H


DIX Ethernet II

14 bytes

LIBNET_ETHERNET_H


ICMPv4 echo

8 bytes

LIBNET_ICMPV4_ECHO_H


ICMPv4 mask

12 bytes

LIBNET_ICMPV4_MASK_H


ICMPv4 unreachable

8 bytes

LIBNET_ICMPV4_UNREACH_H


ICMPv4 time-exceeded

8 bytes

LIBNET_ICMPV4_TIMEXCEED_H


ICMPv4 redirect

8 bytes

LIBNET_ICMPV4_REDIRECT_H


ICMPv4 timestamp

20 bytes

LIBNET_ICMPV4_TS_H


IGMP

8 bytes

LIBNET_IGMP_H


IPv4

20 bytes

LIBNET_IPV4_H


IPv6

40 bytes

LIBNET_IPV6_H


IPSEC ESP header

12 bytes

LIBNET_IPSEC_ESP_HDR_H


IPSEC ESP trailer

2 bytes

LIBNET_IPSEC_ESP_FTR_H


IPSEC AH

16 bytes

LIBNET_IPSEC_AH_H


OSPFv2

16 bytes

LIBNET_OSPF_H


OSPFv2 hello

24 bytes

LIBNET_OSPF_HELLO_H


OSPFv2 DBD

8 bytes

LIBNET_DBD_H


OSPFv2 LSR

12 bytes

LIBNET_LSR_H


OSPFv2 LSU

4 bytes

LIBNET_LSU_H


OSPFv2 LSA

20 bytes

LIBNET_LSA_H


NTP

48 bytes

LIBNET_NTP_H


RIP

24 bytes

LIBNET_RIP_H


STP

35 bytes

LIBNET_STP_H


TCP

20 bytes

LIBNET_TCP_H


UDP

8 bytes

LIBNET_UDP_H


VRRP

8 bytes

LIBNET_VRRP_H

Protocol Tags and Libnet Packet Builder Return Values

Libnet uses the protocol tag (ptag) to identify individual pieces of a packet after being created. A new ptag results every time a libnet_ build() function with an empty (0) ptag argument completes successfully. This new ptag now refers to the packet piece just created. The application programmer's responsibility is to save this value if he or she plans to modify this particular portion later on in the program. If the application programmer needs to modify some values of that particular packet piece again, he or she calls the same libnet_build() function specifying the saved ptag argument. Libnet then searches for that packet piece and modifies it rather than creating a new one. Upon failure for any reason, libnet_build() functions return -1; libnet_geterror() tells you why.


libnet_ptag_t libnet_build_802_lq(u_char *dst, u_char *src,
u_short tpi, u_char priority, u_char cfi, u_short vid,
u_short len, u_char *payload, u_long payload_s, libnet_t *1,
libnet_ptag_t ptag);

libnet_build_802_lq() builds an IEEE 802.lq VLAN tagging header. Depending on the value of len, the function wraps the 802.lq header inside either an IEEE 802.3 header or an RFC 894 Ethernet II (DIX) header (both resulting in an 18-byte frame). If len is 1500 or less, most receiving protocol stacks parse the frame as an IEEE 802.3 encapsulated frame. If len is one of the Ethernet types in Table 3.6, most protocol stacks parse the frame as an RFC 894 Ethernet II encapsulated frame. The function takes arguments (see Table 3.5).

Table 3.5: libnet_build_802_lq() Arguments

ARGUMENT

MEANING


dst

destination MAC address


src

source MAC address


tpi

tag protocol identifier


priority

priority


cfi

canonical format indicator, should be 1 or 0


vid

VLAN identifier


len

802.3: length of the frame (SANS 802.1 q), Ethernet II: layer 3 protocol

Table 3.6: Ethernet-Type Symbolic Constants

CONSTANT

MEANING


ETHERTYPE_PUP

PUP protocol


ETHERTYPE_IP

IP protocol


ETHERTYPE_ARP

ARP protocol


ETHERTYPE_REVARP

RARP protocol


ETHERTYPE_VLAN

IEEE 802. 1Q VLAN tagging


ETHERTYPE_LOOPBACK

test

Table 3.6 summarizes the different Ethernet-type symbolic constants associated with len (for an RFC 894 encapsulated frame). These constants specify the layer 3 protocol in several link-layer protocols, including 802.lq., 802.2, ARP, RARP, and Ethernet II.


libnet_ptag_t libnet_build_802_2(u_char dsap, u_char dsap,
u_char control, u_char *payload, u_long payload_s, libnet_t
*1, libnet_ptag_t ptag);

libnet_build_802_2() builds an IEEE 802.2 link-layer control (LLC) header. The function takes arguments (see Table 3.7).

Table 3.7: libnet_build_802_2() Arguments

ARGUMENT

MEANING


dsap

destination service access point


ssap

destination service access point


control

control

Table 3.6 summarizes the different symbolic constants for type. Table 3.8 summarizes the different values for some of the service access point values.

Table 3.8: Service Access Point Symbolic Constants

CONSTANT

MEANING


LIBNET_SAP_STP

spanning tree protocol header follows


LIBNET_SAP_SNAP

SNAP header follows


libnet_ptag_t libnet_build_802_2snap(u_char dsap, u_char
dsap, u_char control, u_char *oui, u_short type, u_char
*payload, u_long payload_s, libnet_t *1, libnet_ptag_t ptag);

libnet_build_802_2snap() builds an IEEE 802.2 Link-Layer Control/Subnetwork Attachment Point (LLC/SNAP) header. The function takes arguments (see Table 3.9).

Table 3.9: libnet_build_802_2snap() Arguments

ARGUMENT

MEANING


dsap

destination service access point (should be Oxaa)


ssap

destination service access point (should be Oxaa)


control

control


oui

3-byte organizationally unique identifier


type

upper layer protocol

Table 3.6 summarizes the different symbolic constants for type.


libnet_ptag_t libnet_build_802_3(u_char *dst, u_char *src,
u_short tpi, u_char priority, u_char cfi, u_short vid,
u_short len, u_char *payload, u_long payload_s, libnet_t *1,
libnet_ptag_t ptag);

libnet_build_802_3() builds an IEEE 802.3 header. The 802.3 header is almost identical to the RFC 894 Ethernet II header-the exception being that the field immediately following the source address holds the frame's length (as opposed to the layer 3 protocol). You should only use this function when libnet is initialized with the LIBNET_LINK interface. The function takes arguments (see Table 3.10).

Table 3.10: libnet_build_802_3() Arguments

ARGUMENT

MEANING


dst

destination MAC address


src

source MAC address


len

frame's entire length SANS 802.3 header

The reader should note that an 802.2 LLC/SNAP header generally always proceeds the 802.3 header.


libnet_ptag_t libnet_build_arp(u_short hrd, u_short pro,
u_short hln, u_short pln, u_short op, u_char *sha, u_char
*spa, u_char *tpa, u_char *tpa, u_char *payload, u_long
payload_s, libnet_t *1, libnet_ptag_t ptag);

libnet_build_arp() builds an Address Resolution Protocol (ARP) header. Depending on the op value, the function builds one of several different types of RFC 826 ARP or RFC 903 RARP packets. The function takes arguments (see Table 3.11).

Table 3.11: libnet_build_arp() Arguments

ARGUMENT

MEANING


hrd

hardware address format


pro

protocol address format


hln

hardware address length


pln

protocol address length


op

ARP operation type


sha

sender's hardware address


spa

sender's protocol address


tha

target's hardware address


tpa

target's protocol address

Table 3.12 summarizes the different symbolic constants associated with hrd.

Table 3.12: libnet_build_arp() Hardware Address Symbolic Constants

CONSTANT

MEANING


ARPHRD_NETROM

KA9Q: NET/ROM pseudo


ARPHRD_ETHER

Ethernet (10Mbps and higher)


ARPHRD_EETHER

Experimental Ethernet (3Mbps)


ARPHRD_AX25

Amateur Radio AX.25 Level 2


ARPHRD_PRONET

PROnet token ring


ARPHRD_CHAOS

Chaosnet


ARPHRD_IEEE802

IEEE 802.2 networks


ARPHRD_ARCNET

ARCnet


ARPHRD_APPLETLK

APPLEtalk


ARPHRD_DLCI

Frame Relay DLCI


ARPHRD_ATM

ATM


ARPHRD_METRICOM

Metricom STRIP


ARPHRD_IPSEC

IP sec tunnel

Table 3.6 summarizes the different symbolic constants for pro. Table 3.13 summarizes the different symbolic constants associated with op.

Table 3.13: libnet_build_arp() Operation Type Symbolic Constants

CONSTANT

MEANING


ARPOP_REQUEST

request


ARPOP_REPLY

reply


ARPOP_REVREQUEST

request reverse (RARP)


ARPOP_REVREPLY

reply reverse (RARP)


ARPOP_INVREQUEST

InARP request


ARPOP_INVREPLY

InARP reply


libnet_ptag_t libnet_build_bootpv4(u_char opcode, u_char
htype, u_char hlen, u_char hopcount, u_long xid, u_short
secs, u_short unused, u_long cip, u_long yip, u_long sip,
u_long gip, u_char *payload, u_long payload_s, libnet_t *1,
libnet_ptag_t ptag);

libnet_build_bootpv4() builds an IP version 4 RFC 951 Bootstrap Protocol header. The function takes arguments (see Table 3.14).

Table 3.14: libnet_build_bootpv4() Arguments

ARGUMENT

MEANING


opcode

operation code


htype

hardware address type


hlen

hardware length


hopcount

hop count used by proxy servers


xid

transaction id


secs

number of seconds since transaction began


unused

unused or used as flags


cip

client IP address


yip

your IP address


sip

server IP address


gip

gateway IP address

The BOOTP protocol also accepts optional additional variable length and size arguments. To include these, the programmer uses the payload interface. Table 3.15 summarizes the opcode symbolic constants.

Table 3.15: libnet_build_bootpv4() Operation Code Symbolic Constants

CONSTANT

MEANING


LIBNET_DHCP_REQUEST

DHCP/BOOTP request


LIBNET_DHCP_REPLY

DHCP/BOOTP reply


libnet_ptag_t libnet_build_cdp(u_char version, u_char ttl,
u_short sum, u_short type, u_short len, u_char *value, u_char
*payload, u_long payload_s, libnet_t *l, libnet_ptag_t ptag);

libnet_build_cdp() builds a Cisco Discovery Protocol (CDP) header. Cisco Systems designed CDP to aid in the network management of adjacent Cisco devices. The function takes arguments (see Table 3.16).

Table 3.16: libnet_build_cdp() Arguments

ARGUMENT

MEANING


version

version


ttl

time information in the packet should be retained by the recipient


sum

checksum


type

packet type


len

length of the value argument in bytes


value

a type defined byte string

The CDP protocol also accepts an arbitrary number of additional "type / length / value" arguments. To include these, the programmer could either use the payload interface or libnet_build_data() to construct them. Table 3.17 summarizes the type symbolic constants.

Table 3.17: libnet_build_cdp() Type Symbolic Constants

CONSTANT

MEANING


LIBNET_CDP_DEVID

device id


LIBNET_CDP_ADDRESS

address(es) for the interface the CDP packet is being sent on


LIBNET_CDP_PORTID

port id for the interface the CDP packet is being sent on


LIBNET_CDP_CAPABIL

device capabilities


LIBNET_CDP_VERSION

software version


LIBNET_CDP_PLATFORM

hardware platform


LIBNET_CDP_IPPREFIX

ip prefix


libnet_ptag_t libnet_build_data(u_char *payload, u_long
payload_s, libnet_t *1, libnet_ptag_t ptag);

libnet_build_data() builds a generic data unit. This function does not build a specific protocol header; rather, it appends an application programmer-specified block of data to the end of the packet list. Other than having no header arguments, it behaves exactly the same as every other protocol builder function.


libnet_ptag_t libnet_build_dhcpv4(u_char opcode, u_char
htype, u_char hlen, u_char hopcount, u_long xid, u_short
secs, u_short flags, u_long cip, u_long yip, u_long sip,
u_long gip, u_char *payload, u_long payload_s, libnet_t *1,
libnet_ptag_t ptag);

libnet_build_dhcpv4() builds an IP version 4 RFC 2131 Dynamic Host Configuration Protocol header. The use of this function is identical to libnet_build_bootpv4().


libnet_ptag_t libnet_build_dnsv4(u_short id, u_short flags,
u_short num_q, u_short num_anws_rr, u_short num_auth_rr,
u_short num_addi_rr, u_char *payload, u_long payload_s,
libnet_t *1, libnet_ptag_t ptag);

libnet_build_dnsv4() builds an RFC 1035 IP version 4 DNS header. The function takes arguments (see Table 3.18).

Table 3.18: libnet_build_dnsv4() Arguments

ARGUMENT

MEANING


id

ID


flags

control flags


num_q

number of questions


num_anws_rr

number of answer resource records


num_auth_rr

number of authority resource records


num_addi_rr

number of additional resource records


libnet_ptag_t libnet_build_ethernet(u_char *dst, u_char *src,
u_short type, u_char *payload, u_long payload_s, libnet_t *1,
libnet_ptag_t ptag);

libnet_build_ethernet() builds an RFC 894 Ethernet II header. The RFC 894 Ethernet II header is almost identical to the IEEE 802.3 header, with the exception that the field immediately following the source address holds the layer 3 protocol (as opposed to frame's length). You should only use this function when libnet is initialized with the LIBNET_LINK interface. The function takes arguments (see Table 3.19).

Table 3.19: libnet_build_ethernet() Arguments

ARGUMENT

MEANING


dst

destination Ethernet address


src

source Ethernet address


type

type of data to follow (upper layer protocol)

The type symbolic constants are the Ethernet type symbolic constants in Table 3.6.


libnet_ptag_t libnet_autobuild_ethernet(u_char *dst, u_short type,
libnet_t *1);

libnet_autobuild_ethernet() auto builds an Ethernet protocol header. The function is useful to build an Ethernet header quickly when the extra functionality is not needed. The function takes the same dst and type arguments (see Table 3.19). The function does not accept a ptag argument, but it does return a ptag. In other words, you can use it to build a new Ethernet header but not to modify an existing one.


libnet_ptag_t libnet_build_icmpv4_echo(u_char type, u_char
code, u_short sum, u_short id, u_short seq, u_char *payload,
u_long payload_s, libnet_t *1, libnet_ptag_t ptag);

libnet_build_icmpv4_echo() builds an IP version 4 RFC 792 Internet Control Message Protocol echo request/reply header. The function takes arguments (see Table 3.20).

Table 3.20: libnet_build_icmpv4_echo() Arguments

ARGUMENT

MEANING


type

type of ICMP packet (should be ICMP_ECHOREPLY or ICMP_ECHO)


code

code of ICMP packet (should be 0)


sum

checksum


id

identification number


seq

sequence number


libnet_ptag_t libnet_build_icmpv4_mask(u_char type, u_char
code, u_short sum, u_short id, u_short seq, u_long mask,
u_char *payload, u_long payload_s, libnet_t *1,
libnet_ptag_t ptag);

libnet_build_icmpv4_mask() builds an IP version 4 RFC 792 Internet Control Message Protocol IP netmask request/reply header. The function takes arguments (see Table 3.21).

Table 3.21: libnet_build_icmpv4_mask() Arguments

ARGUMENT

MEANING


type

type of ICMP packet (should be ICMP_MASKREQ or ICMP_MASKREPLY)


code

code of ICMP packet (should be 0)


sum

checksum


id

identification number


seq

sequence number


mask

subnet mask


libnet_ptag_t libnet_build_icmpv4_timestamp(u_char type,
u_char code, u_short sum, u_short id, u_short seq, n_time
otime, n_time rtime, n_time ttime, u_char *payload, u_long
payload_s, libnet_t *1, libnet_ptag_t ptag);

libnet_build_icmpv4_timestamp() builds an IP version 4 RFC 792 Internet Control Message Protocol timestamp request/reply header. The function takes arguments (see Table 3.22).

Table 3.22: libnet_build_icmpv4_timestamp() Arguments

ARGUMENT

MEANING


type

type of ICMP packet (should be ICMP_TSTAMP or ICMP_TSTAMPREPLY)


code

code of ICMP packet (should be 0)


sum

checksum


id

identification number


seq

sequence number


otime

originate timestamp


rtime

receive timestamp


ttime

transmit timestamp


libnet_ptag_t libnet_build_icmpv4_unreach(u_char type, u_char
code, u_short sum, u_short orig_len, u_char
orig_tos, u_short orig_id, u_short orig_frag, u_char orig_ttl, u_char
orig_prot, u_short orig_check, u_long orig_src, u_long
orig_dst, u_char *payload, u_long payload_s, libnet_t *1,
libnet_ptag_t ptag);

libnet_build_icmpv4_unreach() builds an IP version 4 RFC 792 Internet Control Message Protocol unreachable header. The function takes arguments (see Table 3.23). The additional arguments enable the application programmer to easily specify the original IP header values (the IP header of the packet that supposedly caused the ICMP unreachable message in the first place).

Table 3.23: libnet_build_icmpv4_unreach() Arguments

ARGUMENT

MEANING


type

type of ICMP packet (should be ICMP_UNREACH)


code

code of ICMP packet (should be one of the 16 unreachable codes)


sum

checksum


orig_id

original IP header identification


orig_frag

original IP header fragmentation information


orig_ttl

orginal IP header time to live


orig_prot

original IP header protocol


orig_check

original IP header checksum


orig_src

original IP header source address


orig_dst

original IP header destination address


libnet_ptag_t libnet_build_icmpv4_timeexceed(u_char type,
u_char code, u_short sum, u_short orig_len, u_char orig_tos,
u_short orig_id, u_short orig_frag, u_char orig_ttl, u_char
orig_prot, u_short orig_check, u_long orig_src, u_long
orig_dst, u_char *payload, u_long payload_s, libnet_t *l,
libnet_ptag_t ptag);

libnet_build_icmpv4_timeexceed() builds an IP version 4 RFC 792 Internet Control Message Protocol time exceeded header. The function takes arguments (see Table 3.24). The additional arguments enable the application programmer to easily specify the original IP header values (the IP header of the packet that supposedly caused the ICMP time exceeded message in the first place).

Table 3.24: libnet_build_icmpv4_timeexceed() Arguments

ARGUMENT

MEANING


type

type of ICMP packet (should be ICMP_TIMXCEED)


code

code of ICMP packet (should be either ICMP_TIMXCEED_INTRANS or ICMP_TIMXCEED_REASS)


sum

checksum


orig_id

original IP header identification


orig_frag

original IP header fragmentation information


orig_ttl

orginal IP header time to live


orig_prot

original IP header protocol


orig_check

original IP header checksum


orig_src

original IP header source address


orig_dst

original IP header destination address


libnet_ptag_t libnet_build_icmpv4_redirect(u_char type,
u_char code, u_short sum, u_long gateway, u_short orig_len,
u_char orig_tos, u_short orig_id, u_short orig_frag, u_char
orig_ttl, u_char orig_prot, u_short orig_check, u_long
orig_src, u_long orig_dst, u_char *payload, u_long payload_s,
libnet_t *1, libnet_ptag_t ptag);

libnet_build_icmpv4_redirect() builds an IP version 4 RFC 792 Internet Message Control Protocol redirect header. The function takes arguments (see Table 3.25). The additional arguments enable the application programmer to easily specify the original IP header values (the IP header of the packet that supposedly caused the ICMP redirect message in the first place).

Table 3.25: libnet_build_icmpv4_redirect() Arguments

ARGUMENT

MEANING


type

type of ICMP packet (should be ICMP_REDIRECT)


code

code of ICMP packet (should be one of the four redirect codes)


sum

checksum


orig_id

original IP header identification


orig_frag

original IP header fragmentation information


orig_ttl

original IP header time to live


orig_prot

original IP header protocol


orig_check

original IP header checksum


orig_src

original IP header source address


orig_dst

original IP header destination address


libnet_ptag_t libnet_build_ipv4(u_short len, u_char tos,
u_short id, u_short frag, u_char ttl, u_char prot, u_short
sum, u_long src, u_long dst, u_char *payload, u_long
payload_s, libnet_t *1, libnet_ptag_t ptag);

libnet_build_ipv4() builds a version 4 RFC 791 Internet Protocol header. The function takes arguments (see Table 3.26). Table 3.27 summarizes the tos symbolic constants. Table 3.28 summarizes the frag symbolic constants.

Table 3.26: libnet_build_ipv4() Arguments

ARGUMENT

MEANING


len

total length of the IP packet


tos

type of service bits


id

IP identification number


frag

fragmentation bits and offset


ttl

time to live in the network


prot

upper layer protocol


sum

checksum


src

source IPv4 address (little endian)


dst

destination IPv4 address (little endian)

Table 3.27: libnet_build_ipv4() tos Symbolic Constants

CONSTANT

MEANING


IPTOS_LOWDELAY

type of service, minimize delay


IPTOS_THROUGHPUT

type of service, maximize throughput


IPTOS_RELIABILITY

type of service, maximize reliability


IPTOS_LOWCOST

type of service, minimize monetary cost

Table 3.28: libnet_build_ipv4() frag Symbolic Constants

CONSTANT

MEANING


IP_RF

reserved fragmentation bit


IP_DF

don't fragment this datagram


IP_MF

more fragments coming


IP_OFFMASK

mask used to get offset

The protocol field can be any upper-layer protocol number found in /etc/protocols on any modern UNIX system. For example, a TCP packet would have this field set to IPPROTO_TCP, and a UDP packet would have this field set to IPPROTO_UDP.


libnet_ptag_t libnet_autobuild_ipv4(u_short len, u_char prot,
u_long dst, libnet_t *1);

libnet_autobuild_ipv4() auto builds a version 4 Internet Protocol header. The function is useful to build an IP header quickly when you do not need a granular level of control. The function takes the same len, prot, and dst arguments (see Table 3.26). The function does not accept a ptag argument, but it does return a ptag. In other words, you can use it to build a new IP header but not to modify an existing one.


libnet_ptag_t libnet_build_ipv4_options(u_char *options,
u_long options_s, libnet_t *1, libnet_ptag_t ptag);

libnet_build_ipv4_options() builds an IP version 4 options header. The function takes arguments (see Table 3.29).

Table 3.29: libnet_build_ipv4_options() Arguments

ARGUMENT

MEANING


options

the byte string of options


options_s

the length of the options string

The function expects options to be a valid IP options string of size options_s, no larger than 40 bytes (the maximum size of an options string). The function checks to make sure that the preceding header is an IPv4 header and that the options string would not result in a packet larger than 65,535 bytes (IPMAXPACKET). The function counts up the number of 32-bit words in the options string and adjusts the IP header length value as necessary.


libnet_ptag_t libnet_build_ipv6(u_char tc, u_long fl, u_short
len, u_char nh, u_char hl, struct libnet_in6_addr src, struct
libnet_in6_addr dst, u_char *payload, u_long payload_s, libnet_t *l,
libnet_ptag_t ptag);

libnet_build_ipv6() builds a version 6 RFC 2460 Internet Protocol header. The function takes arguments (see Table 3.30).

Table 3.30: libnet_build_ipv6() Arguments

ARGUMENT

MEANING


tc

traffic class


fl

flow label


len

total length of the IP packet


nh

next header


hl

hop limit


src

source IPv6 address


dst

destination IPv6 address


libnet_ptag_t libnet_build_ntp(u_char leap_indicator, u_char
version, u_char mode, u_char stratum, u_char poll, u_char
precision, u_short delay_int, u_short delay_frac, u_short
dispersion_int, u_short dispersion_frac, u_long reference_id,
u_long ref_ts_int, u_long ref_ts_frac, u_long orig_ts_int,
u_long orig_ts_frac, u_long rec_ts_int, u_long rec_ts_frac,
u_long xmt_ts_int, u_long xmt_ts_frac, u_char *payload,
u_long payload_s, libnet_t *1, libnet_ptag_t ptag);

libnet_build_ntp() builds a Network Time Protocol header (RFCs 1119 and 1305). The function's massive argument list appears in Table 3.31.

Table 3.31: libnet_build_ntp() Arguments

ARGUMENT

MEANING


leap_indicator

leap indicator


version

version


mode

mode


stratum

stratum


poll

polling interval (should be between 4–12)


precision

precision


delay_int

root delay integer


delay_frac

root delay fraction


dispersion_int

dispersion integer


dispersion_frac

dispersion fraction


reference_id

reference id


ref_ts_int

reference timestamp integer


ref_ts_frac

reference timestamp fraction


orig_ts_int

originate timestamp integer


orig_ts_frac

originate timestamp fraction


rec_ts_int

receive timestamp integer


rec_ts_frac

receive timestamp fraction


xmt_ts_int

transmit timestamp integer


xmt_ts_frac

transmit timestamp fraction

Table 3.32 summarizes the leap_indicator symbolic constants.

Table 3.32: libnet_build_ntp() leap Indicator Symbolic Constants

CONSTANT

MEANING


LIBNET_NTP_LI_NW

no warning


LIBNET_NTP_LI_AS

the last minute has 61 seconds


LIBNET_NTP_LI_DS

the last minute has 59 seconds


LIBNET_NTP_LI_AC

alarm condition

Table 3.33 summarizes the version symbolic constants.

Table 3.33: libnet_build_ntp() version Symbolic Constants

CONSTANT

MEANING


LIBNET_NTP_VN_2

version 2


LIBNET_NTP_VN_3

version 3


LIBNET_NTP_VN_4

version 4

Table 3.34 summarizes the mode symbolic constants.

Table 3.34: libnet_build_ntp() mode Symbolic Constants

CONSTANT

MEANING


LIBNET_NTP_MODE_R

reserved


LIBNET_NTP_MODE_A

symmetric active


LIBNET_NTP_MODE_P

symmetric passive


LIBNET_NTP_MODE_C

client


LIBNET_NTP_MODE_S

server


LIBNET_NTP_MODE_B

broadcast


LIBNET_NTP_MODE_RC

reserved for NTP control messages


LIBNET_NTP_MODE_RP

reserved for private use

Table 3.35 summarizes the stratum symbolic constants. In addition to those listed, the NTP protocol specifies that stratum values from 0x2-0xf are considered secondary, and values from 0x10-0xff are reserved.

Table 3.35: libnet_build_ntp() stratum Symbolic Constants

CONSTANT

MEANING


LIBNET_NTP_STRATUM_UNAVAIL

unspecified or unavailable


LIBNET_NTP_STRATUM_PRIMARY

primary reference (radio clock)

Table 3.36 summarizes the reference_id symbolic constants.

Table 3.36: libnet_build_ntp() reference id Symbolic Constants

CONSTANT

MEANING


LIBNET_NTP_REF_LOCAL

uncalibrated local clock


LIBNET_NTP_REF_PPS

atomic / pps clock


LIBNET_NTP_REF_ACTS

NIST dial-up modem


LIBNET_NTP_REF_USNO

USNO modem service


LIBNET_NTP_REF_PTB

PTB (German) modem service


LIBNET_NTP_REF_TDF

Allouis (French) radio


LIBNET_NTP_REF_DCF

MainFlingen (German) radio


LIBNET_NTP_REF_MSF

Rugby (UK) radio


LIBNET_NTP_REF_WWV

Ft. Collins (US) radio


LIBNET_NTP_REF_WWVB

Boulder (US) radio


LIBNET_NTP_REF_WWVH

Kaui Hawaii (US) radio


LIBNET_NTP_REF_CHU

Ottawa (Canada) radio


LIBNET_NTP_REF_LORC

LORAN-C radionavigation


LIBNET_NTP_REF_OMEG

OMEGA radionavigation


LIBNET_NTP_REF_GPS

global positioning system


LIBNET_NTP_REF_GOES

geostationary orbit environment satellite


libnet_ptag_t libnet_build_ospfv2(u_short len, u_char type,
u_long rtr_id, u_long area_id, u_short sum, u_short autype,
u_char *payload, u_long payload_s, libnet_t *1,
libnet_ptag_t ptag);

libnet_build_ospfv2() builds a version 2 RFC 2328 Open Shortest Path First Protocol header. This function builds the top level OSPF header while the functions following it build OSPF subheaders. The function takes arguments (see Table 3.37). Table 3.38 summarizes the type symbolic constants. Table 3.39 summarizes the autype symbolic constants.

Table 3.37: libnet_build_ospfv2() Arguments

ARGUMENT

MEANING


len

total length of the OSPF packet


type

type of OSPF packet


rtr_id

source router id


area_id

roaming id


sum

checksum


autype

authentication type

Table 3.38: libnet_build_ospfv2() type Symbolic Constants

CONSTANT

MEANING


LIBNET_OSPF_HELLO

hello packet


LIBNET_OSPF_DBD

database description packet


LIBNET_OSPF_LSR

link state request packet


LIBNET_OSPF_LSU

link state update packet


LIBNET_OSPF_LSA

link state acknowledgement packet

Table 3.39: libnet_build_ospfv2() autype Symbolic Constants

CONSTANT

MEANING


LIBNET_OSPF_AUTH_NULL

no authentication


LIBNET_OSPF_AUTH_SIMPLE

simple eight character password


LIBNET_OSPF_AUTH_MD5

MD5 hash


libnet_ptag_t libnet_build_ospfv2_hello(u_long netmask,
u_short interval, u_char opts, u_char priority, u_int
dead_int, u_long des_rtr, u_long bkup_rtr, u_long neighbor,
u_char *payload, u_long payload_s, libnet_t *1,
libnet_ptag_t ptag);

libnet_build_ospfv2_hello() builds an Open Shortest Path First Protocol Hello header. The function takes arguments (see Table 3.40).

Table 3.40: libnet_build_ospfv2_hello() Arguments

ARGUMENT

MEANING


netmask

netmask associated with the interface


interval

number of seconds between the router's last packet


opts

options


priority

router priority


dead_int

number of seconds of silence before router is deemed down


des_rtr

designated router


bkup_rtr

backup router


neighbor

neighbor router

You can add additional neighbor routers as needed by using either the pay-load interface or libnet_build_data().


libnet_ptag_t libnet_build_ospfv2_dbd(u_short dgram_len,
u_char opts, u_char type, u_int seqnum, u_char *payload,
u_long payload_s, libnet_t *1, libnet_ptag_t ptag);

libnet_build_ospfv2_dbd() builds an OSPF database description header. The function takes arguments (see Table 3.41). The type symbolic constants appear in Table 3.42.

Table 3.41: libnet_build_ospfv2_dbd() Arguments

ARGUMENT

MEANING


dgram_len

MTU of interface


opts

options


type

type of exchange


seqnum

dbd sequence number

Table 3.42: libnet_build_ospfv2_dbd() type Symbolic Constants

CONSTANT

MEANING


LIBNET_DBD_IBI

initialization


LIBNET_DBD_MBIT

more DBD packets en route


LIBNET_DBD_MSBIT

sender is master during this exchange


libnet_ptag_t libnet_build_ospfv2_lsr(u_int type, u_int lsid,
u_long advrtr, u_char *payload, u_long payload_s, libnet_t
*1, libnet_ptag_t ptag);

libnet_build_ospfv2_lsr() builds an OSPF link state request header. The function takes arguments (see Table 3.43).

Table 3.43: libnet_build_ospfv2_lsr() Arguments

ARGUMENT

MEANING


type

type of link state


lsid

link state id


advrtr

advertising router

All link state packets use type symbolic constants summarized in Table 3.44. You can add additional advrtr routers as needed by using the payload interface or libnet_build_data().

Table 3.44: libnet_build_ospfv2_lsr() type Symbolic Constants

CONSTANT

MEANING


LIBNET_LS_TYPE_RTR

router LSA


LIBNET_LS_TYPE_NET

network LSA


LIBNET_LS_TYPE_IP

summary LSA (IP Network)


LIBNET_LS_TYPE_ASBR

summary-LSA (ASBR)


LIBNET_LS_TYPE_ASEXT

AS external LSA


libnet_ptag_t libnet_build_ospfv2_lsu(u_int num, u_char
*payload, u_long payload_s, libnet_t *l, libnet_ptag_t ptag);

libnet_build_ospfv2_lsu() builds an OSPF link state update header. num contains the number of link state advertisements to be broadcasted.


libnet_ptag_t libnet_build_ospfv2_lsa(u_short age, u_char
opts, u_char type, u_int lsid, u_long advrtr, u_int seqnum,
u_short sum, u_short len, u_char *payload, u_long
payload_s, libnet_t *1, libnet_ptag_t ptag);

libnet_build_ospfv2_lsa() builds an OSPF link state acknowledgment header. The function takes arguments (see Table 3.45).

Table 3.45: libnet_build_ospfv2_lsa() Arguments

ARGUMENT

MEANING


age

time in seconds since LSA originated


opts

options


type

type


lsid

link state id


advrtr

advertising router


seqnum

sequence number


sum

checksum


len

length of LSA packet


libnet_ptag_t libnet_build_rip(u_char cmd, u_char version,
u_short rd, u_short af, u_short rt, u_long addr, u_long mask,
u_long next_hop, u_long metric, u_char *payload, u_long
payload_s, libnet_t *1, libnet_ptag_t ptag);

libnet_build_rip() builds a Routing Information Protocol header (RFCs 1058 and 2453). The function takes arguments (see Table 3.46). Table 3.47 summarizes the RIP cmd symbolic constants.

Table 3.46: libnet_build_rip() Arguments

ARGUMENT

MEANING


cmd

command


version

version


rd

zero (vl) or routing domain (v2)


af

address family


rt

zero (v1) or route tag (v2)


addr

IP address


mask

zero (vl) or subnet mask (v2)


next_hop

zero (vl) or next hop IP address (v2)


metric

routing metric

Table 3.47: libnet_build_rip() command Symbolic Constants

CONSTANT

MEANING


RIPCMD_REQUEST

request


RIPCMD_RESPONSE

response


RIPCMD_TRACEON

turn tracing on


RIPCMD_TRACEOFF

turn tracing off


RIPCMD_POLL

like a request, but anyone answers


RIPCMD_POLLENTRY

like a poll, but for entire entry


libnet_ptag_t libnet_build_stp(u_short id, u_char version,
u_char bpdu_type, u_char flags, u_char *root_id, u_long
root_pc, u_char *bridge_id, u_short port_id, u_short

message_age, u_short max_age, u_short hello_time, u_short
f_delay, u_char *payload, u_long payload_s, libnet_t *1,
libnet_ptag_t ptag);

libnet_build_stp() builds an IEEE 802.1d Spanning Tree Protocol header. The function takes arguments (see Table 3.48).

Table 3.48: libnet_build_stp() Arguments

ARGUMENT

MEANING


id

protocol id


version

protocol version


bpdu_type

bridge protocol data unit type


flags

flags


root_id

root id


root_pc

root path cost


bridge_id

bridge id


port_id

port id


message_age

message age


max_age

max age


hello_time

hello time


f_delay

forward delay


libnet_ptag_t libnet_ptag_t libnet_build_tcp(u_short sp,
u_short dp, u_long seq, u_long ack, u_char control, u_short
win, u_short sum, u_short urg, u_short len, u_char *payload,
u_long payload_s, libnet_t *1, libnet_ptag_t ptag);

libnet_build_tcp() builds an RFC 793 Transmission Control Protocol header. The function takes arguments (see Table 3.49). Table 3.50 summarizes the TCP control flag symbolic constants.

Table 3.49: libnet_build_tcp() Argument

ARGUMENT

MEANING


sp

source port


dp

destination port


seq

sequence number


ack

acknowledgment number


control

control flags


win

window size


sum

checksum


len

total length of the TCP packet

Table 3.50: libnet_build_tcp() control flag Symbolic Constants

CONSTANT

MEANING


TH_FIN

finished sending data


TH_SYN

synchronize sequence numbers


TH_RST

reset the connection


TH_PUSH

push data to the application layer


TH_ACK

acknowledgment field should be checked


TH_URG

packet contains urgent data pointed to by the urgent pointer


libnet_ptag_t libnet_build_tcp_options(u_char *options,
u_long options_s, libnet_t *1, libnet_ptag_t ptag);

libnet_build_tcp_options() builds a TCP options header. The function takes arguments (see Table 3.51).

Table 3.51: libnet_build_tcp_options() Arguments

ARGUMENT

MEANING


options

the byte string of options


options_s

the length of the options string

The function expects options to be a valid TCP options string of size options_s, which is no larger than 40 bytes (the maximum size of an options string). The function checks to make sure that the packet consists of a TCP header preceded by an IPv4 header and that the addition of the options string would not result in a packet larger than 65,535 bytes (IPMAXPACKET). The function counts the number of 32-bit words in the options string and adjusts the TCP header length value as necessary.


libnet_ptag_t libnet_build_udp(u_short sp, u_short dp,
u_short len, u_short sum, u_char *payload, u_long payload_s,
libnet_t *1, libnet_ptag_t ptag);

libnet_build_udp() builds an RFC 768 User Datagram Protocol (UDP) header. The function takes arguments (see Table 3.52).

Table 3.52: libnet_build_udp() Arguments

ARGUMENT

MEANING


sp

source port


dp

destination port


len

total length of the UDP packet


sum

checksum


libnet_ptag_t libnet_build_vrrp(u_char version, u_char type,
u_char vrouter_id, u_char priority, u_char ip_count, u_char
auth_type, u_char advert_int, u_short sum, u_char *payload,
u_long payload_s, libnet_t *l,libnet_ptag_t ptag);

libnet_build_vrrp() builds an RFC 2338 Virtual Router Redundancy Protocol header. The function takes arguments (see Table 3.53).

Table 3.53: libnet_build_vrrp() Arguments

ARGUMENT

MEANING


version

version


type

type of VRRP packet


vrouter_id

virtual router id


priority

priority


ip_count

number of IP addresses


auth_type

authentication type


advert_int

advertisement interval


sum

checksum

ver should either be LIBNET_VERP_VERSION_01 for version one or LIB-NET_VRRP_VERSION_02 for version two. At this writing, libnet only has intrinsic support for VRRP advertisements; the type should be LIBNET_VRRP_TYPE_ADVERT. You can add IP addresses as needed by using the pay-load interface or libnet_build_data(). Table 3.54 summarizes the auth_type symbolic constants.

Table 3.54: libnet_build_vrrp() authentication type Symbolic Constants

CONSTANT

MEANING


LIBNET_VRRP_AUTH_NONE

No authentication


LIBNET_VRRP_AUTH_PASSWD

Password authentication


LIBNET_VRRP_AUTH_IPAH

IPsec-based authentication


int libnet_toggle_checksum(libnet_t *1, libnet_ptag_t ptag,
int mode);

libnet_toggle_checksum() controls the disposition of libnet's automatic checksum calculation feature for the protocol block that ptag referenced. If mode is LIBNET_ON, then libnet computes the proper checksum for the ptag in question (assuming that it has a checksum field). If mode is LIB-NET_OFF, libnet will not compute the checksum. Upon success, the function returns 1; upon failure, the function returns -1 and libnet_geterror() tells you why.