summaryrefslogtreecommitdiff
path: root/ext/dnet
diff options
context:
space:
mode:
authorSteve Reinhardt <stever@eecs.umich.edu>2006-05-22 14:29:33 -0400
committerSteve Reinhardt <stever@eecs.umich.edu>2006-05-22 14:29:33 -0400
commitba2eae5d528487900d1510fc0a160e660f2c394c (patch)
treea2c6dd5948f6ff353763cb3f83ddd734077e646e /ext/dnet
parent86777c9db174c74be49667bce3dda99f8ba23696 (diff)
downloadgem5-ba2eae5d528487900d1510fc0a160e660f2c394c.tar.xz
New directory structure:
- simulator source now in 'src' subdirectory - imported files from 'ext' repository - support building in arbitrary places, including outside of the source tree. See comment at top of SConstruct file for more details. Regression tests are temporarily disabled; that syetem needs more extensive revisions. SConstruct: Update for new directory structure. Modify to support build trees that are not subdirectories of the source tree. See comment at top of file for more details. Regression tests are temporarily disabled. src/arch/SConscript: src/arch/isa_parser.py: src/python/SConscript: Update for new directory structure. --HG-- rename : build/SConstruct => SConstruct rename : build/default_options/ALPHA_FS => build_opts/ALPHA_FS rename : build/default_options/ALPHA_FS_TL => build_opts/ALPHA_FS_TL rename : build/default_options/ALPHA_SE => build_opts/ALPHA_SE rename : build/default_options/MIPS_SE => build_opts/MIPS_SE rename : build/default_options/SPARC_SE => build_opts/SPARC_SE rename : Doxyfile => src/Doxyfile rename : SConscript => src/SConscript rename : arch/SConscript => src/arch/SConscript rename : arch/alpha/SConscript => src/arch/alpha/SConscript rename : arch/alpha/aout_machdep.h => src/arch/alpha/aout_machdep.h rename : arch/alpha/arguments.cc => src/arch/alpha/arguments.cc rename : arch/alpha/arguments.hh => src/arch/alpha/arguments.hh rename : arch/alpha/ecoff_machdep.h => src/arch/alpha/ecoff_machdep.h rename : arch/alpha/ev5.cc => src/arch/alpha/ev5.cc rename : arch/alpha/ev5.hh => src/arch/alpha/ev5.hh rename : arch/alpha/faults.cc => src/arch/alpha/faults.cc rename : arch/alpha/faults.hh => src/arch/alpha/faults.hh rename : arch/alpha/freebsd/system.cc => src/arch/alpha/freebsd/system.cc rename : arch/alpha/freebsd/system.hh => src/arch/alpha/freebsd/system.hh rename : arch/alpha/isa/branch.isa => src/arch/alpha/isa/branch.isa rename : arch/alpha/isa/decoder.isa => src/arch/alpha/isa/decoder.isa rename : arch/alpha/isa/fp.isa => src/arch/alpha/isa/fp.isa rename : arch/alpha/isa/int.isa => src/arch/alpha/isa/int.isa rename : arch/alpha/isa/main.isa => src/arch/alpha/isa/main.isa rename : arch/alpha/isa/mem.isa => src/arch/alpha/isa/mem.isa rename : arch/alpha/isa/opcdec.isa => src/arch/alpha/isa/opcdec.isa rename : arch/alpha/isa/pal.isa => src/arch/alpha/isa/pal.isa rename : arch/alpha/isa/unimp.isa => src/arch/alpha/isa/unimp.isa rename : arch/alpha/isa/unknown.isa => src/arch/alpha/isa/unknown.isa rename : arch/alpha/isa/util.isa => src/arch/alpha/isa/util.isa rename : arch/alpha/isa_traits.hh => src/arch/alpha/isa_traits.hh rename : arch/alpha/linux/aligned.hh => src/arch/alpha/linux/aligned.hh rename : arch/alpha/linux/hwrpb.hh => src/arch/alpha/linux/hwrpb.hh rename : arch/alpha/linux/linux.cc => src/arch/alpha/linux/linux.cc rename : arch/alpha/linux/linux.hh => src/arch/alpha/linux/linux.hh rename : arch/alpha/linux/process.cc => src/arch/alpha/linux/process.cc rename : arch/alpha/linux/process.hh => src/arch/alpha/linux/process.hh rename : arch/alpha/linux/system.cc => src/arch/alpha/linux/system.cc rename : arch/alpha/linux/system.hh => src/arch/alpha/linux/system.hh rename : arch/alpha/linux/thread_info.hh => src/arch/alpha/linux/thread_info.hh rename : arch/alpha/linux/threadinfo.hh => src/arch/alpha/linux/threadinfo.hh rename : arch/alpha/osfpal.cc => src/arch/alpha/osfpal.cc rename : arch/alpha/osfpal.hh => src/arch/alpha/osfpal.hh rename : arch/alpha/process.cc => src/arch/alpha/process.cc rename : arch/alpha/process.hh => src/arch/alpha/process.hh rename : arch/alpha/regfile.hh => src/arch/alpha/regfile.hh rename : arch/alpha/stacktrace.cc => src/arch/alpha/stacktrace.cc rename : arch/alpha/stacktrace.hh => src/arch/alpha/stacktrace.hh rename : arch/alpha/system.cc => src/arch/alpha/system.cc rename : arch/alpha/system.hh => src/arch/alpha/system.hh rename : arch/alpha/tlb.cc => src/arch/alpha/tlb.cc rename : arch/alpha/tlb.hh => src/arch/alpha/tlb.hh rename : arch/alpha/tru64/process.cc => src/arch/alpha/tru64/process.cc rename : arch/alpha/tru64/process.hh => src/arch/alpha/tru64/process.hh rename : arch/alpha/tru64/system.cc => src/arch/alpha/tru64/system.cc rename : arch/alpha/tru64/system.hh => src/arch/alpha/tru64/system.hh rename : arch/alpha/tru64/tru64.cc => src/arch/alpha/tru64/tru64.cc rename : arch/alpha/tru64/tru64.hh => src/arch/alpha/tru64/tru64.hh rename : arch/alpha/types.hh => src/arch/alpha/types.hh rename : arch/alpha/utility.hh => src/arch/alpha/utility.hh rename : arch/alpha/vtophys.cc => src/arch/alpha/vtophys.cc rename : arch/alpha/vtophys.hh => src/arch/alpha/vtophys.hh rename : arch/isa_parser.py => src/arch/isa_parser.py rename : arch/isa_specific.hh => src/arch/isa_specific.hh rename : arch/mips/SConscript => src/arch/mips/SConscript rename : arch/mips/faults.cc => src/arch/mips/faults.cc rename : arch/mips/faults.hh => src/arch/mips/faults.hh rename : arch/mips/isa/base.isa => src/arch/mips/isa/base.isa rename : arch/mips/isa/bitfields.isa => src/arch/mips/isa/bitfields.isa rename : arch/mips/isa/decoder.isa => src/arch/mips/isa/decoder.isa rename : arch/mips/isa/formats/basic.isa => src/arch/mips/isa/formats/basic.isa rename : arch/mips/isa/formats/branch.isa => src/arch/mips/isa/formats/branch.isa rename : arch/mips/isa/formats/formats.isa => src/arch/mips/isa/formats/formats.isa rename : arch/mips/isa/formats/fp.isa => src/arch/mips/isa/formats/fp.isa rename : arch/mips/isa/formats/int.isa => src/arch/mips/isa/formats/int.isa rename : arch/mips/isa/formats/mem.isa => src/arch/mips/isa/formats/mem.isa rename : arch/mips/isa/formats/noop.isa => src/arch/mips/isa/formats/noop.isa rename : arch/mips/isa/formats/tlbop.isa => src/arch/mips/isa/formats/tlbop.isa rename : arch/mips/isa/formats/trap.isa => src/arch/mips/isa/formats/trap.isa rename : arch/mips/isa/formats/unimp.isa => src/arch/mips/isa/formats/unimp.isa rename : arch/mips/isa/formats/unknown.isa => src/arch/mips/isa/formats/unknown.isa rename : arch/mips/isa/formats/util.isa => src/arch/mips/isa/formats/util.isa rename : arch/mips/isa/includes.isa => src/arch/mips/isa/includes.isa rename : arch/mips/isa/main.isa => src/arch/mips/isa/main.isa rename : arch/mips/isa/operands.isa => src/arch/mips/isa/operands.isa rename : arch/mips/isa_traits.cc => src/arch/mips/isa_traits.cc rename : arch/mips/isa_traits.hh => src/arch/mips/isa_traits.hh rename : arch/mips/linux/linux.cc => src/arch/mips/linux/linux.cc rename : arch/mips/linux/linux.hh => src/arch/mips/linux/linux.hh rename : arch/mips/linux/process.cc => src/arch/mips/linux/process.cc rename : arch/mips/linux/process.hh => src/arch/mips/linux/process.hh rename : arch/mips/process.cc => src/arch/mips/process.cc rename : arch/mips/process.hh => src/arch/mips/process.hh rename : arch/mips/regfile/float_regfile.hh => src/arch/mips/regfile/float_regfile.hh rename : arch/mips/regfile/int_regfile.hh => src/arch/mips/regfile/int_regfile.hh rename : arch/mips/regfile/misc_regfile.hh => src/arch/mips/regfile/misc_regfile.hh rename : arch/mips/regfile/regfile.hh => src/arch/mips/regfile/regfile.hh rename : arch/mips/stacktrace.hh => src/arch/mips/stacktrace.hh rename : arch/mips/types.hh => src/arch/mips/types.hh rename : arch/mips/utility.hh => src/arch/mips/utility.hh rename : arch/sparc/SConscript => src/arch/sparc/SConscript rename : arch/sparc/faults.cc => src/arch/sparc/faults.cc rename : arch/sparc/faults.hh => src/arch/sparc/faults.hh rename : arch/sparc/isa/base.isa => src/arch/sparc/isa/base.isa rename : arch/sparc/isa/bitfields.isa => src/arch/sparc/isa/bitfields.isa rename : arch/sparc/isa/decoder.isa => src/arch/sparc/isa/decoder.isa rename : arch/sparc/isa/formats.isa => src/arch/sparc/isa/formats.isa rename : arch/sparc/isa/formats/basic.isa => src/arch/sparc/isa/formats/basic.isa rename : arch/sparc/isa/formats/branch.isa => src/arch/sparc/isa/formats/branch.isa rename : arch/sparc/isa/formats/integerop.isa => src/arch/sparc/isa/formats/integerop.isa rename : arch/sparc/isa/formats/mem.isa => src/arch/sparc/isa/formats/mem.isa rename : arch/sparc/isa/formats/nop.isa => src/arch/sparc/isa/formats/nop.isa rename : arch/sparc/isa/formats/priv.isa => src/arch/sparc/isa/formats/priv.isa rename : arch/sparc/isa/formats/trap.isa => src/arch/sparc/isa/formats/trap.isa rename : arch/sparc/isa/formats/unknown.isa => src/arch/sparc/isa/formats/unknown.isa rename : arch/sparc/isa/includes.isa => src/arch/sparc/isa/includes.isa rename : arch/sparc/isa/main.isa => src/arch/sparc/isa/main.isa rename : arch/sparc/isa/operands.isa => src/arch/sparc/isa/operands.isa rename : arch/sparc/isa_traits.hh => src/arch/sparc/isa_traits.hh rename : arch/sparc/linux/linux.cc => src/arch/sparc/linux/linux.cc rename : arch/sparc/linux/linux.hh => src/arch/sparc/linux/linux.hh rename : arch/sparc/linux/process.cc => src/arch/sparc/linux/process.cc rename : arch/sparc/linux/process.hh => src/arch/sparc/linux/process.hh rename : arch/sparc/process.cc => src/arch/sparc/process.cc rename : arch/sparc/process.hh => src/arch/sparc/process.hh rename : arch/sparc/regfile.hh => src/arch/sparc/regfile.hh rename : arch/sparc/solaris/process.cc => src/arch/sparc/solaris/process.cc rename : arch/sparc/solaris/process.hh => src/arch/sparc/solaris/process.hh rename : arch/sparc/solaris/solaris.cc => src/arch/sparc/solaris/solaris.cc rename : arch/sparc/solaris/solaris.hh => src/arch/sparc/solaris/solaris.hh rename : arch/sparc/stacktrace.hh => src/arch/sparc/stacktrace.hh rename : arch/sparc/system.cc => src/arch/sparc/system.cc rename : arch/sparc/system.hh => src/arch/sparc/system.hh rename : arch/sparc/utility.hh => src/arch/sparc/utility.hh rename : base/bitfield.hh => src/base/bitfield.hh rename : base/callback.hh => src/base/callback.hh rename : base/chunk_generator.hh => src/base/chunk_generator.hh rename : base/circlebuf.cc => src/base/circlebuf.cc rename : base/circlebuf.hh => src/base/circlebuf.hh rename : base/compression/lzss_compression.cc => src/base/compression/lzss_compression.cc rename : base/compression/lzss_compression.hh => src/base/compression/lzss_compression.hh rename : base/compression/null_compression.hh => src/base/compression/null_compression.hh rename : base/cprintf.cc => src/base/cprintf.cc rename : base/cprintf.hh => src/base/cprintf.hh rename : base/cprintf_formats.hh => src/base/cprintf_formats.hh rename : base/crc.cc => src/base/crc.cc rename : base/crc.hh => src/base/crc.hh rename : base/date.cc => src/base/date.cc rename : base/dbl_list.hh => src/base/dbl_list.hh rename : base/endian.hh => src/base/endian.hh rename : base/fast_alloc.cc => src/base/fast_alloc.cc rename : base/fast_alloc.hh => src/base/fast_alloc.hh rename : base/fenv.hh => src/base/fenv.hh rename : base/fifo_buffer.cc => src/base/fifo_buffer.cc rename : base/fifo_buffer.hh => src/base/fifo_buffer.hh rename : base/hashmap.hh => src/base/hashmap.hh rename : base/hostinfo.cc => src/base/hostinfo.cc rename : base/hostinfo.hh => src/base/hostinfo.hh rename : base/hybrid_pred.cc => src/base/hybrid_pred.cc rename : base/hybrid_pred.hh => src/base/hybrid_pred.hh rename : base/inet.cc => src/base/inet.cc rename : base/inet.hh => src/base/inet.hh rename : base/inifile.cc => src/base/inifile.cc rename : base/inifile.hh => src/base/inifile.hh rename : base/intmath.cc => src/base/intmath.cc rename : base/intmath.hh => src/base/intmath.hh rename : base/kgdb.h => src/base/kgdb.h rename : base/loader/aout_object.cc => src/base/loader/aout_object.cc rename : base/loader/aout_object.hh => src/base/loader/aout_object.hh rename : base/loader/coff_sym.h => src/base/loader/coff_sym.h rename : base/loader/coff_symconst.h => src/base/loader/coff_symconst.h rename : base/loader/ecoff_object.cc => src/base/loader/ecoff_object.cc rename : base/loader/ecoff_object.hh => src/base/loader/ecoff_object.hh rename : base/loader/elf_object.cc => src/base/loader/elf_object.cc rename : base/loader/elf_object.hh => src/base/loader/elf_object.hh rename : base/loader/exec_aout.h => src/base/loader/exec_aout.h rename : base/loader/exec_ecoff.h => src/base/loader/exec_ecoff.h rename : base/loader/object_file.cc => src/base/loader/object_file.cc rename : base/loader/object_file.hh => src/base/loader/object_file.hh rename : base/loader/symtab.cc => src/base/loader/symtab.cc rename : base/loader/symtab.hh => src/base/loader/symtab.hh rename : base/match.cc => src/base/match.cc rename : base/match.hh => src/base/match.hh rename : base/misc.cc => src/base/misc.cc rename : base/misc.hh => src/base/misc.hh rename : base/mod_num.hh => src/base/mod_num.hh rename : base/mysql.cc => src/base/mysql.cc rename : base/mysql.hh => src/base/mysql.hh rename : base/output.cc => src/base/output.cc rename : base/output.hh => src/base/output.hh rename : base/pollevent.cc => src/base/pollevent.cc rename : base/pollevent.hh => src/base/pollevent.hh rename : base/predictor.hh => src/base/predictor.hh rename : base/random.cc => src/base/random.cc rename : base/random.hh => src/base/random.hh rename : base/range.cc => src/base/range.cc rename : base/range.hh => src/base/range.hh rename : base/refcnt.hh => src/base/refcnt.hh rename : base/remote_gdb.cc => src/base/remote_gdb.cc rename : base/remote_gdb.hh => src/base/remote_gdb.hh rename : base/res_list.hh => src/base/res_list.hh rename : base/sat_counter.cc => src/base/sat_counter.cc rename : base/sat_counter.hh => src/base/sat_counter.hh rename : base/sched_list.hh => src/base/sched_list.hh rename : base/socket.cc => src/base/socket.cc rename : base/socket.hh => src/base/socket.hh rename : base/statistics.cc => src/base/statistics.cc rename : base/statistics.hh => src/base/statistics.hh rename : base/stats/events.cc => src/base/stats/events.cc rename : base/stats/events.hh => src/base/stats/events.hh rename : base/stats/flags.hh => src/base/stats/flags.hh rename : base/stats/mysql.cc => src/base/stats/mysql.cc rename : base/stats/mysql.hh => src/base/stats/mysql.hh rename : base/stats/mysql_run.hh => src/base/stats/mysql_run.hh rename : base/stats/output.hh => src/base/stats/output.hh rename : base/stats/statdb.cc => src/base/stats/statdb.cc rename : base/stats/statdb.hh => src/base/stats/statdb.hh rename : base/stats/text.cc => src/base/stats/text.cc rename : base/stats/text.hh => src/base/stats/text.hh rename : base/stats/types.hh => src/base/stats/types.hh rename : base/stats/visit.cc => src/base/stats/visit.cc rename : base/stats/visit.hh => src/base/stats/visit.hh rename : base/str.cc => src/base/str.cc rename : base/str.hh => src/base/str.hh rename : base/time.cc => src/base/time.cc rename : base/time.hh => src/base/time.hh rename : base/timebuf.hh => src/base/timebuf.hh rename : base/trace.cc => src/base/trace.cc rename : base/trace.hh => src/base/trace.hh rename : base/traceflags.py => src/base/traceflags.py rename : base/userinfo.cc => src/base/userinfo.cc rename : base/userinfo.hh => src/base/userinfo.hh rename : cpu/SConscript => src/cpu/SConscript rename : cpu/base.cc => src/cpu/base.cc rename : cpu/base.hh => src/cpu/base.hh rename : cpu/base_dyn_inst.cc => src/cpu/base_dyn_inst.cc rename : cpu/base_dyn_inst.hh => src/cpu/base_dyn_inst.hh rename : cpu/cpu_exec_context.cc => src/cpu/cpu_exec_context.cc rename : cpu/cpu_exec_context.hh => src/cpu/cpu_exec_context.hh rename : cpu/cpu_models.py => src/cpu/cpu_models.py rename : cpu/exec_context.hh => src/cpu/exec_context.hh rename : cpu/exetrace.cc => src/cpu/exetrace.cc rename : cpu/exetrace.hh => src/cpu/exetrace.hh rename : cpu/inst_seq.hh => src/cpu/inst_seq.hh rename : cpu/intr_control.cc => src/cpu/intr_control.cc rename : cpu/intr_control.hh => src/cpu/intr_control.hh rename : cpu/memtest/memtest.cc => src/cpu/memtest/memtest.cc rename : cpu/memtest/memtest.hh => src/cpu/memtest/memtest.hh rename : cpu/o3/2bit_local_pred.cc => src/cpu/o3/2bit_local_pred.cc rename : cpu/o3/2bit_local_pred.hh => src/cpu/o3/2bit_local_pred.hh rename : cpu/o3/alpha_cpu.cc => src/cpu/o3/alpha_cpu.cc rename : cpu/o3/alpha_cpu.hh => src/cpu/o3/alpha_cpu.hh rename : cpu/o3/alpha_cpu_builder.cc => src/cpu/o3/alpha_cpu_builder.cc rename : cpu/o3/alpha_cpu_impl.hh => src/cpu/o3/alpha_cpu_impl.hh rename : cpu/o3/alpha_dyn_inst.cc => src/cpu/o3/alpha_dyn_inst.cc rename : cpu/o3/alpha_dyn_inst.hh => src/cpu/o3/alpha_dyn_inst.hh rename : cpu/o3/alpha_dyn_inst_impl.hh => src/cpu/o3/alpha_dyn_inst_impl.hh rename : cpu/o3/alpha_impl.hh => src/cpu/o3/alpha_impl.hh rename : cpu/o3/alpha_params.hh => src/cpu/o3/alpha_params.hh rename : cpu/o3/bpred_unit.cc => src/cpu/o3/bpred_unit.cc rename : cpu/o3/bpred_unit.hh => src/cpu/o3/bpred_unit.hh rename : cpu/o3/bpred_unit_impl.hh => src/cpu/o3/bpred_unit_impl.hh rename : cpu/o3/btb.cc => src/cpu/o3/btb.cc rename : cpu/o3/btb.hh => src/cpu/o3/btb.hh rename : cpu/o3/comm.hh => src/cpu/o3/comm.hh rename : cpu/o3/commit.cc => src/cpu/o3/commit.cc rename : cpu/o3/commit.hh => src/cpu/o3/commit.hh rename : cpu/o3/commit_impl.hh => src/cpu/o3/commit_impl.hh rename : cpu/o3/cpu.cc => src/cpu/o3/cpu.cc rename : cpu/o3/cpu.hh => src/cpu/o3/cpu.hh rename : cpu/o3/cpu_policy.hh => src/cpu/o3/cpu_policy.hh rename : cpu/o3/decode.cc => src/cpu/o3/decode.cc rename : cpu/o3/decode.hh => src/cpu/o3/decode.hh rename : cpu/o3/decode_impl.hh => src/cpu/o3/decode_impl.hh rename : cpu/o3/fetch.cc => src/cpu/o3/fetch.cc rename : cpu/o3/fetch.hh => src/cpu/o3/fetch.hh rename : cpu/o3/fetch_impl.hh => src/cpu/o3/fetch_impl.hh rename : cpu/o3/free_list.cc => src/cpu/o3/free_list.cc rename : cpu/o3/free_list.hh => src/cpu/o3/free_list.hh rename : cpu/o3/iew.cc => src/cpu/o3/iew.cc rename : cpu/o3/iew.hh => src/cpu/o3/iew.hh rename : cpu/o3/iew_impl.hh => src/cpu/o3/iew_impl.hh rename : cpu/o3/inst_queue.cc => src/cpu/o3/inst_queue.cc rename : cpu/o3/inst_queue.hh => src/cpu/o3/inst_queue.hh rename : cpu/o3/inst_queue_impl.hh => src/cpu/o3/inst_queue_impl.hh rename : cpu/o3/mem_dep_unit.cc => src/cpu/o3/mem_dep_unit.cc rename : cpu/o3/mem_dep_unit.hh => src/cpu/o3/mem_dep_unit.hh rename : cpu/o3/mem_dep_unit_impl.hh => src/cpu/o3/mem_dep_unit_impl.hh rename : cpu/o3/ras.cc => src/cpu/o3/ras.cc rename : cpu/o3/ras.hh => src/cpu/o3/ras.hh rename : cpu/o3/regfile.hh => src/cpu/o3/regfile.hh rename : cpu/o3/rename.cc => src/cpu/o3/rename.cc rename : cpu/o3/rename.hh => src/cpu/o3/rename.hh rename : cpu/o3/rename_impl.hh => src/cpu/o3/rename_impl.hh rename : cpu/o3/rename_map.cc => src/cpu/o3/rename_map.cc rename : cpu/o3/rename_map.hh => src/cpu/o3/rename_map.hh rename : cpu/o3/rob.cc => src/cpu/o3/rob.cc rename : cpu/o3/rob.hh => src/cpu/o3/rob.hh rename : cpu/o3/rob_impl.hh => src/cpu/o3/rob_impl.hh rename : cpu/o3/sat_counter.cc => src/cpu/o3/sat_counter.cc rename : cpu/o3/sat_counter.hh => src/cpu/o3/sat_counter.hh rename : cpu/o3/store_set.cc => src/cpu/o3/store_set.cc rename : cpu/o3/store_set.hh => src/cpu/o3/store_set.hh rename : cpu/o3/tournament_pred.cc => src/cpu/o3/tournament_pred.cc rename : cpu/o3/tournament_pred.hh => src/cpu/o3/tournament_pred.hh rename : cpu/op_class.cc => src/cpu/op_class.cc rename : cpu/op_class.hh => src/cpu/op_class.hh rename : cpu/ozone/cpu.cc => src/cpu/ozone/cpu.cc rename : cpu/ozone/cpu.hh => src/cpu/ozone/cpu.hh rename : cpu/ozone/cpu_impl.hh => src/cpu/ozone/cpu_impl.hh rename : cpu/ozone/ea_list.cc => src/cpu/ozone/ea_list.cc rename : cpu/ozone/ea_list.hh => src/cpu/ozone/ea_list.hh rename : cpu/pc_event.cc => src/cpu/pc_event.cc rename : cpu/pc_event.hh => src/cpu/pc_event.hh rename : cpu/profile.cc => src/cpu/profile.cc rename : cpu/profile.hh => src/cpu/profile.hh rename : cpu/simple/atomic.cc => src/cpu/simple/atomic.cc rename : cpu/simple/atomic.hh => src/cpu/simple/atomic.hh rename : cpu/simple/base.cc => src/cpu/simple/base.cc rename : cpu/simple/base.hh => src/cpu/simple/base.hh rename : cpu/simple/timing.cc => src/cpu/simple/timing.cc rename : cpu/simple/timing.hh => src/cpu/simple/timing.hh rename : cpu/smt.hh => src/cpu/smt.hh rename : cpu/static_inst.cc => src/cpu/static_inst.cc rename : cpu/static_inst.hh => src/cpu/static_inst.hh rename : cpu/trace/opt_cpu.cc => src/cpu/trace/opt_cpu.cc rename : cpu/trace/opt_cpu.hh => src/cpu/trace/opt_cpu.hh rename : cpu/trace/reader/ibm_reader.cc => src/cpu/trace/reader/ibm_reader.cc rename : cpu/trace/reader/ibm_reader.hh => src/cpu/trace/reader/ibm_reader.hh rename : cpu/trace/reader/itx_reader.cc => src/cpu/trace/reader/itx_reader.cc rename : cpu/trace/reader/itx_reader.hh => src/cpu/trace/reader/itx_reader.hh rename : cpu/trace/reader/m5_reader.cc => src/cpu/trace/reader/m5_reader.cc rename : cpu/trace/reader/m5_reader.hh => src/cpu/trace/reader/m5_reader.hh rename : cpu/trace/reader/mem_trace_reader.cc => src/cpu/trace/reader/mem_trace_reader.cc rename : cpu/trace/reader/mem_trace_reader.hh => src/cpu/trace/reader/mem_trace_reader.hh rename : cpu/trace/trace_cpu.cc => src/cpu/trace/trace_cpu.cc rename : cpu/trace/trace_cpu.hh => src/cpu/trace/trace_cpu.hh rename : dev/alpha_access.h => src/dev/alpha_access.h rename : dev/alpha_console.cc => src/dev/alpha_console.cc rename : dev/alpha_console.hh => src/dev/alpha_console.hh rename : dev/baddev.cc => src/dev/baddev.cc rename : dev/baddev.hh => src/dev/baddev.hh rename : dev/disk_image.cc => src/dev/disk_image.cc rename : dev/disk_image.hh => src/dev/disk_image.hh rename : dev/etherbus.cc => src/dev/etherbus.cc rename : dev/etherbus.hh => src/dev/etherbus.hh rename : dev/etherdump.cc => src/dev/etherdump.cc rename : dev/etherdump.hh => src/dev/etherdump.hh rename : dev/etherint.cc => src/dev/etherint.cc rename : dev/etherint.hh => src/dev/etherint.hh rename : dev/etherlink.cc => src/dev/etherlink.cc rename : dev/etherlink.hh => src/dev/etherlink.hh rename : dev/etherpkt.cc => src/dev/etherpkt.cc rename : dev/etherpkt.hh => src/dev/etherpkt.hh rename : dev/ethertap.cc => src/dev/ethertap.cc rename : dev/ethertap.hh => src/dev/ethertap.hh rename : dev/ide_atareg.h => src/dev/ide_atareg.h rename : dev/ide_ctrl.cc => src/dev/ide_ctrl.cc rename : dev/ide_ctrl.hh => src/dev/ide_ctrl.hh rename : dev/ide_disk.cc => src/dev/ide_disk.cc rename : dev/ide_disk.hh => src/dev/ide_disk.hh rename : dev/ide_wdcreg.h => src/dev/ide_wdcreg.h rename : dev/io_device.cc => src/dev/io_device.cc rename : dev/io_device.hh => src/dev/io_device.hh rename : dev/isa_fake.cc => src/dev/isa_fake.cc rename : dev/isa_fake.hh => src/dev/isa_fake.hh rename : dev/ns_gige.cc => src/dev/ns_gige.cc rename : dev/ns_gige.hh => src/dev/ns_gige.hh rename : dev/ns_gige_reg.h => src/dev/ns_gige_reg.h rename : dev/pciconfigall.cc => src/dev/pciconfigall.cc rename : dev/pciconfigall.hh => src/dev/pciconfigall.hh rename : dev/pcidev.cc => src/dev/pcidev.cc rename : dev/pcidev.hh => src/dev/pcidev.hh rename : dev/pcireg.h => src/dev/pcireg.h rename : dev/pitreg.h => src/dev/pitreg.h rename : dev/pktfifo.cc => src/dev/pktfifo.cc rename : dev/pktfifo.hh => src/dev/pktfifo.hh rename : dev/platform.cc => src/dev/platform.cc rename : dev/platform.hh => src/dev/platform.hh rename : dev/rtcreg.h => src/dev/rtcreg.h rename : dev/simconsole.cc => src/dev/simconsole.cc rename : dev/simconsole.hh => src/dev/simconsole.hh rename : dev/simple_disk.cc => src/dev/simple_disk.cc rename : dev/simple_disk.hh => src/dev/simple_disk.hh rename : dev/sinic.cc => src/dev/sinic.cc rename : dev/sinic.hh => src/dev/sinic.hh rename : dev/sinicreg.hh => src/dev/sinicreg.hh rename : dev/tsunami.cc => src/dev/tsunami.cc rename : dev/tsunami.hh => src/dev/tsunami.hh rename : dev/tsunami_cchip.cc => src/dev/tsunami_cchip.cc rename : dev/tsunami_cchip.hh => src/dev/tsunami_cchip.hh rename : dev/tsunami_io.cc => src/dev/tsunami_io.cc rename : dev/tsunami_io.hh => src/dev/tsunami_io.hh rename : dev/tsunami_pchip.cc => src/dev/tsunami_pchip.cc rename : dev/tsunami_pchip.hh => src/dev/tsunami_pchip.hh rename : dev/tsunamireg.h => src/dev/tsunamireg.h rename : dev/uart.cc => src/dev/uart.cc rename : dev/uart.hh => src/dev/uart.hh rename : dev/uart8250.cc => src/dev/uart8250.cc rename : dev/uart8250.hh => src/dev/uart8250.hh rename : kern/kernel_stats.cc => src/kern/kernel_stats.cc rename : kern/kernel_stats.hh => src/kern/kernel_stats.hh rename : kern/linux/events.cc => src/kern/linux/events.cc rename : kern/linux/events.hh => src/kern/linux/events.hh rename : kern/linux/linux.hh => src/kern/linux/linux.hh rename : kern/linux/linux_syscalls.cc => src/kern/linux/linux_syscalls.cc rename : kern/linux/linux_syscalls.hh => src/kern/linux/linux_syscalls.hh rename : kern/linux/printk.cc => src/kern/linux/printk.cc rename : kern/linux/printk.hh => src/kern/linux/printk.hh rename : kern/linux/sched.hh => src/kern/linux/sched.hh rename : kern/solaris/solaris.hh => src/kern/solaris/solaris.hh rename : kern/system_events.cc => src/kern/system_events.cc rename : kern/system_events.hh => src/kern/system_events.hh rename : kern/tru64/dump_mbuf.cc => src/kern/tru64/dump_mbuf.cc rename : kern/tru64/dump_mbuf.hh => src/kern/tru64/dump_mbuf.hh rename : kern/tru64/mbuf.hh => src/kern/tru64/mbuf.hh rename : kern/tru64/printf.cc => src/kern/tru64/printf.cc rename : kern/tru64/printf.hh => src/kern/tru64/printf.hh rename : kern/tru64/tru64.hh => src/kern/tru64/tru64.hh rename : kern/tru64/tru64_events.cc => src/kern/tru64/tru64_events.cc rename : kern/tru64/tru64_events.hh => src/kern/tru64/tru64_events.hh rename : kern/tru64/tru64_syscalls.cc => src/kern/tru64/tru64_syscalls.cc rename : kern/tru64/tru64_syscalls.hh => src/kern/tru64/tru64_syscalls.hh rename : mem/bridge.cc => src/mem/bridge.cc rename : mem/bridge.hh => src/mem/bridge.hh rename : mem/bus.cc => src/mem/bus.cc rename : mem/bus.hh => src/mem/bus.hh rename : mem/cache/prefetch/tagged_prefetcher_impl.hh => src/mem/cache/prefetch/tagged_prefetcher_impl.hh rename : mem/config/prefetch.hh => src/mem/config/prefetch.hh rename : mem/mem_object.cc => src/mem/mem_object.cc rename : mem/mem_object.hh => src/mem/mem_object.hh rename : mem/packet.cc => src/mem/packet.cc rename : mem/packet.hh => src/mem/packet.hh rename : mem/page_table.cc => src/mem/page_table.cc rename : mem/page_table.hh => src/mem/page_table.hh rename : mem/physical.cc => src/mem/physical.cc rename : mem/physical.hh => src/mem/physical.hh rename : mem/port.cc => src/mem/port.cc rename : mem/port.hh => src/mem/port.hh rename : mem/request.hh => src/mem/request.hh rename : mem/translating_port.cc => src/mem/translating_port.cc rename : mem/translating_port.hh => src/mem/translating_port.hh rename : mem/vport.cc => src/mem/vport.cc rename : mem/vport.hh => src/mem/vport.hh rename : python/SConscript => src/python/SConscript rename : python/m5/__init__.py => src/python/m5/__init__.py rename : python/m5/config.py => src/python/m5/config.py rename : python/m5/convert.py => src/python/m5/convert.py rename : python/m5/multidict.py => src/python/m5/multidict.py rename : python/m5/objects/AlphaConsole.py => src/python/m5/objects/AlphaConsole.py rename : python/m5/objects/AlphaFullCPU.py => src/python/m5/objects/AlphaFullCPU.py rename : python/m5/objects/AlphaTLB.py => src/python/m5/objects/AlphaTLB.py rename : python/m5/objects/BadDevice.py => src/python/m5/objects/BadDevice.py rename : python/m5/objects/BaseCPU.py => src/python/m5/objects/BaseCPU.py rename : python/m5/objects/BaseCache.py => src/python/m5/objects/BaseCache.py rename : python/m5/objects/Bridge.py => src/python/m5/objects/Bridge.py rename : python/m5/objects/Bus.py => src/python/m5/objects/Bus.py rename : python/m5/objects/CoherenceProtocol.py => src/python/m5/objects/CoherenceProtocol.py rename : python/m5/objects/Device.py => src/python/m5/objects/Device.py rename : python/m5/objects/DiskImage.py => src/python/m5/objects/DiskImage.py rename : python/m5/objects/Ethernet.py => src/python/m5/objects/Ethernet.py rename : python/m5/objects/Ide.py => src/python/m5/objects/Ide.py rename : python/m5/objects/IntrControl.py => src/python/m5/objects/IntrControl.py rename : python/m5/objects/MemObject.py => src/python/m5/objects/MemObject.py rename : python/m5/objects/MemTest.py => src/python/m5/objects/MemTest.py rename : python/m5/objects/Pci.py => src/python/m5/objects/Pci.py rename : python/m5/objects/PhysicalMemory.py => src/python/m5/objects/PhysicalMemory.py rename : python/m5/objects/Platform.py => src/python/m5/objects/Platform.py rename : python/m5/objects/Process.py => src/python/m5/objects/Process.py rename : python/m5/objects/Repl.py => src/python/m5/objects/Repl.py rename : python/m5/objects/Root.py => src/python/m5/objects/Root.py rename : python/m5/objects/SimConsole.py => src/python/m5/objects/SimConsole.py rename : python/m5/objects/SimpleDisk.py => src/python/m5/objects/SimpleDisk.py rename : python/m5/objects/System.py => src/python/m5/objects/System.py rename : python/m5/objects/Tsunami.py => src/python/m5/objects/Tsunami.py rename : python/m5/objects/Uart.py => src/python/m5/objects/Uart.py rename : python/m5/smartdict.py => src/python/m5/smartdict.py rename : sim/async.hh => src/sim/async.hh rename : sim/builder.cc => src/sim/builder.cc rename : sim/builder.hh => src/sim/builder.hh rename : sim/byteswap.hh => src/sim/byteswap.hh rename : sim/debug.cc => src/sim/debug.cc rename : sim/debug.hh => src/sim/debug.hh rename : sim/eventq.cc => src/sim/eventq.cc rename : sim/eventq.hh => src/sim/eventq.hh rename : sim/faults.cc => src/sim/faults.cc rename : sim/faults.hh => src/sim/faults.hh rename : sim/host.hh => src/sim/host.hh rename : sim/main.cc => src/sim/main.cc rename : sim/param.cc => src/sim/param.cc rename : sim/param.hh => src/sim/param.hh rename : sim/process.cc => src/sim/process.cc rename : sim/process.hh => src/sim/process.hh rename : sim/pseudo_inst.cc => src/sim/pseudo_inst.cc rename : sim/pseudo_inst.hh => src/sim/pseudo_inst.hh rename : sim/root.cc => src/sim/root.cc rename : sim/serialize.cc => src/sim/serialize.cc rename : sim/serialize.hh => src/sim/serialize.hh rename : sim/sim_events.cc => src/sim/sim_events.cc rename : sim/sim_events.hh => src/sim/sim_events.hh rename : sim/sim_exit.hh => src/sim/sim_exit.hh rename : sim/sim_object.cc => src/sim/sim_object.cc rename : sim/sim_object.hh => src/sim/sim_object.hh rename : sim/startup.cc => src/sim/startup.cc rename : sim/startup.hh => src/sim/startup.hh rename : sim/stat_control.cc => src/sim/stat_control.cc rename : sim/stat_control.hh => src/sim/stat_control.hh rename : sim/stats.hh => src/sim/stats.hh rename : sim/syscall_emul.cc => src/sim/syscall_emul.cc rename : sim/syscall_emul.hh => src/sim/syscall_emul.hh rename : sim/system.cc => src/sim/system.cc rename : sim/system.hh => src/sim/system.hh rename : sim/vptr.hh => src/sim/vptr.hh rename : test/Makefile => src/unittest/Makefile rename : test/bitvectest.cc => src/unittest/bitvectest.cc rename : test/circletest.cc => src/unittest/circletest.cc rename : test/cprintftest.cc => src/unittest/cprintftest.cc rename : test/foo.ini => src/unittest/foo.ini rename : test/genini.py => src/unittest/genini.py rename : test/initest.cc => src/unittest/initest.cc rename : test/initest.ini => src/unittest/initest.ini rename : test/lru_test.cc => src/unittest/lru_test.cc rename : test/nmtest.cc => src/unittest/nmtest.cc rename : test/offtest.cc => src/unittest/offtest.cc rename : test/paramtest.cc => src/unittest/paramtest.cc rename : test/rangetest.cc => src/unittest/rangetest.cc rename : test/sized_test.cc => src/unittest/sized_test.cc rename : test/stattest.cc => src/unittest/stattest.cc rename : test/strnumtest.cc => src/unittest/strnumtest.cc rename : test/symtest.cc => src/unittest/symtest.cc rename : test/tokentest.cc => src/unittest/tokentest.cc rename : test/tracetest.cc => src/unittest/tracetest.cc extra : convert_revision : cab6a5271ca1b368193cd948e5d3dcc47ab1bd48
Diffstat (limited to 'ext/dnet')
-rw-r--r--ext/dnet/LICENSE28
-rw-r--r--ext/dnet/dnet/addr.h67
-rw-r--r--ext/dnet/dnet/arp.h103
-rw-r--r--ext/dnet/dnet/blob.h56
-rw-r--r--ext/dnet/dnet/eth.h77
-rw-r--r--ext/dnet/dnet/fw.h54
-rw-r--r--ext/dnet/dnet/icmp.h265
-rw-r--r--ext/dnet/dnet/intf.h68
-rw-r--r--ext/dnet/dnet/ip.h487
-rw-r--r--ext/dnet/dnet/ip6.h183
-rw-r--r--ext/dnet/dnet/os.h117
-rw-r--r--ext/dnet/dnet/rand.h33
-rw-r--r--ext/dnet/dnet/route.h35
-rw-r--r--ext/dnet/dnet/tcp.h158
-rw-r--r--ext/dnet/dnet/udp.h32
15 files changed, 1763 insertions, 0 deletions
diff --git a/ext/dnet/LICENSE b/ext/dnet/LICENSE
new file mode 100644
index 000000000..95ecd51e6
--- /dev/null
+++ b/ext/dnet/LICENSE
@@ -0,0 +1,28 @@
+
+ Copyright (c) 2000-2004 Dug Song <dugsong@monkey.org>
+ All rights reserved, all wrongs reversed.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. The names of the authors and copyright holders may not be used to
+ endorse or promote products derived from this software without
+ specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+ THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
diff --git a/ext/dnet/dnet/addr.h b/ext/dnet/dnet/addr.h
new file mode 100644
index 000000000..584e3aba3
--- /dev/null
+++ b/ext/dnet/dnet/addr.h
@@ -0,0 +1,67 @@
+/*
+ * addr.h
+ *
+ * Network address operations.
+ *
+ * Copyright (c) 2000 Dug Song <dugsong@monkey.org>
+ *
+ * $Id: addr.h,v 1.12 2003/02/27 03:44:55 dugsong Exp $
+ */
+
+#ifndef DNET_ADDR_H
+#define DNET_ADDR_H
+
+#define ADDR_TYPE_NONE 0 /* No address set */
+#define ADDR_TYPE_ETH 1 /* Ethernet */
+#define ADDR_TYPE_IP 2 /* Internet Protocol v4 */
+#define ADDR_TYPE_IP6 3 /* Internet Protocol v6 */
+
+struct addr {
+ uint16_t addr_type;
+ uint16_t addr_bits;
+ union {
+ eth_addr_t __eth;
+ ip_addr_t __ip;
+ ip6_addr_t __ip6;
+
+ uint8_t __data8[16];
+ uint16_t __data16[8];
+ uint32_t __data32[4];
+ } __addr_u;
+};
+#define addr_eth __addr_u.__eth
+#define addr_ip __addr_u.__ip
+#define addr_ip6 __addr_u.__ip6
+#define addr_data8 __addr_u.__data8
+#define addr_data16 __addr_u.__data16
+#define addr_data32 __addr_u.__data32
+
+#define addr_pack(addr, type, bits, data, len) do { \
+ (addr)->addr_type = type; \
+ (addr)->addr_bits = bits; \
+ memmove((addr)->addr_data8, (char *)data, len); \
+} while (0)
+
+__BEGIN_DECLS
+int addr_cmp(const struct addr *a, const struct addr *b);
+
+int addr_bcast(const struct addr *a, struct addr *b);
+int addr_net(const struct addr *a, struct addr *b);
+
+char *addr_ntop(const struct addr *src, char *dst, size_t size);
+int addr_pton(const char *src, struct addr *dst);
+
+char *addr_ntoa(const struct addr *a);
+#define addr_aton addr_pton
+
+int addr_ntos(const struct addr *a, struct sockaddr *sa);
+int addr_ston(const struct sockaddr *sa, struct addr *a);
+
+int addr_btos(uint16_t bits, struct sockaddr *sa);
+int addr_stob(const struct sockaddr *sa, uint16_t *bits);
+
+int addr_btom(uint16_t bits, void *mask, size_t size);
+int addr_mtob(const void *mask, size_t size, uint16_t *bits);
+__END_DECLS
+
+#endif /* DNET_ADDR_H */
diff --git a/ext/dnet/dnet/arp.h b/ext/dnet/dnet/arp.h
new file mode 100644
index 000000000..d3c162410
--- /dev/null
+++ b/ext/dnet/dnet/arp.h
@@ -0,0 +1,103 @@
+/*
+ * arp.h
+ *
+ * Address Resolution Protocol.
+ * RFC 826
+ *
+ * Copyright (c) 2000 Dug Song <dugsong@monkey.org>
+ *
+ * $Id: arp.h,v 1.12 2003/03/16 17:39:17 dugsong Exp $
+ */
+
+#ifndef DNET_ARP_H
+#define DNET_ARP_H
+
+#define ARP_HDR_LEN 8 /* base ARP header length */
+#define ARP_ETHIP_LEN 20 /* base ARP message length */
+
+#ifndef __GNUC__
+# define __attribute__(x)
+# pragma pack(1)
+#endif
+
+/*
+ * ARP header
+ */
+struct arp_hdr {
+ uint16_t ar_hrd; /* format of hardware address */
+ uint16_t ar_pro; /* format of protocol address */
+ uint8_t ar_hln; /* length of hardware address (ETH_ADDR_LEN) */
+ uint8_t ar_pln; /* length of protocol address (IP_ADDR_LEN) */
+ uint16_t ar_op; /* operation */
+};
+
+/*
+ * Hardware address format
+ */
+#define ARP_HRD_ETH 0x0001 /* ethernet hardware */
+#define ARP_HRD_IEEE802 0x0006 /* IEEE 802 hardware */
+
+/*
+ * Protocol address format
+ */
+#define ARP_PRO_IP 0x0800 /* IP protocol */
+
+/*
+ * ARP operation
+ */
+#define ARP_OP_REQUEST 1 /* request to resolve ha given pa */
+#define ARP_OP_REPLY 2 /* response giving hardware address */
+#define ARP_OP_REVREQUEST 3 /* request to resolve pa given ha */
+#define ARP_OP_REVREPLY 4 /* response giving protocol address */
+
+/*
+ * Ethernet/IP ARP message
+ */
+struct arp_ethip {
+ uint8_t ar_sha[ETH_ADDR_LEN]; /* sender hardware address */
+ uint8_t ar_spa[IP_ADDR_LEN]; /* sender protocol address */
+ uint8_t ar_tha[ETH_ADDR_LEN]; /* target hardware address */
+ uint8_t ar_tpa[IP_ADDR_LEN]; /* target protocol address */
+};
+
+/*
+ * ARP cache entry
+ */
+struct arp_entry {
+ struct addr arp_pa; /* protocol address */
+ struct addr arp_ha; /* hardware address */
+};
+
+#ifndef __GNUC__
+# pragma pack()
+#endif
+
+#define arp_pack_hdr_ethip(hdr, op, sha, spa, tha, tpa) do { \
+ struct arp_hdr *pack_arp_p = (struct arp_hdr *)(hdr); \
+ struct arp_ethip *pack_ethip_p = (struct arp_ethip *) \
+ ((uint8_t *)(hdr) + ARP_HDR_LEN); \
+ pack_arp_p->ar_hrd = htons(ARP_HRD_ETH); \
+ pack_arp_p->ar_pro = htons(ARP_PRO_IP); \
+ pack_arp_p->ar_hln = ETH_ADDR_LEN; \
+ pack_arp_p->ar_pln = IP_ADDR_LEN; \
+ pack_arp_p->ar_op = htons(op); \
+ memmove(pack_ethip_p->ar_sha, &(sha), ETH_ADDR_LEN); \
+ memmove(pack_ethip_p->ar_spa, &(spa), IP_ADDR_LEN); \
+ memmove(pack_ethip_p->ar_tha, &(tha), ETH_ADDR_LEN); \
+ memmove(pack_ethip_p->ar_tpa, &(tpa), IP_ADDR_LEN); \
+} while (0)
+
+typedef struct arp_handle arp_t;
+
+typedef int (*arp_handler)(const struct arp_entry *entry, void *arg);
+
+__BEGIN_DECLS
+arp_t *arp_open(void);
+int arp_add(arp_t *arp, const struct arp_entry *entry);
+int arp_delete(arp_t *arp, const struct arp_entry *entry);
+int arp_get(arp_t *arp, struct arp_entry *entry);
+int arp_loop(arp_t *arp, arp_handler callback, void *arg);
+arp_t *arp_close(arp_t *arp);
+__END_DECLS
+
+#endif /* DNET_ARP_H */
diff --git a/ext/dnet/dnet/blob.h b/ext/dnet/dnet/blob.h
new file mode 100644
index 000000000..a3be7897d
--- /dev/null
+++ b/ext/dnet/dnet/blob.h
@@ -0,0 +1,56 @@
+/*
+ * blob.h
+ *
+ * Binary blob handling.
+ *
+ * Copyright (c) 2002 Dug Song <dugsong@monkey.org>
+ *
+ * $Id: blob.h,v 1.2 2002/04/05 03:06:44 dugsong Exp $
+ */
+
+#ifndef DNET_BLOB_H
+#define DNET_BLOB_H
+
+typedef struct blob {
+ u_char *base; /* start of data */
+ int off; /* offset into data */
+ int end; /* end of data */
+ int size; /* size of allocation */
+} blob_t;
+
+__BEGIN_DECLS
+blob_t *blob_new(void);
+
+int blob_read(blob_t *b, void *buf, int len);
+int blob_write(blob_t *b, const void *buf, int len);
+
+int blob_seek(blob_t *b, int off, int whence);
+#define blob_skip(b, l) blob_seek(b, l, SEEK_CUR)
+#define blob_rewind(b) blob_seek(b, 0, SEEK_SET)
+
+#define blob_offset(b) ((b)->off)
+#define blob_left(b) ((b)->end - (b)->off)
+
+int blob_index(blob_t *b, const void *buf, int len);
+int blob_rindex(blob_t *b, const void *buf, int len);
+
+int blob_pack(blob_t *b, const char *fmt, ...);
+int blob_unpack(blob_t *b, const char *fmt, ...);
+
+int blob_insert(blob_t *b, const void *buf, int len);
+int blob_delete(blob_t *b, void *buf, int len);
+
+int blob_print(blob_t *b, char *style, int len);
+
+blob_t *blob_free(blob_t *b);
+
+int blob_register_alloc(size_t size, void *(*bmalloc)(size_t),
+ void (*bfree)(void *), void *(*brealloc)(void *, size_t));
+#ifdef va_start
+typedef int (*blob_fmt_cb)(int pack, int len, blob_t *b, va_list *arg);
+
+int blob_register_pack(char c, blob_fmt_cb fmt_cb);
+#endif
+__END_DECLS
+
+#endif /* DNET_BLOB_H */
diff --git a/ext/dnet/dnet/eth.h b/ext/dnet/dnet/eth.h
new file mode 100644
index 000000000..da3033066
--- /dev/null
+++ b/ext/dnet/dnet/eth.h
@@ -0,0 +1,77 @@
+/*
+ * eth.h
+ *
+ * Ethernet.
+ *
+ * Copyright (c) 2000 Dug Song <dugsong@monkey.org>
+ *
+ * $Id: eth.h,v 1.15 2004/01/03 08:47:23 dugsong Exp $
+ */
+
+#ifndef DNET_ETH_H
+#define DNET_ETH_H
+
+#define ETH_ADDR_LEN 6
+#define ETH_ADDR_BITS 48
+#define ETH_TYPE_LEN 2
+#define ETH_CRC_LEN 4
+#define ETH_HDR_LEN 14
+
+#define ETH_LEN_MIN 64 /* minimum frame length with CRC */
+#define ETH_LEN_MAX 1518 /* maximum frame length with CRC */
+
+#define ETH_MTU (ETH_LEN_MAX - ETH_HDR_LEN - ETH_CRC_LEN)
+#define ETH_MIN (ETH_LEN_MIN - ETH_HDR_LEN - ETH_CRC_LEN)
+
+typedef struct eth_addr {
+ uint8_t data[ETH_ADDR_LEN];
+} eth_addr_t;
+
+struct eth_hdr {
+ eth_addr_t eth_dst; /* destination address */
+ eth_addr_t eth_src; /* source address */
+ uint16_t eth_type; /* payload type */
+};
+
+/*
+ * Ethernet payload types - http://standards.ieee.org/regauth/ethertype
+ */
+#define ETH_TYPE_PUP 0x0200 /* PUP protocol */
+#define ETH_TYPE_IP 0x0800 /* IP protocol */
+#define ETH_TYPE_ARP 0x0806 /* address resolution protocol */
+#define ETH_TYPE_REVARP 0x8035 /* reverse addr resolution protocol */
+#define ETH_TYPE_8021Q 0x8100 /* IEEE 802.1Q VLAN tagging */
+#define ETH_TYPE_IPV6 0x86DD /* IPv6 protocol */
+#define ETH_TYPE_MPLS 0x8847 /* MPLS */
+#define ETH_TYPE_MPLS_MCAST 0x8848 /* MPLS Multicast */
+#define ETH_TYPE_PPPOEDISC 0x8863 /* PPP Over Ethernet Discovery Stage */
+#define ETH_TYPE_PPPOE 0x8864 /* PPP Over Ethernet Session Stage */
+#define ETH_TYPE_LOOPBACK 0x9000 /* used to test interfaces */
+
+#define ETH_IS_MULTICAST(ea) (*(ea) & 0x01) /* is address mcast/bcast? */
+
+#define ETH_ADDR_BROADCAST "\xff\xff\xff\xff\xff\xff"
+
+#define eth_pack_hdr(h, dst, src, type) do { \
+ struct eth_hdr *eth_pack_p = (struct eth_hdr *)(h); \
+ memmove(&eth_pack_p->eth_dst, &(dst), ETH_ADDR_LEN); \
+ memmove(&eth_pack_p->eth_src, &(src), ETH_ADDR_LEN); \
+ eth_pack_p->eth_type = htons(type); \
+} while (0)
+
+typedef struct eth_handle eth_t;
+
+__BEGIN_DECLS
+eth_t *eth_open(const char *device);
+int eth_get(eth_t *e, eth_addr_t *ea);
+int eth_set(eth_t *e, const eth_addr_t *ea);
+size_t eth_send(eth_t *e, const void *buf, size_t len);
+eth_t *eth_close(eth_t *e);
+
+char *eth_ntop(const eth_addr_t *eth, char *dst, size_t len);
+int eth_pton(const char *src, eth_addr_t *dst);
+char *eth_ntoa(const eth_addr_t *eth);
+#define eth_aton eth_pton
+__END_DECLS
+
+#endif /* DNET_ETH_H */
diff --git a/ext/dnet/dnet/fw.h b/ext/dnet/dnet/fw.h
new file mode 100644
index 000000000..ebda8e7eb
--- /dev/null
+++ b/ext/dnet/dnet/fw.h
@@ -0,0 +1,54 @@
+/*
+ * fw.h
+ *
+ * Network firewalling operations.
+ *
+ * Copyright (c) 2001 Dug Song <dugsong@monkey.org>
+ *
+ * $Id: fw.h,v 1.13 2002/12/14 04:02:36 dugsong Exp $
+ */
+
+#ifndef DNET_FW_H
+#define DNET_FW_H
+
+struct fw_rule {
+ char fw_device[INTF_NAME_LEN]; /* interface name */
+ uint8_t fw_op; /* operation */
+ uint8_t fw_dir; /* direction */
+ uint8_t fw_proto; /* IP protocol */
+ struct addr fw_src; /* src address / net */
+ struct addr fw_dst; /* dst address / net */
+ uint16_t fw_sport[2]; /* range / ICMP type */
+ uint16_t fw_dport[2]; /* range / ICMP code */
+};
+
+#define FW_OP_ALLOW 1
+#define FW_OP_BLOCK 2
+
+#define FW_DIR_IN 1
+#define FW_DIR_OUT 2
+
+#define fw_pack_rule(rule, dev, op, dir, p, s, d, sp1, sp2, dp1, dp2) \
+do { \
+ strlcpy((rule)->fw_device, dev, sizeof((rule)->fw_device)); \
+ (rule)->fw_op = op; (rule)->fw_dir = dir; \
+ (rule)->fw_proto = p; \
+ memmove(&(rule)->fw_src, &(s), sizeof((rule)->fw_src)); \
+ memmove(&(rule)->fw_dst, &(d), sizeof((rule)->fw_dst)); \
+ (rule)->fw_sport[0] = sp1; (rule)->fw_sport[1] = sp2; \
+ (rule)->fw_dport[0] = dp1; (rule)->fw_dport[1] = dp2; \
+} while (0)
+
+typedef struct fw_handle fw_t;
+
+typedef int (*fw_handler)(const struct fw_rule *rule, void *arg);
+
+__BEGIN_DECLS
+fw_t *fw_open(void);
+int fw_add(fw_t *f, const struct fw_rule *rule);
+int fw_delete(fw_t *f, const struct fw_rule *rule);
+int fw_loop(fw_t *f, fw_handler callback, void *arg);
+fw_t *fw_close(fw_t *f);
+__END_DECLS
+
+#endif /* DNET_FW_H */
diff --git a/ext/dnet/dnet/icmp.h b/ext/dnet/dnet/icmp.h
new file mode 100644
index 000000000..e997d5887
--- /dev/null
+++ b/ext/dnet/dnet/icmp.h
@@ -0,0 +1,265 @@
+/*
+ * icmp.h
+ *
+ * Internet Control Message Protocol.
+ * RFC 792, 950, 1256, 1393, 1475, 2002, 2521
+ *
+ * Copyright (c) 2000 Dug Song <dugsong@monkey.org>
+ *
+ * $Id: icmp.h,v 1.14 2003/03/16 17:39:17 dugsong Exp $
+ */
+
+#ifndef DNET_ICMP_H
+#define DNET_ICMP_H
+
+#define ICMP_HDR_LEN 4 /* base ICMP header length */
+#define ICMP_LEN_MIN 8 /* minimum ICMP message size, with header */
+
+#ifndef __GNUC__
+# define __attribute__(x)
+# pragma pack(1)
+#endif
+
+/*
+ * ICMP header
+ */
+struct icmp_hdr {
+ uint8_t icmp_type; /* type of message, see below */
+ uint8_t icmp_code; /* type sub code */
+ uint16_t icmp_cksum; /* ones complement cksum of struct */
+};
+
+/*
+ * Types (icmp_type) and codes (icmp_code) -
+ * http://www.iana.org/assignments/icmp-parameters
+ */
+#define ICMP_CODE_NONE 0 /* for types without codes */
+#define ICMP_ECHOREPLY 0 /* echo reply */
+#define ICMP_UNREACH 3 /* dest unreachable, codes: */
+#define ICMP_UNREACH_NET 0 /* bad net */
+#define ICMP_UNREACH_HOST 1 /* bad host */
+#define ICMP_UNREACH_PROTO 2 /* bad protocol */
+#define ICMP_UNREACH_PORT 3 /* bad port */
+#define ICMP_UNREACH_NEEDFRAG 4 /* IP_DF caused drop */
+#define ICMP_UNREACH_SRCFAIL 5 /* src route failed */
+#define ICMP_UNREACH_NET_UNKNOWN 6 /* unknown net */
+#define ICMP_UNREACH_HOST_UNKNOWN 7 /* unknown host */
+#define ICMP_UNREACH_ISOLATED 8 /* src host isolated */
+#define ICMP_UNREACH_NET_PROHIB 9 /* for crypto devs */
+#define ICMP_UNREACH_HOST_PROHIB 10 /* ditto */
+#define ICMP_UNREACH_TOSNET 11 /* bad tos for net */
+#define ICMP_UNREACH_TOSHOST 12 /* bad tos for host */
+#define ICMP_UNREACH_FILTER_PROHIB 13 /* prohibited access */
+#define ICMP_UNREACH_HOST_PRECEDENCE 14 /* precedence error */
+#define ICMP_UNREACH_PRECEDENCE_CUTOFF 15 /* precedence cutoff */
+#define ICMP_SRCQUENCH 4 /* packet lost, slow down */
+#define ICMP_REDIRECT 5 /* shorter route, codes: */
+#define ICMP_REDIRECT_NET 0 /* for network */
+#define ICMP_REDIRECT_HOST 1 /* for host */
+#define ICMP_REDIRECT_TOSNET 2 /* for tos and net */
+#define ICMP_REDIRECT_TOSHOST 3 /* for tos and host */
+#define ICMP_ALTHOSTADDR 6 /* alternate host address */
+#define ICMP_ECHO 8 /* echo service */
+#define ICMP_RTRADVERT 9 /* router advertise, codes: */
+#define ICMP_RTRADVERT_NORMAL 0 /* normal */
+#define ICMP_RTRADVERT_NOROUTE_COMMON 16 /* selective routing */
+#define ICMP_RTRSOLICIT 10 /* router solicitation */
+#define ICMP_TIMEXCEED 11 /* time exceeded, code: */
+#define ICMP_TIMEXCEED_INTRANS 0 /* ttl==0 in transit */
+#define ICMP_TIMEXCEED_REASS 1 /* ttl==0 in reass */
+#define ICMP_PARAMPROB 12 /* ip header bad */
+#define ICMP_PARAMPROB_ERRATPTR 0 /* req. opt. absent */
+#define ICMP_PARAMPROB_OPTABSENT 1 /* req. opt. absent */
+#define ICMP_PARAMPROB_LENGTH 2 /* bad length */
+#define ICMP_TSTAMP 13 /* timestamp request */
+#define ICMP_TSTAMPREPLY 14 /* timestamp reply */
+#define ICMP_INFO 15 /* information request */
+#define ICMP_INFOREPLY 16 /* information reply */
+#define ICMP_MASK 17 /* address mask request */
+#define ICMP_MASKREPLY 18 /* address mask reply */
+#define ICMP_TRACEROUTE 30 /* traceroute */
+#define ICMP_DATACONVERR 31 /* data conversion error */
+#define ICMP_MOBILE_REDIRECT 32 /* mobile host redirect */
+#define ICMP_IPV6_WHEREAREYOU 33 /* IPv6 where-are-you */
+#define ICMP_IPV6_IAMHERE 34 /* IPv6 i-am-here */
+#define ICMP_MOBILE_REG 35 /* mobile registration req */
+#define ICMP_MOBILE_REGREPLY 36 /* mobile registration reply */
+#define ICMP_DNS 37 /* domain name request */
+#define ICMP_DNSREPLY 38 /* domain name reply */
+#define ICMP_SKIP 39 /* SKIP */
+#define ICMP_PHOTURIS 40 /* Photuris */
+#define ICMP_PHOTURIS_UNKNOWN_INDEX 0 /* unknown sec index */
+#define ICMP_PHOTURIS_AUTH_FAILED 1 /* auth failed */
+#define ICMP_PHOTURIS_DECOMPRESS_FAILED 2 /* decompress failed */
+#define ICMP_PHOTURIS_DECRYPT_FAILED 3 /* decrypt failed */
+#define ICMP_PHOTURIS_NEED_AUTHN 4 /* no authentication */
+#define ICMP_PHOTURIS_NEED_AUTHZ 5 /* no authorization */
+#define ICMP_TYPE_MAX 40
+
+#define ICMP_INFOTYPE(type) \
+ ((type) == ICMP_ECHOREPLY || (type) == ICMP_ECHO || \
+ (type) == ICMP_RTRADVERT || (type) == ICMP_RTRSOLICIT || \
+ (type) == ICMP_TSTAMP || (type) == ICMP_TSTAMPREPLY || \
+ (type) == ICMP_INFO || (type) == ICMP_INFOREPLY || \
+ (type) == ICMP_MASK || (type) == ICMP_MASKREPLY)
+
+/*
+ * Echo message data
+ */
+struct icmp_msg_echo {
+ uint16_t icmp_id;
+ uint16_t icmp_seq;
+ uint8_t icmp_data __flexarr; /* optional data */
+};
+
+/*
+ * Fragmentation-needed (unreachable) message data
+ */
+struct icmp_msg_needfrag {
+ uint16_t icmp_void; /* must be zero */
+ uint16_t icmp_mtu; /* MTU of next-hop network */
+ uint8_t icmp_ip __flexarr; /* IP hdr + 8 bytes of pkt */
+};
+
+/*
+ * Unreachable, source quench, redirect, time exceeded,
+ * parameter problem message data
+ */
+struct icmp_msg_quote {
+ uint32_t icmp_void; /* must be zero */
+#define icmp_gwaddr icmp_void /* router IP address to use */
+#define icmp_pptr icmp_void /* ptr to bad octet field */
+ uint8_t icmp_ip __flexarr; /* IP hdr + 8 bytes of pkt */
+};
+
+/*
+ * Router advertisement message data, RFC 1256
+ */
+struct icmp_msg_rtradvert {
+ uint8_t icmp_num_addrs; /* # of address / pref pairs */
+ uint8_t icmp_wpa; /* words / address == 2 */
+ uint16_t icmp_lifetime; /* route lifetime in seconds */
+ struct icmp_msg_rtr_data {
+ uint32_t icmp_void;
+#define icmp_gwaddr icmp_void /* router IP address */
+ uint32_t icmp_pref; /* router preference (usu 0) */
+ } icmp_rtr __flexarr; /* variable # of routers */
+};
+#define ICMP_RTR_PREF_NODEFAULT 0x80000000 /* do not use as default gw */
+
+/*
+ * Timestamp message data
+ */
+struct icmp_msg_tstamp {
+ uint32_t icmp_id; /* identifier */
+ uint32_t icmp_seq; /* sequence number */
+ uint32_t icmp_ts_orig; /* originate timestamp */
+ uint32_t icmp_ts_rx; /* receive timestamp */
+ uint32_t icmp_ts_tx; /* transmit timestamp */
+};
+
+/*
+ * Address mask message data, RFC 950
+ */
+struct icmp_msg_mask {
+ uint32_t icmp_id; /* identifier */
+ uint32_t icmp_seq; /* sequence number */
+ uint32_t icmp_mask; /* address mask */
+};
+
+/*
+ * Traceroute message data, RFC 1393, RFC 1812
+ */
+struct icmp_msg_traceroute {
+ uint16_t icmp_id; /* identifier */
+ uint16_t icmp_void; /* unused */
+ uint16_t icmp_ohc; /* outbound hop count */
+ uint16_t icmp_rhc; /* return hop count */
+ uint32_t icmp_speed; /* link speed, bytes/sec */
+ uint32_t icmp_mtu; /* MTU in bytes */
+};
+
+/*
+ * Domain name reply message data, RFC 1788
+ */
+struct icmp_msg_dnsreply {
+ uint16_t icmp_id; /* identifier */
+ uint16_t icmp_seq; /* sequence number */
+ uint32_t icmp_ttl; /* time-to-live */
+ uint8_t icmp_names __flexarr; /* variable number of names */
+};
+
+/*
+ * Generic identifier, sequence number data
+ */
+struct icmp_msg_idseq {
+ uint16_t icmp_id;
+ uint16_t icmp_seq;
+};
+
+/*
+ * ICMP message union
+ */
+union icmp_msg {
+ struct icmp_msg_echo echo; /* ICMP_ECHO{REPLY} */
+ struct icmp_msg_quote unreach; /* ICMP_UNREACH */
+ struct icmp_msg_needfrag needfrag; /* ICMP_UNREACH_NEEDFRAG */
+ struct icmp_msg_quote srcquench; /* ICMP_SRCQUENCH */
+ struct icmp_msg_quote redirect; /* ICMP_REDIRECT (set to 0) */
+ uint32_t rtrsolicit; /* ICMP_RTRSOLICIT */
+ struct icmp_msg_rtradvert rtradvert; /* ICMP_RTRADVERT */
+ struct icmp_msg_quote timexceed; /* ICMP_TIMEXCEED */
+ struct icmp_msg_quote paramprob; /* ICMP_PARAMPROB */
+ struct icmp_msg_tstamp tstamp; /* ICMP_TSTAMP{REPLY} */
+ struct icmp_msg_idseq info; /* ICMP_INFO{REPLY} */
+ struct icmp_msg_mask mask; /* ICMP_MASK{REPLY} */
+ struct icmp_msg_traceroute traceroute; /* ICMP_TRACEROUTE */
+ struct icmp_msg_idseq dns; /* ICMP_DNS */
+ struct icmp_msg_dnsreply dnsreply; /* ICMP_DNSREPLY */
+};
+
+#ifndef __GNUC__
+# pragma pack()
+#endif
+
+#define icmp_pack_hdr(hdr, type, code) do { \
+ struct icmp_hdr *icmp_pack_p = (struct icmp_hdr *)(hdr); \
+ icmp_pack_p->icmp_type = type; icmp_pack_p->icmp_code = code; \
+} while (0)
+
+#define icmp_pack_hdr_echo(hdr, type, code, id, seq, data, len) do { \
+ struct icmp_msg_echo *echo_pack_p = (struct icmp_msg_echo *) \
+ ((uint8_t *)(hdr) + ICMP_HDR_LEN); \
+ icmp_pack_hdr(hdr, type, code); \
+ echo_pack_p->icmp_id = htons(id); \
+ echo_pack_p->icmp_seq = htons(seq); \
+ memmove(echo_pack_p->icmp_data, data, len); \
+} while (0)
+
+#define icmp_pack_hdr_quote(hdr, type, code, word, pkt, len) do { \
+ struct icmp_msg_quote *quote_pack_p = (struct icmp_msg_quote *) \
+ ((uint8_t *)(hdr) + ICMP_HDR_LEN); \
+ icmp_pack_hdr(hdr, type, code); \
+ quote_pack_p->icmp_void = htonl(word); \
+ memmove(quote_pack_p->icmp_ip, pkt, len); \
+} while (0)
+
+#define icmp_pack_hdr_mask(hdr, type, code, id, seq, mask) do { \
+ struct icmp_msg_mask *mask_pack_p = (struct icmp_msg_mask *) \
+ ((uint8_t *)(hdr) + ICMP_HDR_LEN); \
+ icmp_pack_hdr(hdr, type, code); \
+ mask_pack_p->icmp_id = htons(id); \
+ mask_pack_p->icmp_seq = htons(seq); \
+ mask_pack_p->icmp_mask = htonl(mask); \
+} while (0)
+
+#define icmp_pack_hdr_needfrag(hdr, type, code, mtu, pkt, len) do { \
+ struct icmp_msg_needfrag *frag_pack_p = \
+ (struct icmp_msg_needfrag *)((uint8_t *)(hdr) + ICMP_HDR_LEN); \
+ icmp_pack_hdr(hdr, type, code); \
+ frag_pack_p->icmp_void = 0; \
+ frag_pack_p->icmp_mtu = htons(mtu); \
+ memmove(frag_pack_p->icmp_ip, pkt, len); \
+} while (0)
+
+#endif /* DNET_ICMP_H */
diff --git a/ext/dnet/dnet/intf.h b/ext/dnet/dnet/intf.h
new file mode 100644
index 000000000..38acd4356
--- /dev/null
+++ b/ext/dnet/dnet/intf.h
@@ -0,0 +1,68 @@
+/*
+ * intf.c
+ *
+ * Network interface operations.
+ *
+ * Copyright (c) 2000 Dug Song <dugsong@monkey.org>
+ *
+ * $Id: intf.h,v 1.16 2004/01/13 07:41:09 dugsong Exp $
+ */
+
+#ifndef DNET_INTF_H
+#define DNET_INTF_H
+
+/*
+ * Interface entry
+ */
+#define INTF_NAME_LEN 16
+
+struct intf_entry {
+ u_int intf_len; /* length of entry */
+ char intf_name[INTF_NAME_LEN]; /* interface name */
+ u_short intf_type; /* interface type (r/o) */
+ u_short intf_flags; /* interface flags */
+ u_int intf_mtu; /* interface MTU */
+ struct addr intf_addr; /* interface address */
+ struct addr intf_dst_addr; /* point-to-point dst */
+ struct addr intf_link_addr; /* link-layer address */
+ u_int intf_alias_num; /* number of aliases */
+ struct addr intf_alias_addrs __flexarr; /* array of aliases */
+};
+
+/*
+ * MIB-II interface types - http://www.iana.org/assignments/ianaiftype-mib
+ */
+#define INTF_TYPE_OTHER 1 /* other */
+#define INTF_TYPE_ETH 6 /* Ethernet */
+#define INTF_TYPE_TOKENRING 9 /* Token Ring */
+#define INTF_TYPE_FDDI 15 /* FDDI */
+#define INTF_TYPE_PPP 23 /* Point-to-Point Protocol */
+#define INTF_TYPE_LOOPBACK 24 /* software loopback */
+#define INTF_TYPE_SLIP 28 /* Serial Line Interface Protocol */
+#define INTF_TYPE_TUN 53 /* proprietary virtual/internal */
+
+/*
+ * Interface flags
+ */
+#define INTF_FLAG_UP 0x01 /* enable interface */
+#define INTF_FLAG_LOOPBACK 0x02 /* is a loopback net (r/o) */
+#define INTF_FLAG_POINTOPOINT 0x04 /* point-to-point link (r/o) */
+#define INTF_FLAG_NOARP 0x08 /* disable ARP */
+#define INTF_FLAG_BROADCAST 0x10 /* supports broadcast (r/o) */
+#define INTF_FLAG_MULTICAST 0x20 /* supports multicast (r/o) */
+
+typedef struct intf_handle intf_t;
+
+typedef int (*intf_handler)(const struct intf_entry *entry, void *arg);
+
+__BEGIN_DECLS
+intf_t *intf_open(void);
+int intf_get(intf_t *i, struct intf_entry *entry);
+int intf_get_src(intf_t *i, struct intf_entry *entry, struct addr *src);
+int intf_get_dst(intf_t *i, struct intf_entry *entry, struct addr *dst);
+int intf_set(intf_t *i, const struct intf_entry *entry);
+int intf_loop(intf_t *i, intf_handler callback, void *arg);
+intf_t *intf_close(intf_t *i);
+__END_DECLS
+
+#endif /* DNET_INTF_H */
diff --git a/ext/dnet/dnet/ip.h b/ext/dnet/dnet/ip.h
new file mode 100644
index 000000000..95b7718fb
--- /dev/null
+++ b/ext/dnet/dnet/ip.h
@@ -0,0 +1,487 @@
+/*
+ * ip.h
+ *
+ * Internet Protocol (RFC 791).
+ *
+ * Copyright (c) 2000 Dug Song <dugsong@monkey.org>
+ *
+ * $Id: ip.h,v 1.23 2003/03/16 17:39:17 dugsong Exp $
+ */
+
+#ifndef DNET_IP_H
+#define DNET_IP_H
+
+#define IP_ADDR_LEN 4 /* IP address length */
+#define IP_ADDR_BITS 32 /* IP address bits */
+
+#define IP_HDR_LEN 20 /* base IP header length */
+#define IP_OPT_LEN 2 /* base IP option length */
+#define IP_OPT_LEN_MAX 40
+#define IP_HDR_LEN_MAX (IP_HDR_LEN + IP_OPT_LEN_MAX)
+
+#define IP_LEN_MAX 65535
+#define IP_LEN_MIN IP_HDR_LEN
+
+typedef uint32_t ip_addr_t;
+
+#ifndef __GNUC__
+# define __attribute__(x)
+# pragma pack(1)
+#endif
+
+/*
+ * IP header, without options
+ */
+struct ip_hdr {
+#if DNET_BYTESEX == DNET_BIG_ENDIAN
+ uint8_t ip_v:4, /* version */
+ ip_hl:4; /* header length (incl any options) */
+#elif DNET_BYTESEX == DNET_LIL_ENDIAN
+ uint8_t ip_hl:4,
+ ip_v:4;
+#else
+# error "need to include <dnet.h>"
+#endif
+ uint8_t ip_tos; /* type of service */
+ uint16_t ip_len; /* total length (incl header) */
+ uint16_t ip_id; /* identification */
+ uint16_t ip_off; /* fragment offset and flags */
+ uint8_t ip_ttl; /* time to live */
+ uint8_t ip_p; /* protocol */
+ uint16_t ip_sum; /* checksum */
+ ip_addr_t ip_src; /* source address */
+ ip_addr_t ip_dst; /* destination address */
+};
+
+/*
+ * Type of service (ip_tos), RFC 1349 ("obsoleted by RFC 2474")
+ */
+#define IP_TOS_DEFAULT 0x00 /* default */
+#define IP_TOS_LOWDELAY 0x10 /* low delay */
+#define IP_TOS_THROUGHPUT 0x08 /* high throughput */
+#define IP_TOS_RELIABILITY 0x04 /* high reliability */
+#define IP_TOS_LOWCOST 0x02 /* low monetary cost - XXX */
+#define IP_TOS_ECT 0x02 /* ECN-capable transport */
+#define IP_TOS_CE 0x01 /* congestion experienced */
+
+/*
+ * IP precedence (high 3 bits of ip_tos), hopefully unused
+ */
+#define IP_TOS_PREC_ROUTINE 0x00
+#define IP_TOS_PREC_PRIORITY 0x20
+#define IP_TOS_PREC_IMMEDIATE 0x40
+#define IP_TOS_PREC_FLASH 0x60
+#define IP_TOS_PREC_FLASHOVERRIDE 0x80
+#define IP_TOS_PREC_CRITIC_ECP 0xa0
+#define IP_TOS_PREC_INTERNETCONTROL 0xc0
+#define IP_TOS_PREC_NETCONTROL 0xe0
+
+/*
+ * Fragmentation flags (ip_off)
+ */
+#define IP_RF 0x8000 /* reserved */
+#define IP_DF 0x4000 /* don't fragment */
+#define IP_MF 0x2000 /* more fragments (not last frag) */
+#define IP_OFFMASK 0x1fff /* mask for fragment offset */
+
+/*
+ * Time-to-live (ip_ttl), seconds
+ */
+#define IP_TTL_DEFAULT 64 /* default ttl, RFC 1122, RFC 1340 */
+#define IP_TTL_MAX 255 /* maximum ttl */
+
+/*
+ * Protocol (ip_p) - http://www.iana.org/assignments/protocol-numbers
+ */
+#define IP_PROTO_IP 0 /* dummy for IP */
+#define IP_PROTO_HOPOPTS IP_PROTO_IP /* IPv6 hop-by-hop options */
+#define IP_PROTO_ICMP 1 /* ICMP */
+#define IP_PROTO_IGMP 2 /* IGMP */
+#define IP_PROTO_GGP 3 /* gateway-gateway protocol */
+#define IP_PROTO_IPIP 4 /* IP in IP */
+#define IP_PROTO_ST 5 /* ST datagram mode */
+#define IP_PROTO_TCP 6 /* TCP */
+#define IP_PROTO_CBT 7 /* CBT */
+#define IP_PROTO_EGP 8 /* exterior gateway protocol */
+#define IP_PROTO_IGP 9 /* interior gateway protocol */
+#define IP_PROTO_BBNRCC 10 /* BBN RCC monitoring */
+#define IP_PROTO_NVP 11 /* Network Voice Protocol */
+#define IP_PROTO_PUP 12 /* PARC universal packet */
+#define IP_PROTO_ARGUS 13 /* ARGUS */
+#define IP_PROTO_EMCON 14 /* EMCON */
+#define IP_PROTO_XNET 15 /* Cross Net Debugger */
+#define IP_PROTO_CHAOS 16 /* Chaos */
+#define IP_PROTO_UDP 17 /* UDP */
+#define IP_PROTO_MUX 18 /* multiplexing */
+#define IP_PROTO_DCNMEAS 19 /* DCN measurement */
+#define IP_PROTO_HMP 20 /* Host Monitoring Protocol */
+#define IP_PROTO_PRM 21 /* Packet Radio Measurement */
+#define IP_PROTO_IDP 22 /* Xerox NS IDP */
+#define IP_PROTO_TRUNK1 23 /* Trunk-1 */
+#define IP_PROTO_TRUNK2 24 /* Trunk-2 */
+#define IP_PROTO_LEAF1 25 /* Leaf-1 */
+#define IP_PROTO_LEAF2 26 /* Leaf-2 */
+#define IP_PROTO_RDP 27 /* "Reliable Datagram" proto */
+#define IP_PROTO_IRTP 28 /* Inet Reliable Transaction */
+#define IP_PROTO_TP 29 /* ISO TP class 4 */
+#define IP_PROTO_NETBLT 30 /* Bulk Data Transfer */
+#define IP_PROTO_MFPNSP 31 /* MFE Network Services */
+#define IP_PROTO_MERITINP 32 /* Merit Internodal Protocol */
+#define IP_PROTO_SEP 33 /* Sequential Exchange proto */
+#define IP_PROTO_3PC 34 /* Third Party Connect proto */
+#define IP_PROTO_IDPR 35 /* Interdomain Policy Route */
+#define IP_PROTO_XTP 36 /* Xpress Transfer Protocol */
+#define IP_PROTO_DDP 37 /* Datagram Delivery Proto */
+#define IP_PROTO_CMTP 38 /* IDPR Ctrl Message Trans */
+#define IP_PROTO_TPPP 39 /* TP++ Transport Protocol */
+#define IP_PROTO_IL 40 /* IL Transport Protocol */
+#define IP_PROTO_IPV6 41 /* IPv6 */
+#define IP_PROTO_SDRP 42 /* Source Demand Routing */
+#define IP_PROTO_ROUTING 43 /* IPv6 routing header */
+#define IP_PROTO_FRAGMENT 44 /* IPv6 fragmentation header */
+#define IP_PROTO_RSVP 46 /* Reservation protocol */
+#define IP_PROTO_GRE 47 /* General Routing Encap */
+#define IP_PROTO_MHRP 48 /* Mobile Host Routing */
+#define IP_PROTO_ENA 49 /* ENA */
+#define IP_PROTO_ESP 50 /* Encap Security Payload */
+#define IP_PROTO_AH 51 /* Authentication Header */
+#define IP_PROTO_INLSP 52 /* Integated Net Layer Sec */
+#define IP_PROTO_SWIPE 53 /* SWIPE */
+#define IP_PROTO_NARP 54 /* NBMA Address Resolution */
+#define IP_PROTO_MOBILE 55 /* Mobile IP, RFC 2004 */
+#define IP_PROTO_TLSP 56 /* Transport Layer Security */
+#define IP_PROTO_SKIP 57 /* SKIP */
+#define IP_PROTO_ICMPV6 58 /* ICMP for IPv6 */
+#define IP_PROTO_NONE 59 /* IPv6 no next header */
+#define IP_PROTO_DSTOPTS 60 /* IPv6 destination options */
+#define IP_PROTO_ANYHOST 61 /* any host internal proto */
+#define IP_PROTO_CFTP 62 /* CFTP */
+#define IP_PROTO_ANYNET 63 /* any local network */
+#define IP_PROTO_EXPAK 64 /* SATNET and Backroom EXPAK */
+#define IP_PROTO_KRYPTOLAN 65 /* Kryptolan */
+#define IP_PROTO_RVD 66 /* MIT Remote Virtual Disk */
+#define IP_PROTO_IPPC 67 /* Inet Pluribus Packet Core */
+#define IP_PROTO_DISTFS 68 /* any distributed fs */
+#define IP_PROTO_SATMON 69 /* SATNET Monitoring */
+#define IP_PROTO_VISA 70 /* VISA Protocol */
+#define IP_PROTO_IPCV 71 /* Inet Packet Core Utility */
+#define IP_PROTO_CPNX 72 /* Comp Proto Net Executive */
+#define IP_PROTO_CPHB 73 /* Comp Protocol Heart Beat */
+#define IP_PROTO_WSN 74 /* Wang Span Network */
+#define IP_PROTO_PVP 75 /* Packet Video Protocol */
+#define IP_PROTO_BRSATMON 76 /* Backroom SATNET Monitor */
+#define IP_PROTO_SUNND 77 /* SUN ND Protocol */
+#define IP_PROTO_WBMON 78 /* WIDEBAND Monitoring */
+#define IP_PROTO_WBEXPAK 79 /* WIDEBAND EXPAK */
+#define IP_PROTO_EON 80 /* ISO CNLP */
+#define IP_PROTO_VMTP 81 /* Versatile Msg Transport*/
+#define IP_PROTO_SVMTP 82 /* Secure VMTP */
+#define IP_PROTO_VINES 83 /* VINES */
+#define IP_PROTO_TTP 84 /* TTP */
+#define IP_PROTO_NSFIGP 85 /* NSFNET-IGP */
+#define IP_PROTO_DGP 86 /* Dissimilar Gateway Proto */
+#define IP_PROTO_TCF 87 /* TCF */
+#define IP_PROTO_EIGRP 88 /* EIGRP */
+#define IP_PROTO_OSPF 89 /* Open Shortest Path First */
+#define IP_PROTO_SPRITERPC 90 /* Sprite RPC Protocol */
+#define IP_PROTO_LARP 91 /* Locus Address Resolution */
+#define IP_PROTO_MTP 92 /* Multicast Transport Proto */
+#define IP_PROTO_AX25 93 /* AX.25 Frames */
+#define IP_PROTO_IPIPENCAP 94 /* yet-another IP encap */
+#define IP_PROTO_MICP 95 /* Mobile Internet Ctrl */
+#define IP_PROTO_SCCSP 96 /* Semaphore Comm Sec Proto */
+#define IP_PROTO_ETHERIP 97 /* Ethernet in IPv4 */
+#define IP_PROTO_ENCAP 98 /* encapsulation header */
+#define IP_PROTO_ANYENC 99 /* private encryption scheme */
+#define IP_PROTO_GMTP 100 /* GMTP */
+#define IP_PROTO_IFMP 101 /* Ipsilon Flow Mgmt Proto */
+#define IP_PROTO_PNNI 102 /* PNNI over IP */
+#define IP_PROTO_PIM 103 /* Protocol Indep Multicast */
+#define IP_PROTO_ARIS 104 /* ARIS */
+#define IP_PROTO_SCPS 105 /* SCPS */
+#define IP_PROTO_QNX 106 /* QNX */
+#define IP_PROTO_AN 107 /* Active Networks */
+#define IP_PROTO_IPCOMP 108 /* IP Payload Compression */
+#define IP_PROTO_SNP 109 /* Sitara Networks Protocol */
+#define IP_PROTO_COMPAQPEER 110 /* Compaq Peer Protocol */
+#define IP_PROTO_IPXIP 111 /* IPX in IP */
+#define IP_PROTO_VRRP 112 /* Virtual Router Redundancy */
+#define IP_PROTO_PGM 113 /* PGM Reliable Transport */
+#define IP_PROTO_ANY0HOP 114 /* 0-hop protocol */
+#define IP_PROTO_L2TP 115 /* Layer 2 Tunneling Proto */
+#define IP_PROTO_DDX 116 /* D-II Data Exchange (DDX) */
+#define IP_PROTO_IATP 117 /* Interactive Agent Xfer */
+#define IP_PROTO_STP 118 /* Schedule Transfer Proto */
+#define IP_PROTO_SRP 119 /* SpectraLink Radio Proto */
+#define IP_PROTO_UTI 120 /* UTI */
+#define IP_PROTO_SMP 121 /* Simple Message Protocol */
+#define IP_PROTO_SM 122 /* SM */
+#define IP_PROTO_PTP 123 /* Performance Transparency */
+#define IP_PROTO_ISIS 124 /* ISIS over IPv4 */
+#define IP_PROTO_FIRE 125 /* FIRE */
+#define IP_PROTO_CRTP 126 /* Combat Radio Transport */
+#define IP_PROTO_CRUDP 127 /* Combat Radio UDP */
+#define IP_PROTO_SSCOPMCE 128 /* SSCOPMCE */
+#define IP_PROTO_IPLT 129 /* IPLT */
+#define IP_PROTO_SPS 130 /* Secure Packet Shield */
+#define IP_PROTO_PIPE 131 /* Private IP Encap in IP */
+#define IP_PROTO_SCTP 132 /* Stream Ctrl Transmission */
+#define IP_PROTO_FC 133 /* Fibre Channel */
+#define IP_PROTO_RSVPIGN 134 /* RSVP-E2E-IGNORE */
+#define IP_PROTO_RAW 255 /* Raw IP packets */
+#define IP_PROTO_RESERVED IP_PROTO_RAW /* Reserved */
+#define IP_PROTO_MAX 255
+
+/*
+ * Option types (opt_type) - http://www.iana.org/assignments/ip-parameters
+ */
+#define IP_OPT_CONTROL 0x00 /* control */
+#define IP_OPT_DEBMEAS 0x40 /* debugging & measurement */
+#define IP_OPT_COPY 0x80 /* copy into all fragments */
+#define IP_OPT_RESERVED1 0x20
+#define IP_OPT_RESERVED2 0x60
+
+#define IP_OPT_EOL 0 /* end of option list */
+#define IP_OPT_NOP 1 /* no operation */
+#define IP_OPT_SEC (2|IP_OPT_COPY) /* DoD basic security */
+#define IP_OPT_LSRR (3|IP_OPT_COPY) /* loose source route */
+#define IP_OPT_TS (4|IP_OPT_DEBMEAS) /* timestamp */
+#define IP_OPT_ESEC (5|IP_OPT_COPY) /* DoD extended security */
+#define IP_OPT_CIPSO (6|IP_OPT_COPY) /* commercial security */
+#define IP_OPT_RR 7 /* record route */
+#define IP_OPT_SATID (8|IP_OPT_COPY) /* stream ID (obsolete) */
+#define IP_OPT_SSRR (9|IP_OPT_COPY) /* strict source route */
+#define IP_OPT_ZSU 10 /* experimental measurement */
+#define IP_OPT_MTUP 11 /* MTU probe */
+#define IP_OPT_MTUR 12 /* MTU reply */
+#define IP_OPT_FINN (13|IP_OPT_COPY|IP_OPT_DEBMEAS) /* exp flow control */
+#define IP_OPT_VISA (14|IP_OPT_COPY) /* exp access control */
+#define IP_OPT_ENCODE 15 /* ??? */
+#define IP_OPT_IMITD (16|IP_OPT_COPY) /* IMI traffic descriptor */
+#define IP_OPT_EIP (17|IP_OPT_COPY) /* extended IP, RFC 1385 */
+#define IP_OPT_TR (18|IP_OPT_DEBMEAS) /* traceroute */
+#define IP_OPT_ADDEXT (19|IP_OPT_COPY) /* IPv7 ext addr, RFC 1475 */
+#define IP_OPT_RTRALT (20|IP_OPT_COPY) /* router alert, RFC 2113 */
+#define IP_OPT_SDB (21|IP_OPT_COPY) /* directed bcast, RFC 1770 */
+#define IP_OPT_NSAPA (22|IP_OPT_COPY) /* NSAP addresses */
+#define IP_OPT_DPS (23|IP_OPT_COPY) /* dynamic packet state */
+#define IP_OPT_UMP (24|IP_OPT_COPY) /* upstream multicast */
+#define IP_OPT_MAX 25
+
+#define IP_OPT_COPIED(o) ((o) & 0x80)
+#define IP_OPT_CLASS(o) ((o) & 0x60)
+#define IP_OPT_NUMBER(o) ((o) & 0x1f)
+#define IP_OPT_TYPEONLY(o) ((o) == IP_OPT_EOL || (o) == IP_OPT_NOP)
+
+/*
+ * Security option data - RFC 791, 3.1
+ */
+struct ip_opt_data_sec {
+ uint16_t s; /* security */
+ uint16_t c; /* compartments */
+ uint16_t h; /* handling restrictions */
+ uint8_t tcc[3]; /* transmission control code */
+} __attribute__((__packed__));
+
+#define IP_OPT_SEC_UNCLASS 0x0000 /* unclassified */
+#define IP_OPT_SEC_CONFID 0xf135 /* confidential */
+#define IP_OPT_SEC_EFTO 0x789a /* EFTO */
+#define IP_OPT_SEC_MMMM 0xbc4d /* MMMM */
+#define IP_OPT_SEC_PROG 0x5e26 /* PROG */
+#define IP_OPT_SEC_RESTR 0xaf13 /* restricted */
+#define IP_OPT_SEC_SECRET 0xd788 /* secret */
+#define IP_OPT_SEC_TOPSECRET 0x6bc5 /* top secret */
+
+/*
+ * {Loose Source, Record, Strict Source} Route option data - RFC 791, 3.1
+ */
+struct ip_opt_data_rr {
+ uint8_t ptr; /* from start of option, >= 4 */
+ uint32_t iplist __flexarr; /* list of IP addresses */
+} __attribute__((__packed__));
+
+/*
+ * Timestamp option data - RFC 791, 3.1
+ */
+struct ip_opt_data_ts {
+ uint8_t ptr; /* from start of option, >= 5 */
+#if DNET_BYTESEX == DNET_BIG_ENDIAN
+ uint8_t oflw:4, /* number of IPs skipped */
+ flg:4; /* address[ / timestamp] flag */
+#elif DNET_BYTESEX == DNET_LIL_ENDIAN
+ uint8_t flg:4,
+ oflw:4;
+#endif
+ uint32_t ipts __flexarr; /* IP address [/ timestamp] pairs */
+} __attribute__((__packed__));
+
+#define IP_OPT_TS_TSONLY 0 /* timestamps only */
+#define IP_OPT_TS_TSADDR 1 /* IP address / timestamp pairs */
+#define IP_OPT_TS_PRESPEC 3 /* IP address / zero timestamp pairs */
+
+/*
+ * Traceroute option data - RFC 1393, 2.2
+ */
+struct ip_opt_data_tr {
+ uint16_t id; /* ID number */
+ uint16_t ohc; /* outbound hop count */
+ uint16_t rhc; /* return hop count */
+ uint32_t origip; /* originator IP address */
+} __attribute__((__packed__));
+
+/*
+ * IP option (following IP header)
+ */
+struct ip_opt {
+ uint8_t opt_type; /* option type */
+ uint8_t opt_len; /* option length >= IP_OPT_LEN */
+ union ip_opt_data {
+ struct ip_opt_data_sec sec; /* IP_OPT_SEC */
+ struct ip_opt_data_rr rr; /* IP_OPT_{L,S}RR */
+ struct ip_opt_data_ts ts; /* IP_OPT_TS */
+ uint16_t satid; /* IP_OPT_SATID */
+ uint16_t mtu; /* IP_OPT_MTU{P,R} */
+ struct ip_opt_data_tr tr; /* IP_OPT_TR */
+ uint32_t addext[2]; /* IP_OPT_ADDEXT */
+ uint16_t rtralt; /* IP_OPT_RTRALT */
+ uint32_t sdb[9]; /* IP_OPT_SDB */
+ uint8_t data8[IP_OPT_LEN_MAX - IP_OPT_LEN];
+ } opt_data;
+} __attribute__((__packed__));
+
+#ifndef __GNUC__
+# pragma pack()
+#endif
+
+/*
+ * Classful addressing
+ */
+#define IP_CLASSA(i) (((uint32_t)(i) & htonl(0x80000000)) == \
+ htonl(0x00000000))
+#define IP_CLASSA_NET (htonl(0xff000000))
+#define IP_CLASSA_NSHIFT 24
+#define IP_CLASSA_HOST (htonl(0x00ffffff))
+#define IP_CLASSA_MAX 128
+
+#define IP_CLASSB(i) (((uint32_t)(i) & htonl(0xc0000000)) == \
+ htonl(0x80000000))
+#define IP_CLASSB_NET (htonl(0xffff0000))
+#define IP_CLASSB_NSHIFT 16
+#define IP_CLASSB_HOST (htonl(0x0000ffff))
+#define IP_CLASSB_MAX 65536
+
+#define IP_CLASSC(i) (((uint32_t)(i) & htonl(0xe0000000)) == \
+ htonl(0xc0000000))
+#define IP_CLASSC_NET (htonl(0xffffff00))
+#define IP_CLASSC_NSHIFT 8
+#define IP_CLASSC_HOST (htonl(0x000000ff))
+
+#define IP_CLASSD(i) (((uint32_t)(i) & htonl(0xf0000000)) == \
+ htonl(0xe0000000))
+/* These ones aren't really net and host fields, but routing needn't know. */
+#define IP_CLASSD_NET (htonl(0xf0000000))
+#define IP_CLASSD_NSHIFT 28
+#define IP_CLASSD_HOST (htonl(0x0fffffff))
+#define IP_MULTICAST(i) IP_CLASSD(i)
+
+#define IP_EXPERIMENTAL(i) (((uint32_t)(i) & htonl(0xf0000000)) == \
+ htonl(0xf0000000))
+#define IP_BADCLASS(i) (((uint32_t)(i) & htonl(0xf0000000)) == \
+ htonl(0xf0000000))
+#define IP_LOCAL_GROUP(i) (((uint32_t)(i) & htonl(0xffffff00)) == \
+ htonl(0xe0000000))
+/*
+ * Reserved addresses
+ */
+#define IP_ADDR_ANY (htonl(0x00000000)) /* 0.0.0.0 */
+#define IP_ADDR_BROADCAST (htonl(0xffffffff)) /* 255.255.255.255 */
+#define IP_ADDR_LOOPBACK (htonl(0x7f000001)) /* 127.0.0.1 */
+#define IP_ADDR_MCAST_ALL (htonl(0xe0000001)) /* 224.0.0.1 */
+#define IP_ADDR_MCAST_LOCAL (htonl(0xe00000ff)) /* 224.0.0.225 */
+
+#define ip_pack_hdr(hdr, tos, len, id, off, ttl, p, src, dst) do { \
+ struct ip_hdr *ip_pack_p = (struct ip_hdr *)(hdr); \
+ ip_pack_p->ip_v = 4; ip_pack_p->ip_hl = 5; \
+ ip_pack_p->ip_tos = tos; ip_pack_p->ip_len = htons(len); \
+ ip_pack_p->ip_id = htons(id); ip_pack_p->ip_off = htons(off); \
+ ip_pack_p->ip_ttl = ttl; ip_pack_p->ip_p = p; \
+ ip_pack_p->ip_src = src; ip_pack_p->ip_dst = dst; \
+} while (0)
+
+typedef struct ip_handle ip_t;
+
+__BEGIN_DECLS
+ip_t *ip_open(void);
+size_t ip_send(ip_t *i, const void *buf, size_t len);
+ip_t *ip_close(ip_t *i);
+
+char *ip_ntop(const ip_addr_t *ip, char *dst, size_t len);
+int ip_pton(const char *src, ip_addr_t *dst);
+char *ip_ntoa(const ip_addr_t *ip);
+#define ip_aton ip_pton
+
+size_t ip_add_option(void *buf, size_t len,
+ int proto, const void *optbuf, size_t optlen);
+void ip_checksum(void *buf, size_t len);
+
+inline int
+ip_cksum_add(const void *buf, size_t len, int cksum)
+{
+ uint16_t *sp = (uint16_t *)buf;
+ int n, sn;
+
+ sn = len / 2;
+ n = (sn + 15) / 16;
+
+ /* XXX - unroll loop using Duff's device. */
+ switch (sn % 16) {
+ case 0: do {
+ cksum += *sp++;
+ case 15:
+ cksum += *sp++;
+ case 14:
+ cksum += *sp++;
+ case 13:
+ cksum += *sp++;
+ case 12:
+ cksum += *sp++;
+ case 11:
+ cksum += *sp++;
+ case 10:
+ cksum += *sp++;
+ case 9:
+ cksum += *sp++;
+ case 8:
+ cksum += *sp++;
+ case 7:
+ cksum += *sp++;
+ case 6:
+ cksum += *sp++;
+ case 5:
+ cksum += *sp++;
+ case 4:
+ cksum += *sp++;
+ case 3:
+ cksum += *sp++;
+ case 2:
+ cksum += *sp++;
+ case 1:
+ cksum += *sp++;
+ } while (--n > 0);
+ }
+ if (len & 1)
+ cksum += htons(*(u_char *)sp << 8);
+
+ return (cksum);
+}
+
+inline uint16_t
+ip_cksum_carry(int x)
+{
+ x = (x >> 16) + (x & 0xffff);
+ return ~(x + (x >> 16)) & 0xffff;
+}
+
+__END_DECLS
+
+#endif /* DNET_IP_H */
diff --git a/ext/dnet/dnet/ip6.h b/ext/dnet/dnet/ip6.h
new file mode 100644
index 000000000..7fae29b47
--- /dev/null
+++ b/ext/dnet/dnet/ip6.h
@@ -0,0 +1,183 @@
+/*
+ * ip6.h
+ *
+ * Internet Protocol, Version 6 (RFC 2460).
+ *
+ * Copyright (c) 2002 Dug Song <dugsong@monkey.org>
+ *
+ * $Id: ip6.h,v 1.6 2004/02/23 10:01:15 dugsong Exp $
+ */
+
+#ifndef DNET_IP6_H
+#define DNET_IP6_H
+
+#define IP6_ADDR_LEN 16
+#define IP6_ADDR_BITS 128
+
+#define IP6_HDR_LEN 40 /* IPv6 header length */
+#define IP6_LEN_MIN IP6_HDR_LEN
+#define IP6_LEN_MAX 65535 /* non-jumbo payload */
+
+#define IP6_MTU_MIN 1280 /* minimum MTU (1024 + 256) */
+
+typedef struct ip6_addr {
+ uint8_t data[IP6_ADDR_LEN];
+} ip6_addr_t;
+
+#ifndef __GNUC__
+# define __attribute__(x)
+# pragma pack(1)
+#endif
+
+/*
+ * IPv6 header
+ */
+struct ip6_hdr {
+ union {
+ struct ip6_hdr_ctl {
+ uint32_t ip6_un1_flow; /* 20 bits of flow ID */
+ uint16_t ip6_un1_plen; /* payload length */
+ uint8_t ip6_un1_nxt; /* next header */
+ uint8_t ip6_un1_hlim; /* hop limit */
+ } ip6_un1;
+ uint8_t ip6_un2_vfc; /* 4 bits version, top 4 bits class */
+ } ip6_ctlun;
+ ip6_addr_t ip6_src;
+ ip6_addr_t ip6_dst;
+} __attribute__((__packed__));
+
+#define ip6_vfc ip6_ctlun.ip6_un2_vfc
+#define ip6_flow ip6_ctlun.ip6_un1.ip6_un1_flow
+#define ip6_plen ip6_ctlun.ip6_un1.ip6_un1_plen
+#define ip6_nxt ip6_ctlun.ip6_un1.ip6_un1_nxt /* IP_PROTO_* */
+#define ip6_hlim ip6_ctlun.ip6_un1.ip6_un1_hlim
+
+#define IP6_VERSION 0x60
+#define IP6_VERSION_MASK 0xf0 /* ip6_vfc version */
+
+#if DNET_BYTESEX == DNET_BIG_ENDIAN
+#define IP6_FLOWINFO_MASK 0x0fffffff /* ip6_flow info (28 bits) */
+#define IP6_FLOWLABEL_MASK 0x000fffff /* ip6_flow label (20 bits) */
+#elif DNET_BYTESEX == DNET_LIL_ENDIAN
+#define IP6_FLOWINFO_MASK 0xffffff0f /* ip6_flow info (28 bits) */
+#define IP6_FLOWLABEL_MASK 0xffff0f00 /* ip6_flow label (20 bits) */
+#endif
+
+/*
+ * Hop limit (ip6_hlim)
+ */
+#define IP6_HLIM_DEFAULT 64
+#define IP6_HLIM_MAX 255
+
+/*
+ * Preferred extension header order from RFC 2460, 4.1:
+ *
+ * IP_PROTO_IPV6, IP_PROTO_HOPOPTS, IP_PROTO_DSTOPTS, IP_PROTO_ROUTING,
+ * IP_PROTO_FRAGMENT, IP_PROTO_AH, IP_PROTO_ESP, IP_PROTO_DSTOPTS, IP_PROTO_*
+ */
+
+/*
+ * Routing header data (IP_PROTO_ROUTING)
+ */
+struct ip6_ext_data_routing {
+ uint8_t type; /* routing type */
+ uint8_t segleft; /* segments left */
+ /* followed by routing type specific data */
+} __attribute__((__packed__));
+
+struct ip6_ext_data_routing0 {
+ uint8_t type; /* always zero */
+ uint8_t segleft; /* segments left */
+ uint8_t reserved; /* reserved field */
+ uint8_t slmap[3]; /* strict/loose bit map */
+ ip6_addr_t addr[1]; /* up to 23 addresses */
+} __attribute__((__packed__));
+
+/*
+ * Fragment header data (IP_PROTO_FRAGMENT)
+ */
+struct ip6_ext_data_fragment {
+ uint16_t offlg; /* offset, reserved, and flag */
+ uint32_t ident; /* identification */
+} __attribute__((__packed__));
+
+/*
+ * Fragmentation offset, reserved, and flags (offlg)
+ */
+#if DNET_BYTESEX == DNET_BIG_ENDIAN
+#define IP6_OFF_MASK 0xfff8 /* mask out offset from offlg */
+#define IP6_RESERVED_MASK 0x0006 /* reserved bits in offlg */
+#define IP6_MORE_FRAG 0x0001 /* more-fragments flag */
+#elif DNET_BYTESEX == DNET_LIL_ENDIAN
+#define IP6_OFF_MASK 0xf8ff /* mask out offset from offlg */
+#define IP6_RESERVED_MASK 0x0600 /* reserved bits in offlg */
+#define IP6_MORE_FRAG 0x0100 /* more-fragments flag */
+#endif
+
+/*
+ * Option types, for IP_PROTO_HOPOPTS, IP_PROTO_DSTOPTS headers
+ */
+#define IP6_OPT_PAD1 0x00 /* 00 0 00000 */
+#define IP6_OPT_PADN 0x01 /* 00 0 00001 */
+#define IP6_OPT_JUMBO 0xC2 /* 11 0 00010 = 194 */
+#define IP6_OPT_JUMBO_LEN 6
+#define IP6_OPT_RTALERT 0x05 /* 00 0 00101 */
+#define IP6_OPT_RTALERT_LEN 4
+#define IP6_OPT_RTALERT_MLD 0 /* Datagram contains an MLD message */
+#define IP6_OPT_RTALERT_RSVP 1 /* Datagram contains an RSVP message */
+#define IP6_OPT_RTALERT_ACTNET 2 /* contains an Active Networks msg */
+#define IP6_OPT_LEN_MIN 2
+
+#define IP6_OPT_TYPE(o) ((o) & 0xC0) /* high 2 bits of opt_type */
+#define IP6_OPT_TYPE_SKIP 0x00 /* continue processing on failure */
+#define IP6_OPT_TYPE_DISCARD 0x40 /* discard packet on failure */
+#define IP6_OPT_TYPE_FORCEICMP 0x80 /* discard and send ICMP on failure */
+#define IP6_OPT_TYPE_ICMP 0xC0 /* ...only if non-multicast dst */
+
+#define IP6_OPT_MUTABLE 0x20 /* option data may change en route */
+
+/*
+ * Extension header (chained via {ip6,ext}_nxt, following IPv6 header)
+ */
+struct ip6_ext_hdr {
+ uint8_t ext_nxt; /* next header */
+ uint8_t ext_len; /* following length in units of 8 octets */
+ union {
+ struct ip6_ext_data_routing routing;
+ struct ip6_ext_data_fragment fragment;
+ } ext_data;
+} __attribute__((__packed__));
+
+#ifndef __GNUC__
+# pragma pack()
+#endif
+
+/*
+ * Reserved addresses
+ */
+#define IP6_ADDR_UNSPEC \
+ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+#define IP6_ADDR_LOOPBACK \
+ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01"
+
+#define ip6_pack_hdr(hdr, fc, fl, plen, nxt, hlim, src, dst) do { \
+ struct ip6_hdr *ip6 = (struct ip6_hdr *)(hdr); \
+ ip6->ip6_flow = htonl(((uint32_t)(fc) << 28) & \
+ (IP6_FLOWLABEL_MASK | (fl))); \
+ ip6->ip6_vfc = (IP6_VERSION | ((fc) >> 4)); \
+ ip6->ip6_plen = htons((plen)); \
+ ip6->ip6_nxt = (nxt); ip6->ip6_hlim = (hlim); \
+ memmove(&ip6->ip6_src, &(src), IP6_ADDR_LEN); \
+ memmove(&ip6->ip6_dst, &(dst), IP6_ADDR_LEN); \
+} while (0);
+
+__BEGIN_DECLS
+char *ip6_ntop(const ip6_addr_t *ip6, char *dst, size_t size);
+int ip6_pton(const char *src, ip6_addr_t *dst);
+char *ip6_ntoa(const ip6_addr_t *ip6);
+#define ip6_aton ip6_pton
+
+void ip6_checksum(void *buf, size_t len);
+__END_DECLS
+
+#endif /* DNET_IP6_H */
diff --git a/ext/dnet/dnet/os.h b/ext/dnet/dnet/os.h
new file mode 100644
index 000000000..cae244781
--- /dev/null
+++ b/ext/dnet/dnet/os.h
@@ -0,0 +1,117 @@
+/*
+ * os.h
+ *
+ * Sleazy OS-specific defines.
+ *
+ * Copyright (c) 2000 Dug Song <dugsong@monkey.org>
+ *
+ * $Id: os.h,v 1.10 2004/05/04 03:19:42 dugsong Exp $
+ */
+
+#ifndef DNET_OS_H
+#define DNET_OS_H
+
+#ifdef _WIN32
+# include <windows.h>
+# include <winsock2.h>
+# include <stdint.h>
+/* XXX */
+# undef IP_OPT_LSRR
+# undef IP_OPT_TS
+# undef IP_OPT_RR
+# undef IP_OPT_SSRR
+#else
+# include <sys/param.h>
+# include <sys/types.h>
+# include <sys/socket.h>
+# include <netinet/in.h>
+# include <arpa/inet.h>
+# include <netdb.h>
+# ifdef __bsdi__
+# include <machine/types.h>
+ typedef u_int8_t uint8_t;
+ typedef u_int16_t uint16_t;
+ typedef u_int32_t uint32_t;
+ typedef u_int64_t uint64_t;
+# else
+# include <inttypes.h>
+# endif
+#endif
+
+#define DNET_LIL_ENDIAN 1234
+#define DNET_BIG_ENDIAN 4321
+
+/* BSD and IRIX */
+#ifdef BYTE_ORDER
+#if BYTE_ORDER == LITTLE_ENDIAN
+# define DNET_BYTESEX DNET_LIL_ENDIAN
+#elif BYTE_ORDER == BIG_ENDIAN
+# define DNET_BYTESEX DNET_BIG_ENDIAN
+#endif
+#endif
+
+/* Linux */
+#ifdef __BYTE_ORDER
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+# define DNET_BYTESEX DNET_LIL_ENDIAN
+#elif __BYTE_ORDER == __BIG_ENDIAN
+# define DNET_BYTESEX DNET_BIG_ENDIAN
+#endif
+#endif
+
+/* Solaris */
+#if defined(_BIT_FIELDS_LTOH)
+# define DNET_BYTESEX DNET_LIL_ENDIAN
+#elif defined (_BIT_FIELDS_HTOL)
+# define DNET_BYTESEX DNET_BIG_ENDIAN
+#endif
+
+/* Nastiness from old BIND code. */
+#ifndef DNET_BYTESEX
+# if defined(vax) || defined(ns32000) || defined(sun386) || defined(i386) || \
+ defined(MIPSEL) || defined(_MIPSEL) || defined(BIT_ZERO_ON_RIGHT) || \
+ defined(__alpha__) || defined(__alpha)
+# define DNET_BYTESEX DNET_LIL_ENDIAN
+# elif defined(sel) || defined(pyr) || defined(mc68000) || defined(sparc) || \
+ defined(is68k) || defined(tahoe) || defined(ibm032) || defined(ibm370) || \
+ defined(MIPSEB) || defined(_MIPSEB) || defined(_IBMR2) || defined(DGUX) ||\
+ defined(apollo) || defined(__convex__) || defined(_CRAY) || \
+ defined(__hppa) || defined(__hp9000) || \
+ defined(__hp9000s300) || defined(__hp9000s700) || defined(__ia64) || \
+ defined (BIT_ZERO_ON_LEFT) || defined(m68k)
+# define DNET_BYTESEX DNET_BIG_ENDIAN
+# else
+# error "bytesex unknown"
+# endif
+#endif
+
+/* C++ support. */
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS } /* extern "C" */
+#else
+# define __BEGIN_DECLS
+# define __END_DECLS
+#endif
+
+/* Support for flexible arrays. */
+#undef __flexarr
+#if defined(__GNUC__) && ((__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97))
+/* GCC 2.97 supports C99 flexible array members. */
+# define __flexarr []
+#else
+# ifdef __GNUC__
+# define __flexarr [0]
+# else
+# if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
+# define __flexarr []
+# else
+/* Some other non-C99 compiler. Approximate with [1]. */
+# define __flexarr [1]
+# endif
+# endif
+#endif
+
+#endif /* DNET_OS_H */
diff --git a/ext/dnet/dnet/rand.h b/ext/dnet/dnet/rand.h
new file mode 100644
index 000000000..49121930c
--- /dev/null
+++ b/ext/dnet/dnet/rand.h
@@ -0,0 +1,33 @@
+/*
+ * rand.h
+ *
+ * Pseudo-random number generation, based on OpenBSD arc4random().
+ *
+ * Copyright (c) 2000 Dug Song <dugsong@monkey.org>
+ * Copyright (c) 1996 David Mazieres <dm@lcs.mit.edu>
+ *
+ * $Id: rand.h,v 1.4 2002/04/07 19:01:25 dugsong Exp $
+ */
+
+#ifndef DNET_RAND_H
+#define DNET_RAND_H
+
+typedef struct rand_handle rand_t;
+
+__BEGIN_DECLS
+rand_t *rand_open(void);
+
+int rand_get(rand_t *r, void *buf, size_t len);
+int rand_set(rand_t *r, const void *seed, size_t len);
+int rand_add(rand_t *r, const void *buf, size_t len);
+
+uint8_t rand_uint8(rand_t *r);
+uint16_t rand_uint16(rand_t *r);
+uint32_t rand_uint32(rand_t *r);
+
+int rand_shuffle(rand_t *r, void *base, size_t nmemb, size_t size);
+
+rand_t *rand_close(rand_t *r);
+__END_DECLS
+
+#endif /* DNET_RAND_H */
diff --git a/ext/dnet/dnet/route.h b/ext/dnet/dnet/route.h
new file mode 100644
index 000000000..74c21419c
--- /dev/null
+++ b/ext/dnet/dnet/route.h
@@ -0,0 +1,35 @@
+/*
+ * route.c
+ *
+ * Kernel route table operations.
+ *
+ * Copyright (c) 2000 Dug Song <dugsong@monkey.org>
+ *
+ * $Id: route.h,v 1.6 2002/02/04 04:02:22 dugsong Exp $
+ */
+
+#ifndef DNET_ROUTE_H
+#define DNET_ROUTE_H
+
+/*
+ * Routing table entry
+ */
+struct route_entry {
+ struct addr route_dst; /* destination address */
+ struct addr route_gw; /* gateway address */
+};
+
+typedef struct route_handle route_t;
+
+typedef int (*route_handler)(const struct route_entry *entry, void *arg);
+
+__BEGIN_DECLS
+route_t *route_open(void);
+int route_add(route_t *r, const struct route_entry *entry);
+int route_delete(route_t *r, const struct route_entry *entry);
+int route_get(route_t *r, struct route_entry *entry);
+int route_loop(route_t *r, route_handler callback, void *arg);
+route_t *route_close(route_t *r);
+__END_DECLS
+
+#endif /* DNET_ROUTE_H */
diff --git a/ext/dnet/dnet/tcp.h b/ext/dnet/dnet/tcp.h
new file mode 100644
index 000000000..008946384
--- /dev/null
+++ b/ext/dnet/dnet/tcp.h
@@ -0,0 +1,158 @@
+/*
+ * tcp.h
+ *
+ * Transmission Control Protocol (RFC 793).
+ *
+ * Copyright (c) 2000 Dug Song <dugsong@monkey.org>
+ *
+ * $Id: tcp.h,v 1.17 2004/02/23 10:02:11 dugsong Exp $
+ */
+
+#ifndef DNET_TCP_H
+#define DNET_TCP_H
+
+#define TCP_HDR_LEN 20 /* base TCP header length */
+#define TCP_OPT_LEN 2 /* base TCP option length */
+#define TCP_OPT_LEN_MAX 40
+#define TCP_HDR_LEN_MAX (TCP_HDR_LEN + TCP_OPT_LEN_MAX)
+
+#ifndef __GNUC__
+# define __attribute__(x)
+# pragma pack(1)
+#endif
+
+/*
+ * TCP header, without options
+ */
+struct tcp_hdr {
+ uint16_t th_sport; /* source port */
+ uint16_t th_dport; /* destination port */
+ uint32_t th_seq; /* sequence number */
+ uint32_t th_ack; /* acknowledgment number */
+#if DNET_BYTESEX == DNET_BIG_ENDIAN
+ uint8_t th_off:4, /* data offset */
+ th_x2:4; /* (unused) */
+#elif DNET_BYTESEX == DNET_LIL_ENDIAN
+ uint8_t th_x2:4,
+ th_off:4;
+#else
+# error "need to include <dnet.h>"
+#endif
+ uint8_t th_flags; /* control flags */
+ uint16_t th_win; /* window */
+ uint16_t th_sum; /* checksum */
+ uint16_t th_urp; /* urgent pointer */
+};
+
+/*
+ * TCP control flags (th_flags)
+ */
+#define TH_FIN 0x01 /* end of data */
+#define TH_SYN 0x02 /* synchronize sequence numbers */
+#define TH_RST 0x04 /* reset connection */
+#define TH_PUSH 0x08 /* push */
+#define TH_ACK 0x10 /* acknowledgment number set */
+#define TH_URG 0x20 /* urgent pointer set */
+#define TH_ECE 0x40 /* ECN echo, RFC 3168 */
+#define TH_CWR 0x80 /* congestion window reduced */
+
+#define TCP_PORT_MAX 65535 /* maximum port */
+#define TCP_WIN_MAX 65535 /* maximum (unscaled) window */
+
+/*
+ * Sequence number comparison macros
+ */
+#define TCP_SEQ_LT(a,b) ((int)((a)-(b)) < 0)
+#define TCP_SEQ_LEQ(a,b) ((int)((a)-(b)) <= 0)
+#define TCP_SEQ_GT(a,b) ((int)((a)-(b)) > 0)
+#define TCP_SEQ_GEQ(a,b) ((int)((a)-(b)) >= 0)
+
+/*
+ * TCP FSM states
+ */
+#define TCP_STATE_CLOSED 0 /* closed */
+#define TCP_STATE_LISTEN 1 /* listening from connection */
+#define TCP_STATE_SYN_SENT 2 /* active, have sent SYN */
+#define TCP_STATE_SYN_RECEIVED 3 /* have sent and received SYN */
+
+#define TCP_STATE_ESTABLISHED 4 /* established */
+#define TCP_STATE_CLOSE_WAIT 5 /* rcvd FIN, waiting for close */
+
+#define TCP_STATE_FIN_WAIT_1 6 /* have closed, sent FIN */
+#define TCP_STATE_CLOSING 7 /* closed xchd FIN, await FIN-ACK */
+#define TCP_STATE_LAST_ACK 8 /* had FIN and close, await FIN-ACK */
+
+#define TCP_STATE_FIN_WAIT_2 9 /* have closed, FIN is acked */
+#define TCP_STATE_TIME_WAIT 10 /* in 2*MSL quiet wait after close */
+#define TCP_STATE_MAX 11
+
+/*
+ * Options (opt_type) - http://www.iana.org/assignments/tcp-parameters
+ */
+#define TCP_OPT_EOL 0 /* end of option list */
+#define TCP_OPT_NOP 1 /* no operation */
+#define TCP_OPT_MSS 2 /* maximum segment size */
+#define TCP_OPT_WSCALE 3 /* window scale factor, RFC 1072 */
+#define TCP_OPT_SACKOK 4 /* SACK permitted, RFC 2018 */
+#define TCP_OPT_SACK 5 /* SACK, RFC 2018 */
+#define TCP_OPT_ECHO 6 /* echo (obsolete), RFC 1072 */
+#define TCP_OPT_ECHOREPLY 7 /* echo reply (obsolete), RFC 1072 */
+#define TCP_OPT_TIMESTAMP 8 /* timestamp, RFC 1323 */
+#define TCP_OPT_POCONN 9 /* partial order conn, RFC 1693 */
+#define TCP_OPT_POSVC 10 /* partial order service, RFC 1693 */
+#define TCP_OPT_CC 11 /* connection count, RFC 1644 */
+#define TCP_OPT_CCNEW 12 /* CC.NEW, RFC 1644 */
+#define TCP_OPT_CCECHO 13 /* CC.ECHO, RFC 1644 */
+#define TCP_OPT_ALTSUM 14 /* alt checksum request, RFC 1146 */
+#define TCP_OPT_ALTSUMDATA 15 /* alt checksum data, RFC 1146 */
+#define TCP_OPT_SKEETER 16 /* Skeeter */
+#define TCP_OPT_BUBBA 17 /* Bubba */
+#define TCP_OPT_TRAILSUM 18 /* trailer checksum */
+#define TCP_OPT_MD5 19 /* MD5 signature, RFC 2385 */
+#define TCP_OPT_SCPS 20 /* SCPS capabilities */
+#define TCP_OPT_SNACK 21 /* selective negative acks */
+#define TCP_OPT_REC 22 /* record boundaries */
+#define TCP_OPT_CORRUPT 23 /* corruption experienced */
+#define TCP_OPT_SNAP 24 /* SNAP */
+#define TCP_OPT_TCPCOMP 26 /* TCP compression filter */
+#define TCP_OPT_MAX 27
+
+#define TCP_OPT_TYPEONLY(type) \
+ ((type) == TCP_OPT_EOL || (type) == TCP_OPT_NOP)
+
+/*
+ * TCP option (following TCP header)
+ */
+struct tcp_opt {
+ uint8_t opt_type; /* option type */
+ uint8_t opt_len; /* option length >= TCP_OPT_LEN */
+ union tcp_opt_data {
+ uint16_t mss; /* TCP_OPT_MSS */
+ uint8_t wscale; /* TCP_OPT_WSCALE */
+ uint16_t sack[19]; /* TCP_OPT_SACK */
+ uint32_t echo; /* TCP_OPT_ECHO{REPLY} */
+ uint32_t timestamp[2]; /* TCP_OPT_TIMESTAMP */
+ uint32_t cc; /* TCP_OPT_CC{NEW,ECHO} */
+ uint8_t cksum; /* TCP_OPT_ALTSUM */
+ uint8_t md5[16]; /* TCP_OPT_MD5 */
+ uint8_t data8[TCP_OPT_LEN_MAX - TCP_OPT_LEN];
+ } opt_data;
+} __attribute__((__packed__));
+
+#ifndef __GNUC__
+# pragma pack()
+#endif
+
+#define tcp_pack_hdr(hdr, sport, dport, seq, ack, flags, win, urp) do { \
+ struct tcp_hdr *tcp_pack_p = (struct tcp_hdr *)(hdr); \
+ tcp_pack_p->th_sport = htons(sport); \
+ tcp_pack_p->th_dport = htons(dport); \
+ tcp_pack_p->th_seq = htonl(seq); \
+ tcp_pack_p->th_ack = htonl(ack); \
+ tcp_pack_p->th_x2 = 0; tcp_pack_p->th_off = 5; \
+ tcp_pack_p->th_flags = flags; \
+ tcp_pack_p->th_win = htons(win); \
+ tcp_pack_p->th_urp = htons(urp); \
+} while (0)
+
+#endif /* DNET_TCP_H */
diff --git a/ext/dnet/dnet/udp.h b/ext/dnet/dnet/udp.h
new file mode 100644
index 000000000..73839a92a
--- /dev/null
+++ b/ext/dnet/dnet/udp.h
@@ -0,0 +1,32 @@
+/*
+ * udp.h
+ *
+ * User Datagram Protocol (RFC 768).
+ *
+ * Copyright (c) 2000 Dug Song <dugsong@monkey.org>
+ *
+ * $Id: udp.h,v 1.8 2002/04/02 05:05:39 dugsong Exp $
+ */
+
+#ifndef DNET_UDP_H
+#define DNET_UDP_H
+
+#define UDP_HDR_LEN 8
+
+struct udp_hdr {
+ uint16_t uh_sport; /* source port */
+ uint16_t uh_dport; /* destination port */
+ uint16_t uh_ulen; /* udp length (including header) */
+ uint16_t uh_sum; /* udp checksum */
+};
+
+#define UDP_PORT_MAX 65535
+
+#define udp_pack_hdr(hdr, sport, dport, ulen) do { \
+ struct udp_hdr *udp_pack_p = (struct udp_hdr *)(hdr); \
+ udp_pack_p->uh_sport = htons(sport); \
+ udp_pack_p->uh_dport = htons(dport); \
+ udp_pack_p->uh_ulen = htons(ulen); \
+} while (0)
+
+#endif /* DNET_UDP_H */