Annotation of embedaddon/libnet/doc/MIGRATION, revision 1.1
1.1 ! misho 1: ===============================================================================
! 2: $Id: MIGRATION,v 1.2 2004/01/03 20:31:00 mike Exp $
! 3: LIBNET 1.1 (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com>
! 4: http://www.packetfactory.net/libnet
! 5: ===============================================================================
! 6:
! 7:
! 8: MIGRATING YOUR CODE AND QUICKSTART
! 9:
! 10: Using Libnet 1.1 you will find it MUCH simpler to build and write packets
! 11: than before. Instead of the previous five steps (initialize memory,
! 12: initialize network, build packet, do checksums, write packet) there are
! 13: now only three steps (initialize library, build packet, write packet).
! 14: In order to port your existing code, you will mainly be REMOVING
! 15: function calls and variables.
! 16:
! 17: 1) Start with code removal:
! 18:
! 19: - Remove all calls to libnet_init_packet() / packet malloc()ing and
! 20: all associated variables.
! 21: - Remove all calls to libnet_open_raw_sock() / libnet_open_link_layer()
! 22: and all associated variables.
! 23: - Remove all calls to libnet_do_checksum() and all associated
! 24: variables.
! 25:
! 26: 2) Continue with code addition and modification:
! 27:
! 28: - You will need a single "libnet_t *l" which is your libnet file
! 29: context and an error buffer:
! 30:
! 31: libnet_t *l
! 32: char errbuf[LIBNET_ERRBUF_SIZE];
! 33:
! 34: l = libnet_init(
! 35: LIBNET_RAW4, /* or LIBNET_LINK or LIBNET_RAW6 */
! 36: NULL, /* or device if you using LIBNET_LINK */
! 37: errbuf);
! 38:
! 39: - The libnet_build functions are largely unchanged with a few
! 40: important differences:
! 41:
! 42: 1) Packets headers MUST be stacked IN ORDER. This is
! 43: intuitive and shouldn't be a problem. Due to the way
! 44: individual packet header memory is allocated and how
! 45: packet pieces are combined to build a packet they HAVE to
! 46: be built IN ORDER, from the high end of the protocol stack
! 47: on down. ie: using the raw interface to build a NTP
! 48: packet, you would:
! 49: libnet_build_ntp(...)
! 50: libnet_build_udp(...)
! 51: libnet_build_ipv4(...)
! 52: To build the same packet using the LINK interface on
! 53: top of ethernet you would:
! 54: libnet_build_ntp(...)
! 55: libnet_build_udp(...)
! 56: libnet_build_ipv4(...)
! 57: libnet_build_ethernet(...)
! 58: 1a) There is the option now of using libnet_autobuild_ipv4()
! 59: and libnet_autobuild_ethernet() which have fewer
! 60: arguments and smaller stack frames and are a bit more
! 61: convenient.
! 62: 2) The libnet_build functions return a libnet_ptag_t datatype
! 63: on success or -1 on error. This ptag is your
! 64: "protocol/packet tag" so you can find this header again
! 65: if you needed to modify it later on. If you don't need
! 66: to modify the packet header you can throw this value
! 67: away. You should definitely check for error now on
! 68: your build functions. Alot's going on down there fellas.
! 69: 2a) NOTE that after packets are built, they may accessed
! 70: independently of construction order via the saved ptag.
! 71: 3) They NO LONGER ACCEPT BUFFER ARGUMENTS. This is ALL
! 72: done internally. The last TWO arguments are the libnet
! 73: context you created in your call to libnet_init() and
! 74: an OPTIONAL ptag argument. The ptag argument, if non-zero,
! 75: specifes a packet tag to an ALREADY EXISTING packet header
! 76: that will be OVERWRITTEN with the values specified in
! 77: this libnet_build function call. This is how you modify
! 78: existing packet header pieces. If this ptag is 0,
! 79: a new protocol block is allocated and the packet is
! 80: pushed down on the "protocol stack".
! 81: 4) For the functions that build headers that have checksums
! 82: these are NOW SPECIFIED AS AN ARGUMENT. This adds more
! 83: flexibility in how checksums are done (you can leave the
! 84: field 0, put in a random value, precompute it on your own,
! 85: or let the library do it). By default, when you build
! 86: a header, a "DO_CHECKSUM" flag will be set. This means
! 87: the library will compute the checksum for the header
! 88: and possibly over the data before the packet is written.
! 89: To clear this flag, there is a special macro you
! 90: can call on the ptag refering to that header.
! 91: 5) For the functions that have a length, it now specifies
! 92: the TOTAL packet length from that protocol unit on down.
! 93: For IP, that would be the entire packet length. For
! 94: TCP, that would be TCP and any possible data.
! 95: 6) Nomenclature support for the eventual support of ipv6
! 96: has been added.
! 97:
! 98: libnet_ptag_t ip_tag;
! 99: libnet_ptag_t tcp_tag;
! 100:
! 101: tcp_tag = libnet_build_tcp(
! 102: src_prt, /* source TCP port */
! 103: dst_prt, /* destination TCP port */
! 104: 0xffff, /* sequence number */
! 105: 0x53, /* acknowledgement number */
! 106: TH_SYN, /* control flags */
! 107: 1024, /* window size */
! 108: 0xd00d, /* checksum */
! 109: 0, /* urgent pointer */
! 110: LIBNET_TCP_H /* TCP packet size */
! 111: NULL, /* payload (none) */
! 112: 0, /* payload length */
! 113: l, /* libnet context */
! 114: 0); /* ptag */
! 115:
! 116: ip_tag = libnet_build_ipv4(
! 117: LIBNET_TCP_H + LIBNET_IPV4_H,/* total packet len */
! 118: IPTOS_LOWDELAY, /* tos */
! 119: ip_id, /* IP ID */
! 120: 0, /* IP Frag */
! 121: 64, /* TTL */
! 122: IPPROTO_TCP, /* protocol */
! 123: 0, /* checksum */
! 124: src_ip, /* source ip */
! 125: dst_ip, /* dest ip */
! 126: NULL, /* payload (none) */
! 127: 0, /* payload size */
! 128: l, /* libnet context */
! 129: 0); /* ptag */
! 130:
! 131: Now, if you wanted to modify one of these headers in a loop
! 132: somewhere you would:
! 133:
! 134: int i;
! 135: for (ip_tag, tcp_tag = LIBNET_PTAG_INITIALIZER, i = 0; i < 10; i++)
! 136: {
! 137: tcp_tag = libnet_build_tcp(++src_prt, ..., l, tcp_tag);
! 138: ip_tag = libnet_build_ipv4(..., ++ip_id, ..., l, ip_tag);
! 139: /* do something */
! 140: }
! 141: Since we are specifying a ptag for an existing header, the
! 142: build function will NOT create a new header and append it to
! 143: the list, it will FIND the one referenced by the ptag and UPDATE
! 144: it. Since there is nothing new being created, order is NOT
! 145: important here.
! 146:
! 147: Also note that it's perfectly fine to wrap the loop around the
! 148: initial building of the packets. Since we're initializing the
! 149: ptags (to be zero), the first call into the builder functions
! 150: will allocate the memory and create the packet blocks. These
! 151: calls will return ptag values. The next calls will modify
! 152: these headers since the ptags will not be NULL.
! 153:
! 154: - Finally, we write the packet. Checksums are computed, by default
! 155: for each protocol header that requires one. If the user specifies
! 156: a non-zero value, by default, this will be used INSTEAD of a
! 157: libnet computed checksum. This behavior is overridable with:
! 158:
! 159: Turn ON checksums for header referenced by ptag:
! 160: libnet_toggle_checksum(l, ptag, 1)
! 161:
! 162: Turn OFF checksums for header referenced by ptag:
! 163: libnet_toggle_checksum(l, ptag, 0)
! 164:
! 165: Note, the packet header MUST exist before you can toggle this setting.
! 166:
! 167: int c;
! 168: c = libnet_write(l);
! 169:
! 170: Boom. You're done. Now go read the sample code.
! 171:
! 172: EOF
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>