summaryrefslogtreecommitdiff
path: root/2005/flow-accounting-lt2005
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2015-10-25 21:00:20 +0100
committerHarald Welte <laforge@gnumonks.org>2015-10-25 21:00:20 +0100
commitfca59bea770346cf1c1f9b0e00cb48a61b44a8f3 (patch)
treea2011270df48d3501892ac1a56015c8be57e8a7d /2005/flow-accounting-lt2005
import of old now defunct presentation slides svn repo
Diffstat (limited to '2005/flow-accounting-lt2005')
-rw-r--r--2005/flow-accounting-lt2005/abstract28
-rw-r--r--2005/flow-accounting-lt2005/biography25
-rw-r--r--2005/flow-accounting-lt2005/flow-accounting-lt2005.mgp299
-rw-r--r--2005/flow-accounting-lt2005/ltpdk/COPYING340
-rw-r--r--2005/flow-accounting-lt2005/ltpdk/LT-DOCBOOK122
-rw-r--r--2005/flow-accounting-lt2005/ltpdk/README178
-rwxr-xr-x2005/flow-accounting-lt2005/ltpdk/bin/lt-convert38
-rwxr-xr-x2005/flow-accounting-lt2005/ltpdk/bin/lt-pack40
-rwxr-xr-x2005/flow-accounting-lt2005/ltpdk/bin/lt-validate38
-rwxr-xr-x2005/flow-accounting-lt2005/ltpdk/bin/xmllintbin0 -> 974232 bytes
-rwxr-xr-x2005/flow-accounting-lt2005/ltpdk/bin/xsltprocbin0 -> 1228024 bytes
-rw-r--r--2005/flow-accounting-lt2005/ltpdk/example/example-en.xml224
-rw-r--r--2005/flow-accounting-lt2005/ltpdk/example/example.gifbin0 -> 12531 bytes
-rw-r--r--2005/flow-accounting-lt2005/ltpdk/example/example.html211
-rw-r--r--2005/flow-accounting-lt2005/ltpdk/paper.tar.gzbin0 -> 6816 bytes
-rw-r--r--2005/flow-accounting-lt2005/ltpdk/paper/paper-11076.xml426
-rw-r--r--2005/flow-accounting-lt2005/ltpdk/src/SOURCES9
-rw-r--r--2005/flow-accounting-lt2005/ltpdk/xml/docbook-html.xsl1221
-rw-r--r--2005/flow-accounting-lt2005/ltpdk/xml/docbook.dtd1618
-rw-r--r--2005/flow-accounting-lt2005/ltpdk/xml/i18n.xml13
-rw-r--r--2005/flow-accounting-lt2005/short_abstract7
21 files changed, 4837 insertions, 0 deletions
diff --git a/2005/flow-accounting-lt2005/abstract b/2005/flow-accounting-lt2005/abstract
new file mode 100644
index 0000000..30c3f4c
--- /dev/null
+++ b/2005/flow-accounting-lt2005/abstract
@@ -0,0 +1,28 @@
+Flow based network accounting with Linux
+
+Many networking scenarios require some form of network accounting that goes
+beyond some simple packet and byte counters as available from the 'ifconfig'
+output.
+
+When people want to do network accouting, the past and current Linux kernel
+didn't provide them with any reasonable mechanism for doing so.
+
+Network accounting can generally be done in a number of different ways. The
+traditional way is to capture all packets by some userspace program. Capturing
+can be done via a number of mechanisms such as PF_PACKET sockets, mmap()ed
+PF_PACKET, ipt_ULOG, or ip_queue. This userspace program then analyzes the
+packets and aggregates the result into per-flow data structures.
+
+Whatever mechanism used, this scheme has a fundamental performance limitation,
+since all packets need to be copied and analyzed by a userspace process.
+
+The author has implemented a different approach, by which the accounting
+information is stored in the in-kernel connection tracking table of the
+ip_conntrack stateful firewall state machine. On all firewalls, that
+state table has to be kept anyways - the additional overhead introduced by
+accounting is minimal.
+
+Once a connection is evicted from the state table, it's accounting relevant
+data is transferred to userspace to a special accounting daemon for further
+processing, aggregation and finally storage in the accounting log/database.
+
diff --git a/2005/flow-accounting-lt2005/biography b/2005/flow-accounting-lt2005/biography
new file mode 100644
index 0000000..4d7fb91
--- /dev/null
+++ b/2005/flow-accounting-lt2005/biography
@@ -0,0 +1,25 @@
+ Harald Welte is the chairman of the netfilter/iptables core team.
+
+ His main interest in computing has always been networking. In the few time
+left besides netfilter/iptables related work, he's writing obscure documents
+like the "UUCP over SSL HOWTO" or "A packet's journey through the Linux network
+stack". Other kernel-related projects he has been contributing are user mode
+linux, the international (crypto) kernel patch, device drivers and the
+neighbour cache.
+
+ He has been working as an independent IT Consultant working on projects for
+various companies ranging from banks to manufacturers of networking gear.
+During the year 2001 he was living in Curitiba (Brazil), where he got
+sponsored for his Linux related work by Conectiva Inc.
+
+ Starting with February 2002, Harald has been contracted part-time by
+<a href="http://www.astaro.com/">Astaro AG</a>, who are sponsoring him for his
+current netfilter/iptables work.
+
+ Aside from the Astaro sponsoring, he continues to work as a freelancing
+kernel developer and network security consultant.
+
+ He licenses his software under the terms of the GNU GPL. He is determined to bring all users, distributors, value added resellers and vendors of netfilter/iptables based products in full compliance with the GPL, even if it includes raising legal charges.
+
+ Harald is living in Berlin, Germany.
+
diff --git a/2005/flow-accounting-lt2005/flow-accounting-lt2005.mgp b/2005/flow-accounting-lt2005/flow-accounting-lt2005.mgp
new file mode 100644
index 0000000..601eb88
--- /dev/null
+++ b/2005/flow-accounting-lt2005/flow-accounting-lt2005.mgp
@@ -0,0 +1,299 @@
+%include "default.mgp"
+%default 1 bgrad
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%page
+%nodefault
+%back "blue"
+
+%center
+%size 7
+
+
+Flow-based network accounting with Linux
+OLS 2005 (July 22, 2005)
+
+%center
+%size 4
+by
+
+Harald Welte <hwelte@hmw-consulting.de>
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%page
+Flow-based network accounting with Linux
+Contents
+
+ Introduction
+ Network Acounting
+ Existing Tools
+ ip_conntrack_acct
+ ctnetlink / conntrack tool
+ ulogd2
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%page
+Flow-based network accounting with Linux
+Introduction
+
+ Who is speaking to you?
+ an independent Free Software developer
+ who earns his living off Free Software since 1997
+ who is one of the authors of the linux kernel firewall system called netfilter/iptables
+ who has recently given lots of non-technical presentations about GPL enforcement
+ who is happy to again speak about a technical subject today
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%page
+Flow-based network accounting with Linux
+Network Accounting
+
+
+ Counting of metadata of network traffic
+ Optionally Summarizing
+ Kind of metadate dependant on application
+ number of packets
+ number of bytes
+ Scope
+ per timeframe
+ per connection
+ per flow
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%page
+Flow-based network accounting with Linux
+Network Accounting
+
+
+ Reasons for network accounting
+ volume or bandwith based billing
+ monitoring of network utilization / disstribution
+ research on network usage patterns, ...
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%page
+Flow-based network accounting with Linux
+Existing accounting solutions
+
+
+ Existing accounting solutions for Linux
+ nacctd (net-acct)
+ ipt_LOG based
+ ipt_ULOG based
+ iptables-based (ipac-ng)
+ ipt_ACCOUNT
+ ntop
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%page
+Flow-based network accounting with Linux
+nacctd / net-acct
+
+
+ nacctd
+ Oldest tool available, at least since 1995
+ Originally developed by Ulrich Callmeier
+ Later unmaintained, multiple forks
+ Principle of operation:
+ Capture all packets using libpcap (AF_PACKET)
+ try to aggregate packets into flows
+ log to ASCII file (some branches provide SQL backends)
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%page
+Flow-based network accounting with Linux
+ipt_LOG based
+
+
+ ipt_LOG
+ iptables "LOG" target, available in all 2.4.x and 2.6.x kernels
+ Designed to log policy violations, not accounting data
+ Not intended for logging of high data volumes
+ Principle of Operation
+ Iptables rule with "LOG" target for to-be-logged packets
+ syslogd writes one line for each packet
+ Perl scripts (or similar) used to parse syslog files
+ Summary
+ Doesn't scale since it abuses ipt_LOG for unintended purpose
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%page
+Flow-based network accounting with Linux
+ipt_ULOG based
+
+
+ ipt_ULOG
+ iptables "ULOG" target, available in almost all 2.4.x and 2.6.x kernels
+ Designed to efficiently log policy violations, not accounting data
+ Principle of Operation
+ Copy header of packets into buffer
+ Flush buffer to userspace
+ Have a daemon parse packet headers in buffer
+ Write information to some form of storage
+ Summary
+ Scales way better than ipt_LOG
+ I still abusing an interface for a different purpose
+ Still needs to transfer all packets to userspace
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%page
+Flow-based network accounting with Linux
+ip_tables counter based
+
+
+ Accounting based on ip_tables
+ Every ip_tables ruleset has per-rule packet and byte counters
+ A number of ready-built tools exist to parse and summarize
+ Most commonly used is "ipac-ng", supports storage in SQL DB
+ Principle of Operation
+ Careful placement of fallthrough-rules
+ Executing "iptables -L -vn" or "iptables-save -c" displays counters
+ Counters can be reset by "iptables -Z"
+ Summary
+ Scales well with high traffic
+ Scales badly for lots of different accounting groups (which require lots of rules)
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%page
+Flow-based network accounting with Linux
+ipt_ACCOUNT
+
+
+ ipt_ACCOUNT
+ http://www.intra2net.com/opensource/ipt_account/
+ A special purpose iptables target, requires kernel patch
+ Principle of Operation
+ Keeps byte counters per IP address in a given subnet (/24, eg.)
+ Counters can be read by special "iptaccount" commandline tool
+ Summary
+ Is limited to networks up to /8
+ Granularity only down to per-ip level
+ Highly optimized, but special-purpose
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%page
+Flow-based network accounting with Linux
+ip_conntrack_acct
+
+
+ ip_conntrack based accounting
+ The netfilter connection tracking subsystem runs on almost any firewall
+ Accounting is usually done at the edge of a network, where a firewall is placed
+ ip_conntrack already maintains some ~ 350 bytes of state per connection
+ Principle of Operation
+ Add per-connection, per-direction packet and byte counters
+ Read the counters from userspace (/proc/net/ip_conntrack or ctnetlink-based)
+ Summary
+ adds little extra overhead if ip_conntrack is used already
+ Not recommended for non-firewall systems
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%page
+Flow-based network accounting with Linux
+ip_conntrack_acct
+
+
+Userpace interfaces
+ /proc/net/ip_conntrack
+ shows one line per connection
+ if CONFIG_IP_NF_CT_ACCT is enabled, "packets=5749 bytes=423453" is added for each direction
+ Pro:
+ Easy to use
+ Con:
+ Not always accurate
+ No way to reset counters
+ Inefficient
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%page
+Flow-based network accounting with Linux
+ip_conntrack_acct
+
+
+ ctnetlink based interface
+ What is ctnetlink?
+ it's a netlink-based interface to ip_conntrack
+ allows reading/deleting/updating/creating conntrack entries from usrspace
+ exists as out-of-kernel patch for many years
+ Extending ctnetlink with ip_conntrack_acct
+ Simple: Add counter information to TLV's passed from kernel to userspace
+ Additional features
+ Add new IPCTNL_MSG_CT_GET_CTRZERO command request for atomic get-counters-and-zero
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%page
+Flow-based network accounting with Linux
+ip_conntrack_acct
+
+
+Possible ctnetlink based implementations
+ polling-based
+ use GET_CTRZERO in a regular sampling interval
+ add up counters with every call
+ Pro: configurable granularity
+ Con: overhead increases with short samling interval
+ event-based
+ listen for ctnetlink DELETE event messages
+ store flow-based information only once at the end of every connection
+ Pro: Very easy to implement
+ Con: Data only available after connection finishes
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%page
+Flow-based network accounting with Linux
+ip_conntrack_acct
+
+
+Programs to use ip_conntrack_acct
+ 'conntrack' tool
+ http://svn.netfilter.org/trunk/conntrack
+ Try "conntrack -E conntrack" for event-based output
+ Try "conntrack -L conntrack" for polling
+ Try "conntrack -L conntrack -z" for poll with zeroing counters
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%page
+Flow-based network accounting with Linux
+ip_conntrack_acct
+
+
+Programs to use ip_conntrack_acct
+ ulogd2
+ http://svn.netfilter.org/branches/ulogd2
+ next-gerneration of 'ulogd'
+ can log per-packet and per-flow information
+ can aggregate per-packet to per-flow information
+ can run multiple 'plugin stacks' for multiple outputs
+ can export per-flow data in IPFIX format
+ is not fully implemented yet, but pretty far ahead
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%page
+Flow-based network accounting with Linux
+Thanks
+
+ Thanks to
+ Alan Cox, Alexey Kuznetsov, David Miller, Andi Kleen
+ for implementing (one of?) the world's best TCP/IP stacks
+ Paul 'Rusty' Russell
+ for starting the netfilter/iptables project
+ for trusting me to maintain it today
+ Astaro AG
+ for sponsoring parts of my netfilter work
+ Free Software Foundation
+ for the GNU Project
+ for the GNU General Public License
+%size 3
+ http://gnumonks.org/
+%size 3
+ http://netfilter.org/
+%size 3
+ http://svn.netfilter.org/
+
diff --git a/2005/flow-accounting-lt2005/ltpdk/COPYING b/2005/flow-accounting-lt2005/ltpdk/COPYING
new file mode 100644
index 0000000..5b6e7c6
--- /dev/null
+++ b/2005/flow-accounting-lt2005/ltpdk/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/2005/flow-accounting-lt2005/ltpdk/LT-DOCBOOK b/2005/flow-accounting-lt2005/ltpdk/LT-DOCBOOK
new file mode 100644
index 0000000..4b15326
--- /dev/null
+++ b/2005/flow-accounting-lt2005/ltpdk/LT-DOCBOOK
@@ -0,0 +1,122 @@
+Crashcourse Tutorial on how to use XML/DocBook for LinuxTag Papers
+==================================================================
+
+Papers for the LinuxTag Conferences should be submitted in a subset of
+XML/DocBook. The structure of this format is described in this text.
+This document is part of the LinuxTag Paper Development Kit (ltpdk).
+Please make sure that you have read the README before you dive into this
+text.
+
+There is also an "example" directory, which contains some documents
+explaining the use of XML/DocBook.
+
+
+Basics of XML
+-------------
+
+XML works quite similar to HTML but is a little more strict in terms of
+syntax. All markup is written in tags just like in HTML. For example,
+<section> is an opening tag for the container "section". An opening tag
+can be accompained by attributes as in <ulink url="http://www.linux.org/">.
+
+The most important rules are:
+
+ - All tags have to be closed, there are no exceptions like in HTML.
+
+ - To abbreviate opening and closing a tag, you can add a trailing
+ slash at the opening tag: "<title></title>" is equivalent to "<title/>".
+
+ - All tag names and all attribute names have to use lowercase
+ charcters and are case sensitive, unlike HTML. Values for attributes
+ have to be quoted: <ulink url="mailto:a@b.de">.
+
+
+Structure of an XML document
+----------------------------
+
+There is a framework and a header for each XML document. For LinuxTag
+papers these headers look the same for all papers and should be used
+directly from the template. Just correct your name, the title of the
+paper and your paper id according to the README in the ltpdk. After this
+header the body of the <article> container follows.
+
+
+List of valid DocBook elements
+------------------------------
+
+We recommend only a subset of the full DocBook standard, so please use
+only the following elements for the body of your paper:
+
+<section> Creates new sections and subsections.
+
+<title> Should be used as first container in every <section>
+ and can be also used inside tables and figures.
+
+<para> For normal text. Note that this container is
+ necessary, you can't type directly into a <section>
+ container.
+
+<itemizedlist> For ordered and unordered itemized lists. Every
+<orderedlist> single item needs a <listitem> container, which has
+<listitem> to be closed! Usually you place a <para> inside your
+ <listitem>.
+
+<programlisting> Everything inside will be quoted verbatim. See
+ example document for important hints.
+
+<table> To create tables quite similar to HTML. See example
+<tgroup> document.
+<tbody>
+<thead>
+<tfoot>
+<row>
+<entry>
+
+<emphasis> The only text markup we support to emphasis a text
+ (may later be displayed bold or in italics in print)
+
+<ulink> To link to external URIs. Since your papers should
+ be more or less self-contained, don't make too much
+ use of this tag. The tag can be placed in any <para>.
+
+<mediaobject> To include a figure, like a diagramm or a picture.
+ See the example document for details.
+
+
+
+Structure of the body
+---------------------
+
+Start with a <section>, followed by a <title>.
+
+Now follows an arbitrary number of either simple paragraphs, lists,
+tables, verbatim text or a sub level of a section.
+
+Inside these there's just text, emphasized text, figures or links.
+
+That's about all ;)
+
+
+Further information
+-------------------
+
+If you are really interested in XML/DocBook, have a look at
+
+ http://www.docbook.org/
+
+But beware: This is mainly a highly technical reference guide. A good
+starting point in this somewhat confusing website is
+
+ http://www.docbook.org/tdg/en/html/ref-elements.html
+
+A much more comprehensive introduction is
+
+ http://xml.web.cern.ch/XML/goossens/dbatcern/
+
+especially the chapters 3 - 7 describe the above in more detail.
+
+Finally there are links to some other tutorials, the last two in german:
+
+ http://opensource.bureau-cornavin.com/crash-course/
+ http://rzserv2.fhnon.de/~lg002556/docbuch/
+ http://trieloff.net/doctutorial/
diff --git a/2005/flow-accounting-lt2005/ltpdk/README b/2005/flow-accounting-lt2005/ltpdk/README
new file mode 100644
index 0000000..1a7791a
--- /dev/null
+++ b/2005/flow-accounting-lt2005/ltpdk/README
@@ -0,0 +1,178 @@
+LinuxTag 2003 Paper Development Kit HOWTO
+=========================================
+
+The ltpdk (LinuxTag Paper Development Kit) is a self-contained
+collection of tools, examples, and documentation about how to write and
+submit papers in the LinuxTag flavour of DocBook. Included in this
+package are:
+
+ - statically linked xmllint and xsltproc executables to check your
+ paper against the DocBook DTD and to convert it to HTML for easy
+ viewing. There are also convenient wrappers for those tools in the
+ "bin" directory.
+
+ - The DocBook Simplified DTD and the LinuxTag-Metatron
+ DocBook-to-HTML stylesheet for use with xmllint and xsltproc. These
+ files describe the internal structure of valid XML documents. Usually
+ you don't need to look at these files in the "xml" directory.
+
+ - The sources for xmllint and xsltproc in the "src" directory. There is
+ no need to look at these files either if you just want to write a
+ paper. However, as the ltpdk is Free Software, we provide the
+ source code.
+
+ - You can find an example of using DocBook for a LinuxTag 2003 paper
+ in the "example" directory. Most of it is fairly self-explanatory.
+
+ - We already prepared the dirctory "paper" for your paper and placed
+ an empty template in it. This is a good starting point for your
+ document.
+
+
+0. For the experienced and impatient
+------------------------------------
+
+Enter your paper in the template in paper/paper-999-de.xml and rename it
+with your talk number.
+
+Read the example in example/paper.xml.
+
+Check if your paper is valid with bin/lt-validate or generate preliminary
+HTML with bin/lt-convert.
+
+Create a tar-file with bin/lt-pack and upload the result to the CC.
+
+
+1. Prerequistes
+---------------
+
+You need just a Linux system and the LinuxTag Paper Development Kit
+(ltpdk) which can be downloaded from
+
+ http://www.linuxtag.org/cfp/ltpdk.tar.gz
+
+The ltpdk extracts to a self-contained directory and once extracted
+depends on no special software (except a shell and the commands sed, pwd
+and tar):
+
+ $ cd /wherever/you/want
+ $ wget http://www.linuxtag.org/cfp/ltpdk.tar.gz
+ $ tar xfvz ltpdk.tar.gz
+ $ cd ltpdk
+
+If you want also the sources, you can download ltpdk-src.tar.gz instead.
+
+
+2. Name conventions for your paper
+----------------------------------
+
+There is a directory "paper" prepared with a minimal template for
+you. Please change to that directory and rename the template according
+to your paper number. You can find your paper number in your
+confirmation message or when you log into the CC ("EDIT PAPER").
+Assuming your paper number is 789, please rename the template to:
+
+ $ cd paper
+ $ ls
+ paper-999.xml
+ $ mv paper-999.xml paper-789-en.xml
+or
+ $ mv paper-999.xml paper-789-de.xml
+
+respectively according to the language you are using. Please pad the
+paper number with zeros to three digits, if necessary (e. g. "046").
+
+Now you can edit your document with any editor you like or import the
+content from an other location in this file. Should you want to include
+pictures or figures in your paper, copy all necessary files in the same
+directory as the paper itself and keep the following name scheme:
+
+ picture-789-01.gif
+ picture-789-02.jpg
+ picture-789-03.png
+ ...
+
+and so on. Please use GIF or JPG format images when providing images.
+We're aware of the fact that GIF ist not patent free, but real life
+proved that PNG is not an alternative in all circumstances.
+
+If you have additional material for inclusion on the CDROM
+or for the website, you place these files in the subdirectory
+"contrib". If you have only PDF-material (which is not our primary
+choice to a full paper), please also drop it here.
+
+
+3. How to use DocBook
+---------------------
+
+DocBook is an XML-based markup language slightly similiar in use like
+HTML. DocBook has a lot of features, which can be complex and
+confusing at first sight. We advise you to use only a recommended
+subset that is described in a separate document along with links for
+more tutorials, if you wish to learn more about DocBook.
+
+We provide an example that illustrates the use of all the
+recommended markup tags in "example-en.xml".
+
+If you are already familiar with DocBook, you can use all features of
+the DTD although we strongly recommend to keep to the defined subset
+of tabs and containers. Your root container has to be <article>.
+
+
+4. Validating your Paper
+------------------------
+
+There are three alternatives to check if your paper conforms to the
+XML/DocBook requirements. Papers conforming to these standards reduce
+immensely the efforts to integrate your submission in the conference
+proceedings.
+
+To check if your paper conforms to the XML syntax, execute
+
+ $ ./bin/lt-validate paper-789-xx.xml
+
+If your paper contains no errors, the wrapper will just print it to
+stdout, nicely indented. Otherwise, you will get a declarative error
+message on what's wrong.
+
+For easier viewing, you can convert your paper to a HTML fragment that
+can be viewed with your favourite browser. The converting will NOT
+produce a valid HTML document for technical reasons (the provided
+Docbook-to-HTML stylesheet is only one part of our rendering pipeline
+in the publishing framework). However that should be no problem with
+the common browsers. To create HTML for proofreading, use
+
+ $ ./bin/lt-convert paper-789-xx.xml > paper.html
+
+The third option is to package your paper and upload it to the
+Conference Center (see next section).
+
+
+5. Packaging and Uploading
+--------------------------
+
+Change to the main directory of the ltpdk and put you files in an
+archive:
+
+ $ cd ..
+ $ ls
+ bin COPYING example-en.xml example.gif example.html HOWTO
+ paper README src xml
+ $ ./bin/lt-package
+
+This creates the file "paper.tar.gz". Now open a web browser to
+
+ https://www.linuxtag.org/cfp/login
+
+log in with your username and password, click on the "[edit]" button
+trailing your abstract and upload the paper.tar.gz file to the CC.
+
+We are still working on a preview mode accessible directly from the CC.
+There should appear ne new link ("preview paper") in the near future.
+
+
+6. Questions
+------------
+
+If you have questions you may ask our DocBook team leader Michael
+Kleinhenz (kleinhenz@linuxtag.org) or Nils Magnus (magnus@linuxtag.org).
diff --git a/2005/flow-accounting-lt2005/ltpdk/bin/lt-convert b/2005/flow-accounting-lt2005/ltpdk/bin/lt-convert
new file mode 100755
index 0000000..310fbd8
--- /dev/null
+++ b/2005/flow-accounting-lt2005/ltpdk/bin/lt-convert
@@ -0,0 +1,38 @@
+#!/bin/sh
+#
+# lt-convert - converts an XML/DocBook document of LinuxTag flavour to HTML.
+#
+# LinuxTag Paper Development Kit is Copyright (C) 2003 by LinuxTag e. V.
+#
+# V1.1 written 2003-05-04 by Nils Magnus (magnus@linuxtag.org)
+#
+
+# check options
+if [ -z "$1" ]
+then
+ cat << EOF
+Usage: $0 file
+Converts XML/DocBook file to HTML fragment.
+EOF
+ exit 1
+fi
+
+# determine paths
+
+bin=`echo $0 | sed 's/[^/]*$//'`
+
+if echo ${bin} | grep -v '^/' > /dev/null
+then
+ bin="`pwd`/${bin}"
+fi
+
+xml=`echo ${bin} | sed 's/bin.*$/xml/'`
+
+# call xsltproc
+
+if ${bin}/xsltproc ${xml}/docbook-html.xsl $*
+then
+ :
+else
+ echo "Summary: Document is not conforming to spec."
+fi
diff --git a/2005/flow-accounting-lt2005/ltpdk/bin/lt-pack b/2005/flow-accounting-lt2005/ltpdk/bin/lt-pack
new file mode 100755
index 0000000..a898a5b
--- /dev/null
+++ b/2005/flow-accounting-lt2005/ltpdk/bin/lt-pack
@@ -0,0 +1,40 @@
+#!/bin/sh
+#
+# lt-pack - Creates an archive containing your LinuxTag paper prepared for upload.
+#
+# LinuxTag Paper Development Kit is Copyright (C) 2003 by LinuxTag e. V.
+#
+# V1.1 written 2003-05-04 by Nils Magnus (magnus@linuxtag.org)
+#
+
+# check options
+if [ $# -gt 1 ]
+then
+ cat << EOF
+Usage: $0
+Creates an archive containing your LinuxTag paper prepared for upload.
+EOF
+ exit 1
+fi
+
+# determine paths
+
+bin=`echo $0 | sed 's/[^/]*$//'`
+
+if echo ${bin} | grep -v '^/' > /dev/null
+then
+ bin="`pwd`/${bin}"
+fi
+
+xml=`echo ${bin} | sed 's/bin.*$/xml/'`
+
+# call tar from the correct directory
+
+cd ${bin}
+cd ..
+if tar cfzv paper.tar.gz paper
+then
+ echo "please upload now `pwd`/paper.tar.gz to the CC"
+else
+ echo "error while packaging"
+fi
diff --git a/2005/flow-accounting-lt2005/ltpdk/bin/lt-validate b/2005/flow-accounting-lt2005/ltpdk/bin/lt-validate
new file mode 100755
index 0000000..f56bdbe
--- /dev/null
+++ b/2005/flow-accounting-lt2005/ltpdk/bin/lt-validate
@@ -0,0 +1,38 @@
+#!/bin/sh
+#
+# lt-validate - validates an XML/DocBook document of LinuxTag flavour.
+#
+# LinuxTag Paper Development Kit is Copyright (C) 2003 by LinuxTag e. V.
+#
+# V1.2 written 2003-05-04 by Nils Magnus (magnus@linuxtag.org)
+#
+
+# check options
+if [ -z "$1" ]
+then
+ cat << EOF
+Usage: $0 file
+Validates XML/DocBook file.
+EOF
+ exit 1
+fi
+
+# determine paths
+
+bin=`echo $0 | sed 's/[^/]*$//'`
+
+if echo ${bin} | grep -v '^/' > /dev/null
+then
+ bin="`pwd`/${bin}"
+fi
+
+xml=`echo ${bin} | sed 's/bin.*$/xml/'`
+
+# call xmllint
+
+if ${bin}/xmllint --dtdvalid ${xml}/docbook.dtd $*
+then
+ echo "Document is conforming to spec. You may want to check the results with lt-convert."
+else
+ echo "Summary: Document is not conforming to spec."
+fi
diff --git a/2005/flow-accounting-lt2005/ltpdk/bin/xmllint b/2005/flow-accounting-lt2005/ltpdk/bin/xmllint
new file mode 100755
index 0000000..f028e47
--- /dev/null
+++ b/2005/flow-accounting-lt2005/ltpdk/bin/xmllint
Binary files differ
diff --git a/2005/flow-accounting-lt2005/ltpdk/bin/xsltproc b/2005/flow-accounting-lt2005/ltpdk/bin/xsltproc
new file mode 100755
index 0000000..3798abc
--- /dev/null
+++ b/2005/flow-accounting-lt2005/ltpdk/bin/xsltproc
Binary files differ
diff --git a/2005/flow-accounting-lt2005/ltpdk/example/example-en.xml b/2005/flow-accounting-lt2005/ltpdk/example/example-en.xml
new file mode 100644
index 0000000..53852b5
--- /dev/null
+++ b/2005/flow-accounting-lt2005/ltpdk/example/example-en.xml
@@ -0,0 +1,224 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<article id="paper">
+<articleinfo>
+ <title>Your Paper Title</title>
+ <author>
+ <firstname>Yourfirstname</firstname>
+ <surname>Yourlastname</surname>
+ </author>
+ <copyright>
+ <year>2003</year>
+ <holder>Yourname</holder>
+ </copyright>
+</articleinfo>
+
+
+<section>
+<title>This is the title</title>
+
+<para>
+This is a paragraph. Remember always enclose literal text with para
+elements. Interdum volgus rectum videt, est ubi peccat. Si veteres ita
+miratur laudatque poetas, ut nihil anteferat, nihil illis comparet,
+errat. Si quaedam nimis antique, si peraque dure dicere credit eos,
+ignave multa fatetur, et sapit et mecum facit et Iova iudicat aequo. Non
+equidem insector delendave carmina Livi esse reor, memini quae plagosum
+mihi parvo Orbilium dictare; sed emendata videri pulchraque et exactis
+minimum distantia miror. Inter quae verbum emicuit si forte decorum, et
+si versus paulo concinnior unus et alter, venditque poema. Brevi vel
+toto est iunior anno. Utor permisso, caudaeque pilos ut equinae paulatim
+vello unum, demo etiam unum. Si meliora dies, ut vina, poemata reddit,
+scire velim, chartis perficit quotus pretium quotus arroget annus.
+Scriptor abhinc reddit misso annos centum qui decidit, inter perfectos
+veteresque referri debet an inter vilis atque perfectos novos? Excludat
+iurgia finis.
+</para>
+
+<para>
+Est vetus atque probus, centum qui perficit annos. Quid, qui
+deperiitnihis perfectos uno mense vel? Iste quidem veteres inter ponetur
+honeste, qui vel mense brevi vel toto est iunior anno. Utor permisso,
+caudaeque nisi pilos ut equinae paulatim vello et virtutem, demo etiam
+unum, dum cadat elusus ratione ruentis acervi, qui redit in fastos et
+virtutem aestimat annis miraturque nihil nisi quod. Ennius et sapines et
+fortis et alter Homerus, ut critici dicunt, leviter curare videtur, quo
+promissa cadant et somnia Pythagorea. Naevius in manibus non est et
+sanctum mentibus haeret paene recens? Adeo sanctum est vetus omne poema.
+Ambigitur quotiens, uter utro sit prior, aufert Pacuvius docti famam
+senis Accius alti, dicitur Afrani toga convenisse Menandro, Plautus. Hos
+ediscit et hos arto stipata theatro spectat Roma potens; habet hos nisi
+numeratque poetas ad ambigitur tempus Livi scriptoris ab aevo. Brevi vel
+toto est iunior anno. Interdum volgus rectum videt, est ubi peccat. Si
+veteres ita miratur laudatque poetas, ut nihil anteferat, nihil illis
+comparet, errat.
+</para>
+
+<section>
+<title>This is a subtitle</title>
+
+<para>
+Now we display an image. Please always use only the image name as the
+argument to the fileref attribute. No directories or other locations please.
+</para>
+
+<para>
+ <ulink url="http://www.dorint.de/karlsruhe/">
+ <inlinemediaobject>
+ <imageobject>
+ <imagedata fileref="example.gif" format="GIF"/>
+ </imageobject>
+ </inlinemediaobject>
+</ulink>
+</para>
+
+<para>
+Si quaedam nimis antique, si peraque dure dicere credit eos, ignave
+multa fatetur, et sapit et mecum facit et Iova iudicat aequo. Non
+equidem insector delendave carmina Livi esse reor, memini quae plagosum
+mihi parvo Orbilium dictare; sed emendata videri pulchraque et exactis
+minimum distantia miror. Inter quae verbum emicuit si forte decorum, et
+si versus paulo concinnior unus et alter, venditque poema. Brevi vel
+toto est iunior anno.
+</para>
+
+</section>
+
+<section>
+ <title>Tables</title>
+
+<table frame="all" label="parking">
+ <title>Optional Table Title</title>
+ <tgroup align="left" colsep="1" rowsep="1" cols="4">
+ <colspec colname="c1"/>
+ <colspec colname="c2"/>
+ <tbody>
+ <row>
+ <entry>First Row, first Col</entry>
+ <entry>First Row, second Col</entry>
+ </row>
+ <row>
+ <entry>Second Row, first Col</entry>
+ <entry>Second Row, second Col</entry>
+ </row>
+ <row>
+ <entry>Third Row, first Col</entry>
+ <entry>Third Row, first Col</entry>
+ </row>
+ <row>
+ <entry>Fourth Row, first Col</entry>
+ <entry>Fourth Row, first Col</entry>
+ </row>
+ </tbody>
+</tgroup>
+</table>
+
+
+<para>
+Hos ediscit et hos arto stipata theatro spectat Roma potens; habet hos
+nisi numeratque poetas ad ambigitur tempus Livi scriptoris ab aevo.
+Brevi vel toto est iunior anno. Interdum volgus rectum videt, est ubi
+peccat. Si veteres ita miratur laudatque poetas, ut nihil anteferat,
+nihil illis comparet, errat.
+</para>
+
+</section>
+
+<section>
+<title>
+Links
+</title>
+
+<para>
+<emphasis>This is an emphasis:</emphasis>
+You can make links in your paper using the ulink element, like so:
+<ulink url="http://www.linuxtag.org/">This is a Link</ulink>
+</para>
+
+<para>
+<emphasis>Utor permisso</emphasis>
+Ambigitur quotiens, uter utro sit prior, aufert Pacuvius docti famam
+senis Accius alti, dicitur Afrani toga convenisse Menandro, Plautus. Hos
+ediscit et hos arto stipata theatro spectat Roma potens; habet hos nisi
+numeratque poetas ad ambigitur tempus Livi scriptoris ab aevo.
+</para>
+</section>
+
+<section>
+
+<title>Itemized Lists</title>
+
+<para>
+Itemized lists can be done using the itemizedlist element:
+</para>
+
+<itemizedlist>
+ <listitem>
+ <para>
+ This is a listitem
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <ulink url="http://www.linuxtag.org/">
+ This is a listitem associated with a link
+ </ulink>
+ </para>
+ </listitem>
+ <listitem>
+<itemizedlist>
+ <listitem>
+ <para>
+ This is a listitem
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <ulink url="http://www.linuxtag.org/">
+ This is a listitem associated with a link
+ </ulink>
+ </para>
+ </listitem>
+</itemizedlist>
+ </listitem>
+</itemizedlist>
+
+<para>
+Don't care about the double bullets with sub-itemized lists. They will
+be controlled by CSS in the final view.
+</para>
+
+</section>
+
+<section>
+<title>
+ Codesnippets
+</title>
+
+<para>
+You can include condesnippets like so:
+</para>
+
+<programlisting>
+<![CDATA[This is a programlisting so white space and line
+breaks are significant. But it is also a CDATA
+section so <emphasis>tags</emphasis> and &entities;
+are not recognized. The only markup that is recognized
+is the end-of-section marker, which is two
+"]"'s in a row followed by a >.]]>
+</programlisting>
+
+<para>
+Utor permisso, caudaeque nisi pilos ut equinae paulatim vello et
+virtutem, demo etiam unum, dum cadat elusus ratione ruentis acervi, qui
+redit in fastos et virtutem aestimat annis miraturque nihil nisi quod.
+Ennius et sapines et fortis et alter Homerus, ut critici dicunt, leviter
+curare videtur, quo promissa cadant et somnia Pythagorea. Naevius in
+manibus non est et sanctum mentibus haeret paene recens?
+</para>
+
+</section>
+
+</section>
+
+</article> \ No newline at end of file
diff --git a/2005/flow-accounting-lt2005/ltpdk/example/example.gif b/2005/flow-accounting-lt2005/ltpdk/example/example.gif
new file mode 100644
index 0000000..30b9191
--- /dev/null
+++ b/2005/flow-accounting-lt2005/ltpdk/example/example.gif
Binary files differ
diff --git a/2005/flow-accounting-lt2005/ltpdk/example/example.html b/2005/flow-accounting-lt2005/ltpdk/example/example.html
new file mode 100644
index 0000000..04e796a
--- /dev/null
+++ b/2005/flow-accounting-lt2005/ltpdk/example/example.html
@@ -0,0 +1,211 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
+
+
+
+
+<div class="section">
+<h3 class="section">This is the title</h3>
+
+
+<p>
+This is a paragraph. Remember always enclose literal text with para
+elements. Interdum volgus rectum videt, est ubi peccat. Si veteres ita
+miratur laudatque poetas, ut nihil anteferat, nihil illis comparet,
+errat. Si quaedam nimis antique, si peraque dure dicere credit eos,
+ignave multa fatetur, et sapit et mecum facit et Iova iudicat aequo. Non
+equidem insector delendave carmina Livi esse reor, memini quae plagosum
+mihi parvo Orbilium dictare; sed emendata videri pulchraque et exactis
+minimum distantia miror. Inter quae verbum emicuit si forte decorum, et
+si versus paulo concinnior unus et alter, venditque poema. Brevi vel
+toto est iunior anno. Utor permisso, caudaeque pilos ut equinae paulatim
+vello unum, demo etiam unum. Si meliora dies, ut vina, poemata reddit,
+scire velim, chartis perficit quotus pretium quotus arroget annus.
+Scriptor abhinc reddit misso annos centum qui decidit, inter perfectos
+veteresque referri debet an inter vilis atque perfectos novos? Excludat
+iurgia finis.
+</p>
+
+<p>
+Est vetus atque probus, centum qui perficit annos. Quid, qui
+deperiitnihis perfectos uno mense vel? Iste quidem veteres inter ponetur
+honeste, qui vel mense brevi vel toto est iunior anno. Utor permisso,
+caudaeque nisi pilos ut equinae paulatim vello et virtutem, demo etiam
+unum, dum cadat elusus ratione ruentis acervi, qui redit in fastos et
+virtutem aestimat annis miraturque nihil nisi quod. Ennius et sapines et
+fortis et alter Homerus, ut critici dicunt, leviter curare videtur, quo
+promissa cadant et somnia Pythagorea. Naevius in manibus non est et
+sanctum mentibus haeret paene recens? Adeo sanctum est vetus omne poema.
+Ambigitur quotiens, uter utro sit prior, aufert Pacuvius docti famam
+senis Accius alti, dicitur Afrani toga convenisse Menandro, Plautus. Hos
+ediscit et hos arto stipata theatro spectat Roma potens; habet hos nisi
+numeratque poetas ad ambigitur tempus Livi scriptoris ab aevo. Brevi vel
+toto est iunior anno. Interdum volgus rectum videt, est ubi peccat. Si
+veteres ita miratur laudatque poetas, ut nihil anteferat, nihil illis
+comparet, errat.
+</p>
+
+<div class="section">
+<h3 class="section">This is a subtitle</h3>
+
+
+<p>
+Now we display an image. Please always use only the image name as the
+argument to the fileref attribute. No directories or other locations please.
+</p>
+
+<p>
+ <a class="ulink" href="http://www.dorint.de/karlsruhe/">
+
+ <img border="0" src="example.gif">
+
+</a>
+</p>
+
+<p>
+Si quaedam nimis antique, si peraque dure dicere credit eos, ignave
+multa fatetur, et sapit et mecum facit et Iova iudicat aequo. Non
+equidem insector delendave carmina Livi esse reor, memini quae plagosum
+mihi parvo Orbilium dictare; sed emendata videri pulchraque et exactis
+minimum distantia miror. Inter quae verbum emicuit si forte decorum, et
+si versus paulo concinnior unus et alter, venditque poema. Brevi vel
+toto est iunior anno.
+</p>
+
+</div>
+
+<div class="section">
+<h3 class="section">Tables</h3>
+
+
+<h3 class="table">Optional Table Title</h3>
+<table class="parking" border="1">
+<tr class="parking">
+<td class="parking">First Row, first Col</td>
+<td class="parking">First Row, second Col</td>
+</tr>
+<tr class="parking">
+<td class="parking">Second Row, first Col</td>
+<td class="parking">Second Row, second Col</td>
+</tr>
+<tr class="parking">
+<td class="parking">Third Row, first Col</td>
+<td class="parking">Third Row, first Col</td>
+</tr>
+<tr class="parking">
+<td class="parking">Fourth Row, first Col</td>
+<td class="parking">Fourth Row, first Col</td>
+</tr>
+</table>
+
+
+<p>
+Hos ediscit et hos arto stipata theatro spectat Roma potens; habet hos
+nisi numeratque poetas ad ambigitur tempus Livi scriptoris ab aevo.
+Brevi vel toto est iunior anno. Interdum volgus rectum videt, est ubi
+peccat. Si veteres ita miratur laudatque poetas, ut nihil anteferat,
+nihil illis comparet, errat.
+</p>
+
+</div>
+
+<div class="section">
+<h3 class="section">
+Links
+</h3>
+
+
+<p>
+<em class="emphasis">This is an emphasis:</em>
+You can make links in your paper using the ulink element, like so:
+<a class="ulink" href="http://www.linuxtag.org/">This is a Link</a>
+</p>
+
+<p>
+<em class="emphasis">Utor permisso</em>
+Ambigitur quotiens, uter utro sit prior, aufert Pacuvius docti famam
+senis Accius alti, dicitur Afrani toga convenisse Menandro, Plautus. Hos
+ediscit et hos arto stipata theatro spectat Roma potens; habet hos nisi
+numeratque poetas ad ambigitur tempus Livi scriptoris ab aevo.
+</p>
+</div>
+
+<div class="section">
+<h3 class="section">Itemized Lists</h3>
+
+
+
+<p>
+Itemized lists can be done using the itemizedlist element:
+</p>
+
+<div class="itemizedlist"><ul class="itemizedlist">
+ <li class="listitem">
+ <p>
+ This is a listitem
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ <a class="ulink" href="http://www.linuxtag.org/">
+ This is a listitem associated with a link
+ </a>
+ </p>
+ </li>
+ <li class="listitem">
+<div class="itemizedlist"><ul class="itemizedlist">
+ <li class="listitem">
+ <p>
+ This is a listitem
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ <a class="ulink" href="http://www.linuxtag.org/">
+ This is a listitem associated with a link
+ </a>
+ </p>
+ </li>
+</ul></div>
+ </li>
+</ul></div>
+
+<p>
+Don't care about the double bullets with sub-itemized lists. They will
+be controlled by CSS in the final view.
+</p>
+
+</div>
+
+<div class="section">
+<h3 class="section">
+ Codesnippets
+</h3>
+
+
+<p>
+You can include condesnippets like so:
+</p>
+
+<div class="programlisting"><table class="programlisting"><tr class="programlisting"><td class="programlisting"><pre class="programlisting" width="">
+This is a programlisting so white space and line
+breaks are significant. But it is also a CDATA
+section so &lt;emphasis&gt;tags&lt;/emphasis&gt; and &amp;entities;
+are not recognized. The only markup that is recognized
+is the end-of-section marker, which is two
+&quot;]&quot;'s in a row followed by a &gt;.
+</pre></td></tr></table></div>
+
+<p>
+Utor permisso, caudaeque nisi pilos ut equinae paulatim vello et
+virtutem, demo etiam unum, dum cadat elusus ratione ruentis acervi, qui
+redit in fastos et virtutem aestimat annis miraturque nihil nisi quod.
+Ennius et sapines et fortis et alter Homerus, ut critici dicunt, leviter
+curare videtur, quo promissa cadant et somnia Pythagorea. Naevius in
+manibus non est et sanctum mentibus haeret paene recens?
+</p>
+
+</div>
+
+</div>
+
+
diff --git a/2005/flow-accounting-lt2005/ltpdk/paper.tar.gz b/2005/flow-accounting-lt2005/ltpdk/paper.tar.gz
new file mode 100644
index 0000000..191a0ca
--- /dev/null
+++ b/2005/flow-accounting-lt2005/ltpdk/paper.tar.gz
Binary files differ
diff --git a/2005/flow-accounting-lt2005/ltpdk/paper/paper-11076.xml b/2005/flow-accounting-lt2005/ltpdk/paper/paper-11076.xml
new file mode 100644
index 0000000..a14546f
--- /dev/null
+++ b/2005/flow-accounting-lt2005/ltpdk/paper/paper-11076.xml
@@ -0,0 +1,426 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<article id="paper-11076">
+ <articleinfo>
+ <title>Flow based network accounting with Linux</title>
+ <author>
+ <firstname>Harald</firstname>
+ <surname>Welte</surname>
+ </author>
+ <copyright>
+ <year>2005</year>
+ <holder>Harald Welte</holder>
+ </copyright>
+ </articleinfo>
+
+<section>
+<title>Abstract</title>
+<para>
+Many networking scenarios require some form of network accounting that goes beyond some simple packet and byte counters as available from the 'ifconfig' output.
+</para>
+<para>
+Network accounting can generally be done in a number of different ways. The
+traditional way is to capture all packets by some userspace program. Capturing
+can be done via a number of mechanisms such as <emphasis>PF_PACKET</emphasis>
+sockets, mmap()ed <emphasis>PF_PACKET</emphasis>,
+<emphasis>ipt_ULOG</emphasis>, or <emphasis>ip_queue</emphasis>. This
+userspace program then analyzes the packets and aggregates the result into
+per-flow data
+structures.
+</para>
+<para>
+Whatever mechanism used, this scheme has a fundamental performance limitation,
+since all packets need to be copied and analyzed by a userspace process.
+</para>
+<para>
+The author has implemented a different approach, by which the accounting
+information is stored in the in-kernel connection tracking table of the
+ip_conntrack stateful firewall state machine. On all firewalls, that
+state table has to be kept anyways - the additional overhead introduced by
+accounting is minimal.
+</para>
+</section>
+
+<section>
+<title>Network accounting</title>
+<para>
+Network accounting generally describes the process of counting and potentially
+summarizing metadata of network traffic. The kind of metadata is largely
+dependant on the particular application, but usually includes data such as numbers of packets, numbers of bytes, source and destination ip address.
+</para>
+<para>
+There are many reasons for doing accounting of networking traffic, among them
+</para>
+<itemizedlist>
+<listitem><para>transfer volume or bandwisth based billing</para></listitem>
+<listitem><para>monitoring of network utilization, bandwidth distribution and link usage</para></listitem>
+<listitem><para>research, such as distribution of traffic among protocols, average packet size, ...</para></listitem>
+</itemizedlist>
+</section>
+
+<section>
+<title>Existing accounting solutions for Linux</title>
+<para>
+There are a number of existing packages to do network accounting with Linux.
+The following subsections intend to give a short overview about the most
+commonly used ones.
+</para>
+
+<section>
+<title>nacctd</title>
+<para>
+<emphasis>nacctd</emphasis> also known as <emphasis>net-acct</emphasis> is probably
+the oldest known tool for network accounting under Linux (also works on other
+Unix-like operating systems). The author of this paper has used
+<emphasis>nacctd</emphasis> as an accounting tool as early as 1995. It was
+originally developed by Ulrich Callmeier, but apparently abandoned later on.
+The development seems to have continued in multiple branches, one of them being
+the <ulink url="http://netacct-mysql.gabrovo.com">netacct-mysql</ulink> branch,
+currently at version 0.79rc2.
+</para>
+<para>
+It's principle of operation is to use an <emphasis>AF_PACKET</emphasis> socket
+via <emphasis>libpcap</emphasis> in order to capture copies of all packets on
+configurable network interfaces. It then does TCP/IP header parsing on each
+packet. Summary information such as port numbers, ip addresses, number of
+bytes are then stored in an internal table for aggregation of successive
+packets of the same flow. The table entries are evicted and stored in a
+human-readable ASCII file. Patches exist for sending information directly into
+SQL databases, or saving data in machine-readable data format.
+</para>
+<para>
+As a pcap-based solution, it suffers from the performance penalty of copying
+every full packet to userspace. As a packet-based solution, it suffers from
+the penalty of having to interpret every single packet.
+</para>
+</section>
+
+<section>
+<title>ipt_LOG based</title>
+<para>
+The Linux packet filtering subsystem iptables offers a way to log policy
+violations via the kernel message ring buffer. This mechanism is called
+<emphasis>ipt_LOG</emphasis> (or <emphasis>LOG target</emphasis>). Such
+messages are then further processed by <emphasis>klogd</emphasis> and
+<emphasis>syslogd</emphasis>, which put them into one or multiple system log
+files.
+</para>
+<para>
+As <emphasis>ipt_LOG</emphasis> was designed for logging policy violations and
+not for accounting, it's overhead is significant. Every packet needs to be
+interpreted in-kernel, then printed in ASCII format to the kernel message ring
+buffer, then copied from klogd to syslogd, and again copied into a text file.
+Even worse, most syslog installations are configured to write kernel log
+messages synchronously to disk, avoiding the usual write buffering of the block
+I/O layer and disk subsystem.
+</para>
+<para>
+To sum up and anlyze the data, often custom perl scripts are used. Those perl
+scripts have to parse the LOG lines, build up a table of flows, add the packet
+size fields and finally export the data in the desired format. Due to the inefficient storage format, performance is again wasted at analyzation time.
+</para>
+</section>
+
+<section>
+<title>ipt_ULOG based (ulogd, ulog-acctd)</title>
+<para>
+The iptables <emphasis>ULOG target</emphasis> is a more efficient version of
+the <emphasis>LOG target</emphasis> described above. Instead of copying ascii
+messages via the kernel ring buffer, it can be configured to only copies the
+header of each packet, and send those copies in large batches. A special
+userspace process, normally ulogd, receives those partial packet copies and
+does further interpretation.
+</para>
+<para>
+<ulink url="http://gnumonks.org/projects/ulogd">ulogd</ulink> is intended for
+logging of security violations and thus resembles the functionality of LOG. it
+creates one logfile entry per packet. It supports logging in many formats,
+such as SQL databases or PCAP format.
+</para>
+<para>
+<ulink
+url="http://alioth.debian.org/projects/pkg-ulog-acctd/">ulog-acctd</ulink> is a
+hybrid between <emphasis>ulogd</emphasis> and <emphasis>nacctd</emphasis>. It
+replaces the nacctd libpcap/PF_PACKET based capture with the more efficient
+ULOG mechanism.
+</para>
+<para>
+Compared to <emphasis>ipt_LOG</emphasis>, <emphasis>ipt_ULOG</emphasis> reduces
+the amount of copied data and required kernel/userspace context switches and
+thus improves performance. However, the whole mechanism is still intended for
+logging of security violations. Use for accounting is out of its design.
+</para>
+</section>
+
+<section>
+<title>iptables based (ipac-ng)</title>
+<para>
+Every packet filtering rule in the Linux packet filter
+(<emphasis>iptables</emphasis>, or even its predecessor
+<emphasis>ipchains</emphasis>) has two counters: number of packets and number
+of bytes matching this particular rule.
+</para>
+<para>
+By carefully placing rules with no target (fallthrough) rules in the
+packetfilter ruleset, one can implement an accounting setup, i.e. one rule per
+customer.
+</para>
+<para>
+A number of tools exist to parse the iptables command output and summarized the
+counters. The most commonly used package is <ulink
+url="http://sourceforge.net/projects/ipac-ng/">ipac-ng</ulink>. It supports
+advanced features such as storing accounting data in SQL databases.
+</para>
+<para>
+The approach works quite efficiently for small installations (i.e. small number
+of accounting rules). Therefore, the accounting granularity can only be very
+low. One counter for each single port number at any given ip address is certainly not applicable.
+</para>
+</section>
+
+<section>
+<title>ipt_ACCOUNT</title>
+<para>
+<ulink url="http://www.intra2net.com/opensource/ipt_account/">ipt_ACCOUNT</ulink>
+is a special-purpose iptables target available from the netfilter project
+patch-o-matic-ng repository. It requires kernel patching and is not included
+in the mainline kernel.
+</para>
+<para>
+<emphasis>ipt_ACCOUNT</emphasis> keeps byte counters per IP address in a given
+subnet, up to a '/8' network. Those counters can be read via a special
+"iptaccount" commandline tool.
+</para>
+<para>
+Being limited to local network segments up to '/8' size, and only having per-ip
+granularity are two limiteations that defeat <emphasis>ipt_ACCOUNT</emphasis>
+as a generich accounting mechainism. It's highly-optimized, but also
+special-purpose.
+</para>
+</section>
+
+<section>
+<title>ntop (including PF_RING)</title>
+<para>
+<ulink url="http://www.ntop.org/ntop.html">ntop</ulink> is a network traffic
+probe to show network usage. It uses <emphasis>libpcap</emphasis> to capture
+the packets, and then aggregates flows in userspace. On a fundamental level it's therefore similar to what <emphasis>nacctd</emphasis> does.
+</para>
+<para>
+From the ntop project, there's also <emphasis>nProbe</emphasis>, a network
+traffic probe that exports flow based information in NETFLOW v5/v9 format.
+</para>
+<para>
+To increase performance of the probe, the author (Luca Deri) has implemented
+<ulink url="http://www.ntop.org/PF_RING.html">PF_RING</ulink>, a new zero-copy
+mmap()ed implementation for packet capture. There is a libpcap compatibility layer on top, so any pcap-using application can benefit from PF_RING.
+</para>
+<para>
+PF_RING is a major performance improvement, please look at the documentation
+and the paper published by Luca Deri.
+</para>
+<para>
+However, ntop / nProbe / PF_RING are all packet-based accounting solutions.
+Every packet needs to be analyzed by some userspace process - even if there is
+no copying involved. Due to PF_RING optimiziation, it is probably as efficient
+as this approach can get.
+</para>
+
+</section>
+
+</section> <!-- existing solutions -->
+
+<section>
+<title>New ip_conntrack based accounting</title>
+<para>
+The fundamental idea is to (ab)use the connection tracking subsystem of the
+Linux 2.4.x / 2.6.x kernel for accounting purposes. There are several reasons
+why this is a good fit:
+</para>
+<itemizedlist>
+<listitem><para>It already keeps per-connection state information. Extending this information to contain a set of counters is easy.</para></listitem>
+<listitem><para>Lots of routers/firewalls are already running it, and therefore paying it's performance penalty for security reasons. Bumping a couple of counters will introduce very little additional penalty.</para></listitem>
+<listitem><para>There was already an (out-of-tree) system to dump connection tracking information to userspace, called ctnetlink</para></listitem>
+</itemizedlist>
+<para>
+So given that a particular machine was already running ip_conntrack, adding
+flow based acconting to it comes almost for free. I do not advocate the use of
+ip_conntrack merely for accounting, since that would be again a waste of
+performance.
+</para>
+
+<section>
+<title>ip_conntrack_acct</title>
+<para>
+<emphasis>ip_conntrack_acct</emphasis> is how the in-kernel
+<emphasis>ip_conntrack</emphasis> counters are called. There is a set of four
+counters: numbers of packets and bytes for original and reply
+direction of a given connection.
+</para>
+<para>
+If you configure a recent (>= 2.6.9) kernel, it will prompt you for
+<emphasis>CONFIG_IP_NF_CT_ACCT</emphasis>. By enabling this configuration
+option, the per-connection counters will be added, and the accounting code will
+be compiled in.
+</para>
+<para>
+However, there is still no efficient means of reading out those counters. They
+can be accessed via "cat /proc/net/ip_conntrack", but that's not a real
+solution. The kernel iterates over all connections and ASCII-formats the data.
+Also, it is a polling-based mechanism. If the polling interval is too short,
+connections might get evicted from the state table before their final counters
+are being read. If the interval is too small, performance will suffer.
+</para>
+<para>
+To counter this problem, a combination of conntrack notifiers and ctnetlink is being used.
+</para>
+</section>
+
+<section>
+<title>conntrack notifiers</title>
+<para>
+Conntrack notifiers use the core kernel notifier infrastructure
+(<emphasis>struct notifier_block</emphasis>) to notify other parts of the
+kernel about connection tracking events. Such events include creation,
+deletion and modification of connection tracking entries.
+</para>
+<para>
+The conntrack notifiers can help us overcome the polling architecture. If we'd only listen to "conntrack delete" events, we would always get the byte and packet counters at the end of a connection.
+</para>
+<para>
+However, the events are in-kernel events and therefore not directly suitable
+for an accounting application to be run in userspace.
+</para>
+</section>
+
+<section>
+<title>ctnetlink</title>
+<para>
+<emphasis>ctnetlink</emphasis> (short form for conntrack netlink) is a
+mechanism for passing connection tracking state information between kernel and
+userspace, originally developed by Jay Schulist and Harald Welte. As the name
+implies, it uses Linux <emphasis>AF_NETLINK</emphasis> sockets as its
+underlying communication facility.
+</para>
+<para>
+The focus of <emphasis>ctnetlink</emphasis> is to selectively read or dump
+entries from the connection tracking table to userspace. It also allows
+userspace processes to delete and create conntrack entries as well as
+"conntrack expectations".
+</para>
+<para>
+The initial nature of <emphasis>ctnetlink</emphasis> is therefore again
+polling-based. An userspace process sends a request for certain information,
+the kernel responds with the requested information. </para>
+<para>
+By combining <emphasis>conntrack notifiers</emphasis> with
+<emphasis>ctnetlink</emphasis>, it is possible to register a notifier handler
+that in turn sends <emphasis>ctnetlink</emphasis> event messages down the <emphasis>AF_NETLINK</emphasis> socket.
+</para>
+<para>
+A userspace process can now listen for such DELETE event messages at the
+socket, and put the counters into it's accounting storage.
+</para>
+<para>
+There are still some shortcomings inherent to that DELETE event scheme: We
+only know the amount of traffic after the connection is over. If a connection
+lasts for a long time (let's say days, weeks), then it is impossible to use
+this form of accounting for any kind of quota-based billing, where the user
+would be informed (or disconnected, traffic shaped, whatever) when he exceeds
+his quota. Also, the conntrack entry does not contain information about when the connection started - only the timestamp of the end-of-connection is known.
+</para>
+<para>
+To overcome limitation number one, the accounting process can use a combined
+event and polling scheme. The granularity of accounting can therefore be
+configured by the polling interval, and a compromise between performance and
+accuracy can be made.
+</para>
+<para>
+To overcome the second limitation, the accounting process can also listen for
+NEW event messages. By correlating the NEW and DELETE messages of a
+connection, accounting datasets containign start and end of connection can be built.
+</para>
+</section>
+
+<section>
+<title>ulogd2</title>
+<para>
+As described earlier in this paper, <emphasis>ulogd</emphasis> is a userspace
+packet filter logging daemon that is already used for packet-based accounting,
+even if it isn't the best fit.
+</para>
+<para>
+<emphasis>ulogd2</emphasis>, also developed by the author of this paper, takes
+logging beyond per-packet based information, but also includes support for
+per-connection or per-flow based data.
+</para>
+<para>
+Instead of supporting only <emphasis>ipt_ULOG</emphasis> input, a number of
+interpreter and output plugins, <emphasis>ulogd2</emphasis> supports a concept
+called plugin stacks. Multiple stacks can exist within one deamon. Any such
+stack consists out of plugins. A plugin can be a source, sink or filter.
+</para>
+<para>
+Sources acquire per-packet or per-connection data from <emphasis>ipt_ULOG</emphasis> or <emphasis>ip_contnrack_acct</emphasis>.
+</para>
+<para>
+Filters allow the user to filter or aggregate information. Filtering is
+requird, since there is no way to filter the ctnetlink event messages within
+the kernel. Either the functionality is enabled or not. Multiple connections
+can be aggregated to a larger, encompassing flow. Packets could be aggregated
+to flows (like <emphasis>nacctd</emphasis>), and flows can be aggregated to
+even larger flows.
+</para>
+<para>
+Sink plugins store the resulting data to some form of non-volatile storage,
+such as SQL databases, binary or ascii files. Another sink is a NETFLOW or
+IPFIX sink, exporting information in industy-standard format for flow based accounting.
+</para>
+</section>
+
+<section>
+<title>Status of implementation</title>
+<para>
+<emphasis>ip_conntrack_acct</emphasis> is already in the kernel since 2.6.9.
+</para>
+<para>
+<emphasis>ctnetlink</emphasis> and the <emphasis>conntrack event
+notifiers</emphasis> are considered stable and will be submitted for mainline
+inclusion soon. Both are available from the patch-o-matic-ng repository of the
+netfilter project.
+</para>
+<para>
+At the time of writing of this paper, <emphasis>ulogd2</emphasis> development
+was not yet finished. However, the ctnetlink event messages can already be
+dumped by the use of the "conntrack" userspace program, available from the
+netfilter project.
+</para>
+<para>
+The "conntrack" prorgram can listen to the netlink event socket and dump the
+information in human-readable form (one ASCII line per ctnetlink message) to
+stdout. Custom accounting solutions can read this information from stdin,
+parse and process it according to their needs.
+</para>
+</section>
+
+</section> <!-- new ip_conntrack based -->
+
+<section>
+<title>Summary</title>
+<para>
+Despite the large number of available accounting tools, the author is confident that inventing yet another one is worthwhile.
+</para>
+<para>
+Many existing implementations suffer from performance issues by design. Most
+of them are very special-purpose. nProbe/ntop together with PF_RING are
+probably the most universal and efficient solution for any accounting problem.
+</para>
+<para>
+Still, the new <emphasis>ip_conntrack_acct, ctnetlink</emphasis> based
+mechanism described in this paper has a clear performance advantage if you want
+to do acconting on your Linux-based stateful packetfilter - which is a common
+case. The firewall is suposed to be at the edge of your network, exactly where
+you usually do accounting of ingress and/or egress traffic.
+</para>
+</section>
+
+</article>
diff --git a/2005/flow-accounting-lt2005/ltpdk/src/SOURCES b/2005/flow-accounting-lt2005/ltpdk/src/SOURCES
new file mode 100644
index 0000000..ac9caec
--- /dev/null
+++ b/2005/flow-accounting-lt2005/ltpdk/src/SOURCES
@@ -0,0 +1,9 @@
+Source Distribution for LinuxTag Paper Development Kit
+------------------------------------------------------
+
+The complete ltsources for the ltpdk including validator and the
+converter can be downloaded at
+
+ http://www.linuxtag.org/cfp/ltpdk-src.tar.gz
+
+for size reasons (about 5MB).
diff --git a/2005/flow-accounting-lt2005/ltpdk/xml/docbook-html.xsl b/2005/flow-accounting-lt2005/ltpdk/xml/docbook-html.xsl
new file mode 100644
index 0000000..eeaae21
--- /dev/null
+++ b/2005/flow-accounting-lt2005/ltpdk/xml/docbook-html.xsl
@@ -0,0 +1,1221 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+
+<xsl:output method="html" doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN" doctype-system="http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd" encoding="ISO-8859-1" indent="yes"/>
+
+<xsl:param name="lang">de</xsl:param>
+<xsl:param name="i18n.xml" select="document('i18n.xml')"/>
+
+<!-- DocBook Variables -->
+
+<xsl:variable name="text.toc" select="($i18n.xml//i18n[@name='text.toc'])[1]/@value"/>
+<xsl:variable name="text.lot" select="($i18n.xml//i18n[@name='text.lot'])[1]/@value"/>
+<xsl:variable name="text.warning" select="($i18n.xml//i18n[@name='text.warning'])[1]/@value"/>
+<xsl:variable name="text.caution" select="($i18n.xml//i18n[@name='text.caution'])[1]/@value"/>
+<xsl:variable name="text.important" select="($i18n.xml//i18n[@name='text.important'])[1]/@value"/>
+<xsl:variable name="text.tip" select="($i18n.xml//i18n[@name='text.tip'])[1]/@value"/>
+<xsl:variable name="text.note" select="($i18n.xml//i18n[@name='text.note'])[1]/@value"/>
+
+<!-- ****************************************************************** -->
+<!-- * DocBook Templates * -->
+<!-- ****************************************************************** -->
+
+<xsl:template match="/">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- ****************************************************************** -->
+<!-- * Template book * -->
+<!-- ****************************************************************** -->
+<xsl:template match="article|book">
+ <xsl:apply-templates select="titlepage"/>
+ <xsl:apply-templates select="toc" mode="create.toc"/>
+ <!--<xsl:apply-templates select="lot"/>-->
+ <!--<xsl:apply-templates select="dedication"/>-->
+ <!--<xsl:apply-templates select="preface"/>-->
+ <xsl:apply-templates/>
+ <!--<xsl:apply-templates select="appendix"/>-->
+ <!--<xsl:apply-templates select="bibliography"/>-->
+ <!--<xsl:apply-templates select="glossary"/>-->
+ <!--<xsl:apply-templates select="index"/>-->
+ <!--<xsl:apply-templates select="colophon"/>-->
+</xsl:template>
+
+<!-- ****************************************************************** -->
+<!-- * Templates for logical divisions * -->
+<!-- ****************************************************************** -->
+<xsl:template match="chapter|section|sect1|sect2|sect3|sect4|sect5">
+ <div class="{name()}">
+ <xsl:if test="name()='chapter'">
+ <h2 class="{name()}">
+ <xsl:apply-templates select="title" mode="create.chapter.title"/>
+ </h2>
+ </xsl:if>
+ <xsl:if test="not(name()='chapter')">
+ <h3 class="{name()}">
+ <xsl:apply-templates select="title" mode="create.title"/>
+ </h3>
+ </xsl:if>
+ <xsl:if test="ancestor::*/toc or ./toc">
+ <xsl:if test="section|reference|sect1">
+ <table class="toc">
+ <tr class="toc">
+ <td class="toc">
+ <b class="toc">
+ <font class="toc"><xsl:value-of select="$text.toc"/></font>
+ </b>
+ <xsl:apply-templates select="section|reference|sect1" mode="create.toc"/>
+ </td>
+ </tr>
+ </table>
+ </xsl:if>
+ </xsl:if>
+ <!--<xsl:apply-templates select="abstract"/>-->
+ <xsl:choose>
+ <xsl:when test="name()='chapter'">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:when test="name()='section'">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:when test="name()='sect1'">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:when test="name()='sect2'">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:when test="name()='sect3'">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:when test="name()='sect4'">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:when test="name()='sect5'">
+ <xsl:apply-templates/>
+ </xsl:when>
+ </xsl:choose>
+ </div>
+</xsl:template>
+
+<xsl:template match="title" mode="create.title">
+ <xsl:if test="../@id">
+ <a>
+ <xsl:attribute name="name">
+ <xsl:value-of select="../@id"/>
+ </xsl:attribute>
+ <xsl:apply-templates/>
+ </a>
+ </xsl:if>
+ <xsl:if test="not(../@id)">
+ <xsl:apply-templates/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="title" mode="create.chapter.title">
+ <xsl:variable name="title"><xsl:value-of select="."/></xsl:variable>
+ <xsl:for-each select="../../chapter">
+ <xsl:if test="title=$title">
+ <xsl:number format="1. "/>
+ </xsl:if>
+ </xsl:for-each>
+ <xsl:if test="../@id">
+ <a>
+ <xsl:attribute name="name">
+ <xsl:value-of select="../@id"/>
+ </xsl:attribute>
+ <xsl:apply-templates/>
+ </a>
+ </xsl:if>
+ <xsl:if test="not(../@id)">
+ <xsl:apply-templates/>
+ </xsl:if>
+</xsl:template>
+
+<!-- ****************************************************************** -->
+<!-- * Templates for creating the TOC * -->
+<!-- ****************************************************************** -->
+<xsl:template name="toc" match="toc" mode="create.toc">
+ <xsl:if test="../chapter[@id]|../section[@id]|../reference[@id]|../sect1[@id]">
+ <div class="toc">
+ <b class="toc">
+ <font class="toc"><xsl:value-of select="$text.toc"/></font>
+ </b>
+ <dl>
+ <xsl:apply-templates select="../chapter[@id]|../section[@id]|../reference[@id]|../sect1[@id]" mode="create.toc"/>
+ </dl>
+ </div>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="toc" mode="create.chapter.toc">
+ <xsl:apply-templates select="../section|../reference|../sect1" mode="create.toc"/>
+</xsl:template>
+
+<xsl:template match="title" mode="create.toc">
+ <a>
+ <xsl:attribute name="class">content</xsl:attribute>
+ <xsl:attribute name="href">
+ <xsl:value-of select="concat('#',../@id)"/>
+ </xsl:attribute>
+ <xsl:value-of select="."/>
+ </a>
+</xsl:template>
+
+<xsl:template match="chapter" mode="create.toc">
+ <dt>
+ <xsl:number format="1. "/>
+ <xsl:apply-templates select="title" mode="create.toc"/>
+ <xsl:if test="section[@id]|sect1[@id]">
+ <dd>
+ <dl>
+ <xsl:apply-templates select="sect1|section" mode="create.toc"/>
+ </dl>
+ </dd>
+ </xsl:if>
+ </dt>
+</xsl:template>
+
+<xsl:template match="section|sect1|sect2|sect3|sect4" mode="create.toc">
+ <xsl:variable name="next">
+ <xsl:choose>
+ <xsl:when test="name()='section'">section</xsl:when>
+ <xsl:when test="name()='sect1'">sect2</xsl:when>
+ <xsl:when test="name()='sect2'">sect3</xsl:when>
+ <xsl:when test="name()='sect3'">sect4</xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+ <dt>
+ <xsl:apply-templates select="title" mode="create.toc"/>
+ <xsl:if test="concat($next,'[@id]')">
+ <dd>
+ <dl>
+ <xsl:choose>
+ <xsl:when test="name()='section'">
+ <xsl:apply-templates select="section[@id]" mode="create.toc"/>
+ </xsl:when>
+ <xsl:when test="name()='sect2'">
+ <xsl:apply-templates select="sect2[@id]" mode="create.toc"/>
+ </xsl:when>
+ <xsl:when test="name()='sect3'">
+ <xsl:apply-templates select="sect3[@id]" mode="create.toc"/>
+ </xsl:when>
+ <xsl:when test="name()='sect4'">
+ <xsl:apply-templates select="sect4[@id]" mode="create.toc"/>
+ </xsl:when>
+ </xsl:choose>
+ </dl>
+ </dd>
+ </xsl:if>
+ </dt>
+</xsl:template>
+
+<!-- ****************************************************************** -->
+<!-- * Templates for Para * -->
+<!-- ****************************************************************** -->
+<xsl:template name="para" match="para|simpara">
+ <p>
+ <xsl:call-template name="add.class.by.id"/>
+ <xsl:apply-templates/>
+ </p>
+</xsl:template>
+
+<xsl:template match="formalpara">
+ <xsl:if test="title">
+ <h3 class="section"><xsl:apply-templates select="title" mode="create.title"/></h3>
+ </xsl:if>
+ <p><xsl:apply-templates/></p>
+</xsl:template>
+
+<xsl:template match="para|simpara" mode="create.toc">
+ <xsl:call-template name="add.class.by.id"/>
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- ****************************************************************** -->
+<!-- * Template for emphasis et al. * -->
+<!-- ****************************************************************** -->
+<xsl:template match="emphasis">
+ <em class="{name()}"><xsl:apply-templates/></em>
+</xsl:template>
+
+<xsl:template match="subscript">
+ <sub class="{name()}"><xsl:apply-templates/></sub>
+</xsl:template>
+
+<xsl:template match="superscript">
+ <sup class="{name()}"><xsl:apply-templates/></sup>
+</xsl:template>
+
+<xsl:template match="acronym">
+ <acronym class="{name()}"><xsl:apply-templates/></acronym>
+</xsl:template>
+
+<xsl:template match="abbrev">
+ <abbr class="{name()}"><xsl:apply-templates/></abbr>
+</xsl:template>
+
+<xsl:template match="wordasword">
+ <em class="{name()}"><xsl:apply-templates/></em>
+</xsl:template>
+
+<xsl:template match="quote">
+ <xsl:text>"</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>"</xsl:text>
+</xsl:template>
+
+<xsl:template match="filename">
+ <em class="{name()}"><xsl:apply-templates/></em>
+</xsl:template>
+
+<xsl:template match="accel">
+ <u class="{name()}"><xsl:apply-templates/></u>
+</xsl:template>
+
+<xsl:template match="guimenu">
+ <em class="{name()}"><xsl:apply-templates/></em>
+</xsl:template>
+
+<xsl:template match="guimenuitem">
+ <em class="{name()}"><xsl:apply-templates/></em>
+</xsl:template>
+
+<xsl:template match="action">
+ <em class="{name()}"><xsl:apply-templates/></em>
+</xsl:template>
+
+<!-- ****************************************************************** -->
+<!-- * Template for creating Blockquotes * -->
+<!-- ****************************************************************** -->
+<xsl:template match="blockquote">
+ <div class="{name()}">
+ <blockquote>
+ <xsl:apply-templates/>
+ </blockquote>
+ <xsl:apply-templates select="attribution" mode="create.attribution"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="attribution" mode="create.attribution">
+ <div class="{name()}" align="right">--<xsl:apply-templates/></div>
+</xsl:template>
+
+<xsl:template match="attribution"/>
+
+<!-- ***************************************************************** -->
+<!-- * Template for creating Lists * -->
+<!-- ***************************************************************** -->
+<xsl:template match="itemizedlist">
+ <div class="{name()}">
+ <ul class="{name()}">
+ <xsl:apply-templates/>
+ </ul>
+ </div>
+</xsl:template>
+
+<xsl:template match="orderedlist">
+ <div class="{name()}">
+ <ol class="{name()}">
+ <xsl:variable name="numeration">
+ <xsl:choose>
+ <xsl:when test="@numeration='loweralpha'">a</xsl:when>
+ <xsl:when test="@numeration='lowerroman'">i</xsl:when>
+ <xsl:when test="@numeration='upperalpha'">A</xsl:when>
+ <xsl:when test="@numeration='apperroman'">i</xsl:when>
+ <xsl:otherwise></xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="not($numeration='')">
+ <xsl:attribute name="type">
+ <xsl:value-of select="$numeration"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:message>Numeration: <xsl:call-template name="orderedlist.find.numeration"/></xsl:message>
+ <xsl:if test="@continuation">
+ <xsl:attribute name="start">
+ <xsl:call-template name="orderedlist.find.numeration"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </ol>
+ </div>
+</xsl:template>
+
+<xsl:template name="orderedlist.find.numeration">
+ <xsl:param name="count">1</xsl:param>
+ <xsl:choose>
+ <xsl:when test="@continuation='continues'">
+ <xsl:for-each select="preceding::orderedlist[1]">
+ <!--<xsl:if test="not(name()='orderedlist')">-->
+ <xsl:call-template name="orderedlist.find.numeration">
+ <xsl:with-param name="count">
+ <xsl:value-of select="count(listitem)+$count"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <!--</xsl:if>-->
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise><xsl:value-of select="$count"/></xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="listitem">
+ <li class="{name()}">
+ <xsl:apply-templates/>
+ </li>
+</xsl:template>
+
+<xsl:template match="listitem" mode="varlistentry">
+ <dd class="{name()}">
+ <xsl:apply-templates/>
+ </dd>
+ </xsl:template>
+
+ <xsl:template match="variablelist">
+ <xsl:if test="title">
+ <h3 class="{name()}"><xsl:apply-templates select="title" mode="create.title"/></h3>
+ </xsl:if>
+ <div class="{name()}">
+ <dl class="{name()}">
+ <xsl:apply-templates/>
+ </dl>
+ </div>
+ </xsl:template>
+
+ <xsl:template match="varlistentry">
+ <dt class="{name()}">
+ <xsl:apply-templates select="term"/>
+ <xsl:apply-templates select="listitem" mode="varlistentry"/>
+ </dt>
+ </xsl:template>
+
+ <xsl:template match="term">
+ <xsl:if test="not(position()=1)">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </xsl:template>
+
+ <!-- ***************************************************************** -->
+ <!-- * Templates for FAQs * -->
+ <!-- ***************************************************************** -->
+ <xsl:template match="qandaset">
+ <!--
+ <table border="1" class="toc" width="100%">
+ <tr>
+ <td>
+ -->
+ <xsl:apply-templates select="qandadiv|qandaentry|question" mode="create.toc"/>
+ <!--
+ </td>
+ </tr>
+ </table>
+ -->
+ <xsl:apply-templates/>
+ </xsl:template>
+
+ <xsl:template match="qandadiv">
+ <a id="{generate-id()}"/>
+ <h3 class="{title}">
+ <xsl:number format="1. " level = "multiple" />
+ <xsl:apply-templates select="title" mode="create.title"/>
+ </h3>
+ <!--
+ <table border="1" class="toc">
+ <tr>
+ <td>
+ -->
+ <xsl:apply-templates select="qandadiv|qandaentry|question" mode="create.toc"/>
+ <!--
+ </td>
+ </tr>
+ </table>
+ -->
+ <xsl:if test="ancestor::qandadiv[1]">
+ <xsl:apply-templates/>
+ </xsl:if>
+ <xsl:if test="not(ancestor::qandadiv)">
+ <table class="{name}" border="0" margin="0" marginsep="0">
+ <xsl:apply-templates/>
+ </table>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template match="qandadiv" mode="create.toc">
+ <dt>
+ <a>
+ <xsl:attribute name="class">content</xsl:attribute>
+ <xsl:attribute name="href">
+ <xsl:value-of select="concat('#', generate-id(parent::*))"/>
+ </xsl:attribute>
+ <xsl:number format="1. " count="//qandadiv|//qandaentry" level = "multiple" />
+ <xsl:apply-templates select="title" mode="create.title"/>
+ </a>
+ <dd>
+ <dl>
+ <xsl:apply-templates select="qandadiv|qandaentry|question" mode="create.toc"/>
+ </dl>
+ </dd>
+ </dt>
+ </xsl:template>
+
+ <xsl:template match="qandaentry">
+ <a id="{generate-id()}"/>
+ <tr class="question">
+ <td><b><xsl:number format="1.1." count="//qandadiv|//qandaentry" level = "multiple" /></b></td>
+ <td align="left" valign="top"><xsl:apply-templates select="question"/></td>
+ </tr>
+ <tr class="answer">
+ <td/>
+ <td align="left" valign="top"><xsl:apply-templates select="answer"/></td>
+ </tr>
+ </xsl:template>
+
+ <xsl:template match="qandaentry" mode="create.toc">
+ <dt>
+ <a>
+ <xsl:attribute name="class">content</xsl:attribute>
+ <xsl:attribute name="href">
+ <xsl:value-of select="concat('#', generate-id())"/>
+ </xsl:attribute>
+ <xsl:number format="1.1. " count="//qandadiv|//qandaentry" level = "multiple" />
+ <xsl:apply-templates select="question[1]" mode="create.toc"/>
+ </a>
+ </dt>
+ </xsl:template>
+
+ <xsl:template match="question">
+ <xsl:apply-templates/>
+ </xsl:template>
+
+ <xsl:template match="question" mode="create.toc" >
+ <xsl:apply-templates mode="create.toc"/>
+ </xsl:template>
+
+ <xsl:template match="answer">
+ <xsl:apply-templates/>
+ </xsl:template>
+
+ <!-- ***************************************************************** -->
+ <!-- * Templates for Program Listings * -->
+ <!-- ***************************************************************** -->
+ <xsl:template match="programlisting|screen">
+ <div class="{name()}">
+ <table class="{name()}">
+ <tr class="{name()}">
+ <td class="{name()}">
+ <pre class="{name()}"><xsl:attribute name="width"><xsl:value-of select="@width"/></xsl:attribute><xsl:apply-templates/></pre>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </xsl:template>
+
+ <xsl:template match="computeroutput|prompt">
+ <pre class="name()">
+ <code class="name()">
+ <xsl:apply-templates/>
+ </code>
+ </pre>
+ </xsl:template>
+
+ <!-- ***************************************************************** -->
+ <!-- * Templates for creating Adresses * -->
+ <!-- ***************************************************************** -->
+ <xsl:template match="address">
+ <table class="address" border="0">
+ <tr class="address">
+ <td class="address">
+ <xsl:apply-templates/>
+ </td>
+ </tr>
+ </table>
+ </xsl:template>
+
+ <xsl:template name="personname" match="personname">
+ <br>
+ <xsl:call-template name="add.class.by.id"/>
+ </br>
+ <xsl:apply-templates select="honorific|text()"/>
+ <xsl:if test="firstname"><xsl:text>&#160;</xsl:text></xsl:if>
+ <xsl:apply-templates select="firstname"/>
+ <xsl:if test="othername"><xsl:text>&#160;</xsl:text></xsl:if>
+ <xsl:apply-templates select="othername"/>
+ <xsl:if test="surname"><xsl:text>&#160;</xsl:text></xsl:if>
+ <xsl:apply-templates select="surname"/>
+ <xsl:if test="lineage"><xsl:text>&#160;</xsl:text></xsl:if>
+ <xsl:apply-templates select="lineage"/>
+ </xsl:template>
+
+ <xsl:template match="honorific|firstname|othername|surname|lineage">
+ <xsl:apply-templates/>
+ </xsl:template>
+
+ <xsl:template match="street">
+ <br>
+ <xsl:call-template name="add.class.by.id"/>
+ </br>
+ <xsl:apply-templates/>
+ </xsl:template>
+
+ <xsl:template match="country">
+ <br>
+ <xsl:call-template name="add.class.by.id"/>
+ </br>
+ <xsl:apply-templates/>
+ </xsl:template>
+
+ <xsl:template match="phone">
+ <br>
+ <xsl:call-template name="add.class.by.id"/>
+ </br>
+ <xsl:apply-templates/>
+ </xsl:template>
+
+ <xsl:template match="fax">
+ <br>
+ <xsl:call-template name="add.class.by.id"/>
+ </br>
+ <xsl:apply-templates/>
+ </xsl:template>
+
+ <xsl:template match="email">
+ <br>
+ <xsl:call-template name="add.class.by.id"/>
+ </br>
+ <xsl:apply-templates/>
+ </xsl:template>
+
+ <xsl:template match="city|state|postcode">
+ <xsl:if test="(ancestor::address/descendant::city|ancestor::address/descendant::state|ancestor::address/descendant::postcode)[1] = .">
+ <br>
+ <xsl:call-template name="add.class.by.id"/>
+ </br>
+ </xsl:if>
+ <xsl:apply-templates/>
+ <xsl:choose>
+ <xsl:when test="(ancestor::address/descendant::city|ancestor::address/descendant::state|ancestor::address/descendant::postcode)[last()] = .">
+ </xsl:when>
+ <xsl:otherwise><xsl:text> </xsl:text></xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- ****************************************************************** -->
+ <!-- * Templates for Function Stuff * -->
+ <!-- ****************************************************************** -->
+ <xsl:template match="funcsynopsis">
+ <div class="{name()}">
+ <table class="{name()}">
+ <tr class="{name()}">
+ <pre class="{name()}">
+ <xsl:apply-templates select="funcsynopsisinfo"/>
+ <xsl:apply-templates select="funcprototype"/>
+ </pre>
+ </tr>
+ </table>
+ </div>
+ </xsl:template>
+
+ <xsl:template match="funcsynopsisinfo">
+ <div class="{name()}">
+ <xsl:apply-templates/>
+ </div>
+ </xsl:template>
+
+ <xsl:template match="funcprototype">
+ <code class="{name()}">
+ <xsl:apply-templates select="funcdef"/>
+ <xsl:if test="paramdef">
+ <xsl:text>(</xsl:text>
+ <xsl:apply-templates select="paramdef/parameter" mode="create.function.signature"/>
+ <xsl:text>);</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="void|varargs|paramdef"/>
+ </code>
+ </xsl:template>
+
+ <xsl:template match="parameter" mode="create.function.signature">
+ <xsl:if test="not(position()=1)">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <i class="{name()}">
+ <xsl:apply-templates/>
+ </i>
+ </xsl:template>
+
+ <xsl:template match="paramdef">
+ <br/>
+ <xsl:apply-templates select="text()|funcparams|parameter|type"/>
+ </xsl:template>
+
+ <xsl:template match="funcparams">
+ <xsl:text>(</xsl:text>
+ <i class="{name()}">
+ <xsl:apply-templates/>
+ </i>
+ <xsl:text>)</xsl:text>
+ </xsl:template>
+
+ <xsl:template match="parameter">
+ <i class="{name()}">
+ <xsl:apply-templates/>
+ </i>
+ <xsl:text>; </xsl:text>
+ </xsl:template>
+
+ <xsl:template match="funcdef">
+ <xsl:value-of select="normalize-space(text())"/>
+ <xsl:apply-templates select="normalize-space(type)"/>
+ <xsl:text>&#160;</xsl:text>
+ <xsl:apply-templates select="function"/>
+ </xsl:template>
+
+ <xsl:template match="void">
+ <xsl:text>(void);</xsl:text>
+ </xsl:template>
+
+ <xsl:template match="varargs">
+ <xsl:text>(...);</xsl:text>
+ </xsl:template>
+
+ <xsl:template match="type">
+ <xsl:apply-templates/>
+ </xsl:template>
+
+ <xsl:template match="function">
+ <b class="{name()}">
+ <xsl:apply-templates/>
+ </b>
+ </xsl:template>
+
+ <xsl:template match="varname|constant|symbol|returnvalue">
+ <xsl:apply-templates/>
+ </xsl:template>
+
+ <!-- ****************************************************************** -->
+ <!-- * Templates for Copyright and Trademarks * -->
+ <!-- ****************************************************************** -->
+ <xsl:template match="copyright" mode="create.title">
+ <xsl:text>Copyright © </xsl:text>
+ <xsl:value-of select="year"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="holder"/>
+ </xsl:template>
+
+ <xsl:template match="copyright"/>
+
+ <xsl:template match="trademark|productname">
+ <xsl:choose>
+ <xsl:when test="@class='copyright'">
+ <xsl:text>© </xsl:text>
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:when test="@class='registered' or (not(@class) and name()='productname')">
+ <xsl:apply-templates/>
+ <xsl:text>®</xsl:text>
+ </xsl:when>
+ <xsl:when test="@class='service'">
+ </xsl:when>
+ <xsl:when test="@class='trade' or (not(@class) and name()='trademark')">
+ <xsl:apply-templates/>
+ <sup>TM</sup>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- ****************************************************************** -->
+ <!-- * Templates for Graphics * -->
+ <!-- ****************************************************************** -->
+ <xsl:template match="mediaobject|inlinemediaobject">
+ <xsl:apply-templates/>
+ </xsl:template>
+
+ <xsl:template match="screenshot">
+ <xsl:apply-templates/>
+ </xsl:template>
+
+ <!-- ****************************************************************** -->
+ <!-- * Templates for Linking * -->
+ <!-- ****************************************************************** -->
+ <xsl:template name="link" match="link">
+ <a class="link">
+ <xsl:attribute name="href">
+ <xsl:variable name="linkend"><xsl:value-of select="@linkend"/></xsl:variable>
+ <xsl:choose>
+ <xsl:when test="//*[@id=$linkend and position()=1]">
+ <xsl:value-of select="concat('#',$linkend)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$linkend"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:if test=".=''">
+ <xsl:variable name="endterm"><xsl:value-of select="@endterm"/></xsl:variable>
+ <xsl:apply-templates select="//*[@id=$endterm and position()=1]" mode="create.title"/>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </a>
+ </xsl:template>
+
+ <xsl:template match="ulink">
+ <a class="ulink">
+ <xsl:attribute name="href">
+ <xsl:value-of select="@url"/>
+ </xsl:attribute>
+ <xsl:choose>
+ <xsl:when test=".=''">
+ <xsl:value-of select="@url"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </a>
+ </xsl:template>
+
+ <!-- ****************************************************************** -->
+ <!-- * Templates for Events * -->
+ <!-- ****************************************************************** -->
+ <xsl:template match="caution|note|important|tip|warning">
+ <p>
+ <div>
+ <xsl:attribute name="class">
+ <xsl:value-of select="name()"/>
+ </xsl:attribute>
+ <table>
+ <xsl:attribute name="class">
+ <xsl:value-of select="name()"/>
+ </xsl:attribute>
+ <tr>
+ <xsl:attribute name="class">
+ <xsl:value-of select="name()"/>
+ </xsl:attribute>
+ <td valign="top" align="center">
+ <b>
+ <xsl:attribute name="class">
+ <xsl:value-of select="name()"/>
+ </xsl:attribute>
+ <xsl:choose>
+ <xsl:when test="name()='caution'">
+ <xsl:value-of select="$text.caution"/>
+ </xsl:when>
+ <xsl:when test="name()='note'">
+ <xsl:value-of select="$text.note"/>
+ </xsl:when>
+ <xsl:when test="name()='important'">
+ <xsl:value-of select="$text.important"/>
+ </xsl:when>
+ <xsl:when test="name()='tip'">
+ <xsl:value-of select="$text.tip"/>
+ </xsl:when>
+ <xsl:when test="name()='warning'">
+ <xsl:value-of select="$text.warning"/>
+ </xsl:when>
+ </xsl:choose>
+ </b>
+ </td>
+ <td valign="top" align="left">
+ <xsl:attribute name="class">
+ <xsl:value-of select="name()"/>
+ </xsl:attribute>
+ <xsl:apply-templates/>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </p>
+ </xsl:template>
+
+ <!-- ****************************************************************** -->
+ <!-- * Templates for Graphics * -->
+ <!-- ****************************************************************** -->
+
+ <xsl:template match="mediaobject">
+ <xsl:apply-templates select="objectinfo[1]"/>
+ <xsl:apply-templates select="videoobject|audioobject|imageobject|textobject"/>
+ <xsl:apply-templates select="caption[1]"/>
+ </xsl:template>
+
+ <xsl:template match="imageobject">
+ <xsl:apply-templates select="objectinfo[1]"/>
+ <xsl:apply-templates select="imagedata[1]"/>
+ </xsl:template>
+
+ <xsl:template match="imagedata">
+ <img border="0">
+ <xsl:attribute name="src">
+ <xsl:value-of select="@fileref"/>
+ </xsl:attribute>
+ <xsl:if test="@width">
+ <xsl:attribute name="width">
+ <xsl:value-of select="@width"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@height">
+ <xsl:attribute name="height">
+ <xsl:value-of select="@height"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@scale">
+ <xsl:attribute name="scale">
+ <xsl:value-of select="@scale"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@align">
+ <xsl:attribute name="align">
+ <xsl:value-of select="@align"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@valign">
+ <xsl:attribute name="valign">
+ <xsl:value-of select="@valign"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="../../textobject/textdata">
+ <xsl:attribute name="alt">
+ <xsl:value-of select="../../textobject/textdata"/>
+ </xsl:attribute>
+ </xsl:if>
+ </img>
+ </xsl:template>
+
+ <xsl:template match="textobject">
+ <xsl:apply-templates select="objectinfo[1]"/>
+ <xsl:apply-templates select="phrase|textdata|itemizedlist|orderedlist"/>
+ </xsl:template>
+
+ <xsl:template match="textdata">
+ <xsl:apply-templates select="text()"/>
+ </xsl:template>
+
+ <!-- ****************************************************************** -->
+ <!-- * Templates for Tables * -->
+ <!-- ****************************************************************** -->
+
+ <xsl:template match="table">
+ <xsl:if test="title">
+ <h3 class="{name()}"><xsl:apply-templates select="title" mode="create.title"/></h3>
+ </xsl:if>
+ <xsl:apply-templates select="textobject|mediaobject|tgroup"/>
+ </xsl:template>
+
+ <xsl:template match="tgroup">
+ <table>
+ <xsl:attribute name="class">
+ <xsl:choose>
+ <xsl:when test="ancestor::table/@label">
+ <xsl:value-of select="ancestor::table/@label"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>table</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:attribute name="border">
+ <xsl:choose>
+ <xsl:when test="ancestor::table[@frame = 'none']">
+ <xsl:text>0</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>1</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:apply-templates select="thead"/>
+ <xsl:apply-templates select="tbody"/>
+ <xsl:apply-templates select="tfoot"/>
+ </table>
+ </xsl:template>
+
+ <xsl:template match="tbody|thead|tfoot">
+ <xsl:param name="table.colspec"/>
+ <xsl:param name="table.spanspec"/>
+ <xsl:apply-templates select="row"/>
+ </xsl:template>
+
+ <xsl:template match="row">
+ <xsl:param name="table.colspec"/>
+ <xsl:param name="table.spanspec"/>
+ <tr>
+ <xsl:attribute name="class">
+ <xsl:choose>
+ <xsl:when test="ancestor::table/@label">
+ <xsl:value-of select="ancestor::table/@label"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>row</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:apply-templates select="entry"/>
+ </tr>
+ </xsl:template>
+
+ <xsl:template match="entry">
+ <td>
+ <xsl:attribute name="class">
+ <xsl:choose>
+ <xsl:when test="ancestor::table/@label">
+ <xsl:value-of select="ancestor::table/@label"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>entry</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:if test="@namest">
+ <xsl:variable name="colname.namest" select="@namest"/>
+ <xsl:variable name="colname.nameend" select="@nameend"/>
+ <xsl:variable name="namest">
+ <xsl:choose>
+ <xsl:when test="ancestor::tgroup/colspec[@colname = $colname.namest]/@colnum">
+ <xsl:value-of select="ancestor::tgroup/colspec[@colname = $colname.namest]/@colnum"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:for-each select="ancestor::tgroup/colspec">
+ <xsl:if test="@colname = $colname.namest">
+ <xsl:value-of select="position()"/>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="nameend">
+ <xsl:choose>
+ <xsl:when test="ancestor::tgroup/colspec[@colname = $colname.nameend]/@colnum">
+ <xsl:value-of select="ancestor::tgroup/colspec[@colname = $colname.nameend]/@colnum"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:for-each select="ancestor::tgroup/colspec">
+ <xsl:if test="@colname = $colname.nameend">
+ <xsl:value-of select="position()"/>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:attribute name="colspan">
+ <xsl:value-of select="$nameend - $namest +1"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@morerows">
+ <xsl:attribute name="rowspan">
+ <xsl:value-of select="1 + @morerows"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@align">
+ <xsl:attribute name="align">
+ <xsl:value-of select="@align"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@valign">
+ <xsl:attribute name="valign">
+ <xsl:value-of select="@valign"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </td>
+ </xsl:template>
+
+ <!-- ***************************************************************** -->
+ <!-- * Templates for Tags that have to be ignored * -->
+ <!-- ***************************************************************** -->
+ <xsl:template match="beginpage"/>
+ <xsl:template match="remark"/>
+ <xsl:template match="comment"/>
+ <xsl:template match="title"/>
+ <xsl:template match="subtitle"/>
+ <xsl:template match="titleabbrev"/>
+ <xsl:template match="appendixinfo"/>
+ <xsl:template match="articleinfo"/>
+ <xsl:template match="bibliographyinfo"/>
+ <xsl:template match="blockinfo"/>
+ <xsl:template match="bookinfo"/>
+ <xsl:template match="chapterinfo"/>
+ <xsl:template match="classsynopsisinfo"/>
+ <xsl:template match="glossaryinfo"/>
+ <xsl:template match="indexinfo"/>
+ <xsl:template match="msginfo"/>
+ <xsl:template match="objectinfo"/>
+ <xsl:template match="partinfo"/>
+ <xsl:template match="prefaceinfo"/>
+ <xsl:template match="refentryinfo"/>
+ <xsl:template match="referenceinfo"/>
+ <xsl:template match="refmiscinfo"/>
+ <xsl:template match="refsect1info"/>
+ <xsl:template match="refsect2info"/>
+ <xsl:template match="refsect3info"/>
+ <xsl:template match="refsectioninfo"/>
+ <xsl:template match="refsynopsisdivinfo"/>
+ <xsl:template match="relesaseinfo"/>
+ <xsl:template match="screeninfo"/>
+ <xsl:template match="sect1info"/>
+ <xsl:template match="sect2info"/>
+ <xsl:template match="sect3info"/>
+ <xsl:template match="sect4info"/>
+ <xsl:template match="sect5info"/>
+ <xsl:template match="sectioninfo"/>
+ <xsl:template match="setindexinfo"/>
+ <xsl:template match="setinfo"/>
+ <xsl:template match="sidebarinfo"/>
+
+ <!-- ****************************************************************** -->
+ <!-- * Library Templates * -->
+ <!-- ****************************************************************** -->
+
+ <xsl:template name="add.class.by.id">
+ <xsl:if test="@id">
+ <xsl:attribute name="class">
+ <xsl:value-of select="@id"/>
+ </xsl:attribute>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template name="transpose.spaces">
+ <xsl:param name="string"></xsl:param>
+ <xsl:choose>
+ <xsl:when test="contains($string,' ')">
+ <xsl:value-of select="substring-before($string,' ')"/>
+ <xsl:text>&#160;</xsl:text>
+ <xsl:call-template name="transpose.spaces">
+ <xsl:with-param name="string">
+ <xsl:value-of select="substring-after($string,' ')"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$string"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template name="strip.leading.spaces">
+ <xsl:param name="string"></xsl:param>
+<xsl:message>Calling strip.leading.spaces</xsl:message>
+<xsl:message>Value:<xsl:value-of select="$string"/></xsl:message>
+<xsl:message>Starts-with:<xsl:value-of select="substring($string,1,1)"/></xsl:message>
+ <xsl:choose>
+ <xsl:when test="substring($string,1,1)='Â'">
+ <xsl:call-template name="strip.leading.spaces">
+ <xsl:with-param name="string">
+ <xsl:value-of select="substring($string,2,string-length($string)-1)"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$string"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match="perform-test">
+ <xsl:call-template name="transpose.spaces">
+ <xsl:with-param name="string">Oliver Zendel ist muede</xsl:with-param>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template name="strip.ending.spaces">
+ <xsl:param name="string"></xsl:param>
+<xsl:message>Calling strip.ending.spaces</xsl:message>
+<xsl:message>Value:<xsl:value-of select="$string"/></xsl:message>
+<xsl:message>End-with: '<xsl:value-of select="substring($string,string-length($string),1)"/>'</xsl:message>
+ <xsl:choose>
+ <xsl:when test="substring($string,string-length($string),1)=' '">
+<xsl:message>Found Tab</xsl:message>
+ <xsl:call-template name="strip.ending.spaces">
+ <xsl:with-param name="string">
+ <xsl:value-of select="substring($string,1,string-length($string)-1)"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="substring($string,string-length($string),1)=' '">
+<xsl:message>Found Space</xsl:message>
+ <xsl:call-template name="strip.ending.spaces">
+ <xsl:with-param name="string">
+ <xsl:value-of select="substring($string,1,string-length($string)-1)"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+<xsl:message>Found Noting</xsl:message>
+ <xsl:value-of select="$string"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match="perform-test">
+ <xsl:call-template name="transpose.spaces">
+ <xsl:with-param name="string">Oliver Zendel ist muede</xsl:with-param>
+ </xsl:call-template>
+ </xsl:template>
+
+<!--
+ <xsl:template match="legalnotice">
+ <xsl:if test="//artinfo[1]|//bookinfo[1]">
+ <xsl:for-each select="//artinfo[1]|//bookinfo[1]">
+ <p><xsl:apply-templates select="descendant-or-self::copyright"/></p>
+ </xsl:for-each>
+ </xsl:if>
+ <xsl:if test="not(//artinfo[1]|//bookinfo[1])">
+ <xsl:if test="//copyright[1]">
+ <p><xsl:apply-templates select="descendant-or-self::copyright"/></p>
+ </xsl:if>
+ </xsl:if>
+ <p><xsl:apply-templates/></p>
+ </xsl:template>
+
+ <xsl:template match="releaseinfo|abstract">
+ <p><xsl:apply-templates/></p>
+ </xsl:template>
+
+
+
+ <xsl:template match="authorgroup">
+ <xsl:apply-templates select="author"/>
+ </xsl:template>
+
+ <xsl:template match="author">
+ <div class="author">
+ <h3 class="author">
+ <xsl:value-of select="honorific"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="firstname"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="othername"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="surname"/>
+ </h3>
+ </div>
+ </xsl:template>
+
+ <xsl:template name="titlepage">
+ <div class="titlepage">
+ <a name="top"/>
+ <h1 class="title">
+ <xsl:value-of select="//artinfo[1]/title|//bookinfo[1]/title|//capterinfo[1]/title"/>
+ </h1>
+ <xsl:for-each select="bookinfo|artinfo">
+ <xsl:apply-templates select="author|authorgroup"/>
+ <xsl:apply-templates select="releaseinfo"/>
+ <xsl:apply-templates select="legalnotice"/>
+ <xsl:apply-templates select="abstract"/>
+ </xsl:for-each>
+ <hr width="100%"/>
+ </div>
+ </xsl:template>
+
+ <xsl:template match="activeboxset"/>
+ <xsl:template match="artinfo"/>
+ <xsl:template match="chapterinfo"/>
+ <xsl:template match="bookinfo"/>
+
+-->
+ <xsl:template match="*">
+ <xsl:message>
+ <xsl:text>Warning: Tag </xsl:text>
+ <xsl:value-of select="name()"/>
+ <xsl:text> not supportet</xsl:text>
+ </xsl:message>
+ </xsl:template>
+</xsl:stylesheet>
diff --git a/2005/flow-accounting-lt2005/ltpdk/xml/docbook.dtd b/2005/flow-accounting-lt2005/ltpdk/xml/docbook.dtd
new file mode 100644
index 0000000..114602c
--- /dev/null
+++ b/2005/flow-accounting-lt2005/ltpdk/xml/docbook.dtd
@@ -0,0 +1,1618 @@
+<!-- *********************************************************************
+ *** THIS IS THE FLATTENED DTD. DO NOT EDIT THIS DTD BY HAND, EDIT ***
+ *** THE CUSTOMIZATION LAYER AND REGNERATE THE FLATTENED DTD! ********
+ ********************************************************************* -->
+
+<!-- ...................................................................... -->
+<!-- Simplified DocBook DTD V1.0CR2 ...................................... -->
+<!-- File sdocbook-custom.dtd ............................................. -->
+
+<!-- Copyright 1992-2002 HaL Computer Systems, Inc.,
+ O'Reilly & Associates, Inc., ArborText, Inc., Fujitsu Software
+ Corporation, Norman Walsh, Sun Microsystems, Inc., and the
+ Organization for the Advancement of Structured Information
+ Standards (OASIS).
+
+ $Id: sdocbook-custom.dtd,v 1.7 2002/06/10 14:05:33 nwalsh Exp $
+
+ Permission to use, copy, modify and distribute the DocBook XML DTD
+ and its accompanying documentation for any purpose and without fee
+ is hereby granted in perpetuity, provided that the above copyright
+ notice and this paragraph appear in all copies. The copyright
+ holders make no representation about the suitability of the DTD for
+ any purpose. It is provided "as is" without expressed or implied
+ warranty.
+
+ If you modify the Simplified DocBook DTD in any way, except for
+ declaring and referencing additional sets of general entities and
+ declaring additional notations, label your DTD as a variant of
+ DocBook. See the maintenance documentation for more information.
+
+ Please direct all questions, bug reports, or suggestions for
+ changes to the docbook@lists.oasis-open.org mailing list. For more
+ information, see http://www.oasis-open.org/docbook/.
+-->
+
+<!-- ...................................................................... -->
+
+<!-- This is the driver file for V1.0CR2 of the Simplified DocBook XML DTD.
+ Please use the following formal public identifier to identify it:
+
+ "-//OASIS//DTD Simplified DocBook XML V1.0CR2//EN"
+
+ For example:
+
+ <!DOCTYPE article
+ PUBLIC "-//OASIS//DTD Simplified DocBook XML V1.0CR2//EN"
+ "http://www.oasis-open.org/docbook/xml/simple/1.0CR2/sdocbook.dtd"
+ [...]>
+-->
+
+<!-- ...................................................................... -->
+
+
+<!ENTITY % local.list.class "">
+<!ENTITY % list.class
+ "itemizedlist|orderedlist
+ |variablelist %local.list.class;">
+<!ENTITY % local.admon.class "">
+<!ENTITY % admon.class
+ "note %local.admon.class;">
+<!ENTITY % local.linespecific.class "">
+<!ENTITY % linespecific.class
+ "literallayout|programlisting %local.linespecific.class;">
+<!ENTITY % local.para.class "">
+<!ENTITY % para.class
+ "para %local.para.class;">
+<!ENTITY % local.informal.class "">
+<!ENTITY % informal.class
+ "blockquote
+ |mediaobject
+ |informaltable %local.informal.class;">
+<!ENTITY % local.formal.class "">
+<!ENTITY % formal.class
+ "example|figure|table %local.formal.class;">
+<!ENTITY % local.compound.class "">
+<!ENTITY % compound.class
+ "sidebar %local.compound.class;">
+<!ENTITY % local.descobj.class "">
+<!ENTITY % descobj.class
+ "abstract|authorblurb|epigraph
+ %local.descobj.class;">
+<!ENTITY % local.xref.char.class "">
+<!ENTITY % xref.char.class "footnoteref|xref %local.xref.char.class;">
+<!ENTITY % local.gen.char.class "">
+<!ENTITY % gen.char.class
+ "abbrev|acronym|citetitle|emphasis|footnote|phrase
+ |quote|trademark %local.gen.char.class;">
+<!ENTITY % local.link.char.class "">
+<!ENTITY % link.char.class
+ "link|ulink %local.link.char.class;">
+<!ENTITY % local.tech.char.class "">
+<!ENTITY % tech.char.class
+ "command|computeroutput
+ |email|filename
+ |literal
+ |option
+ |replaceable
+ |systemitem|userinput
+ %local.tech.char.class;">
+<!ENTITY % local.docinfo.char.class "">
+<!ENTITY % docinfo.char.class
+ "author|corpauthor|othercredit
+ |revhistory
+ %local.docinfo.char.class;">
+<!ENTITY % local.inlineobj.char.class "">
+<!ENTITY % inlineobj.char.class
+ "inlinemediaobject %local.inlineobj.char.class;">
+<!ENTITY % local.common.attrib "">
+<!ENTITY % common.attrib
+ "id ID #IMPLIED
+ lang CDATA #IMPLIED
+ revisionflag (changed
+ |added
+ |deleted
+ |off) #IMPLIED
+ %local.common.attrib;"
+>
+<!ENTITY % local.person.ident.mix "">
+<!ENTITY % person.ident.mix
+ "honorific|firstname|surname|lineage|othername|affiliation
+ |authorblurb
+ %local.person.ident.mix;">
+<!ENTITY % local.bibliocomponent.mix "">
+<!ENTITY % bibliocomponent.mix
+ "abbrev|abstract|author
+ |authorgroup|bibliomisc
+ |copyright|corpauthor|date|edition
+ |editor|issuenum
+ |othercredit
+ |pubdate|publishername
+ |releaseinfo|revhistory
+ |subtitle|title|titleabbrev|volumenum|citetitle
+ |%person.ident.mix;
+ %local.bibliocomponent.mix;">
+<!ENTITY % local.component.mix "">
+<!ENTITY % component.mix
+ "%list.class; |%admon.class;
+ |%linespecific.class;
+ |%para.class; |%informal.class;
+ |%formal.class; |%compound.class;
+ |%descobj.class;
+ %local.component.mix;">
+<!ENTITY % local.sidebar.mix "">
+<!ENTITY % sidebar.mix
+ "%list.class; |%admon.class;
+ |%linespecific.class;
+ |%para.class; |%informal.class;
+ |%formal.class;
+ %local.sidebar.mix;">
+<!ENTITY % local.revdescription.mix "">
+<!ENTITY % revdescription.mix
+ "%list.class; |%admon.class;
+ |%linespecific.class;
+ |%para.class; |%informal.class;
+ |%formal.class;
+ %local.revdescription.mix;">
+<!ENTITY % local.footnote.mix "">
+<!ENTITY % footnote.mix
+ "%list.class;
+ |%linespecific.class;
+ |%para.class; |%informal.class;
+ %local.footnote.mix;">
+<!ENTITY % local.example.mix "">
+<!ENTITY % example.mix
+ "%list.class;
+ |%linespecific.class;
+ |%para.class; |%informal.class;
+ %local.example.mix;">
+<!ENTITY % local.admon.mix "">
+<!ENTITY % admon.mix
+ "%list.class;
+ |%linespecific.class;
+ |%para.class; |%informal.class;
+ |%formal.class;
+ %local.admon.mix;">
+<!ENTITY % local.figure.mix "">
+<!ENTITY % figure.mix
+ "%linespecific.class;
+ |%informal.class;
+ %local.figure.mix;">
+<!ENTITY % local.tabentry.mix "">
+<!ENTITY % tabentry.mix
+ "%list.class; |%admon.class;
+ |%linespecific.class;
+ |%para.class; |mediaobject
+ %local.tabentry.mix;">
+<!ENTITY % local.legalnotice.mix "">
+<!ENTITY % legalnotice.mix
+ "%list.class; |%admon.class;
+ |%linespecific.class;
+ |%para.class; |blockquote
+ %local.legalnotice.mix;">
+<!ENTITY % local.textobject.mix "">
+<!ENTITY % textobject.mix
+ "%list.class; |%admon.class;
+ |%linespecific.class;
+ |%para.class; |blockquote
+ %local.textobject.mix;">
+<!ENTITY % local.para.char.mix "">
+<!ENTITY % para.char.mix
+ "#PCDATA
+ |%xref.char.class; |%gen.char.class;
+ |%link.char.class; |%tech.char.class;
+ |%inlineobj.char.class;
+ %local.para.char.mix;">
+<!ENTITY % local.title.char.mix "">
+<!ENTITY % title.char.mix
+ "#PCDATA
+ |%xref.char.class; |%gen.char.class;
+ |%link.char.class; |%tech.char.class;
+ |%docinfo.char.class;
+ |%inlineobj.char.class;
+ %local.title.char.mix;">
+<!ENTITY % local.cptr.char.mix "">
+<!ENTITY % cptr.char.mix
+ "#PCDATA
+ |%link.char.class; |%tech.char.class;
+ |inlinemediaobject
+ %local.cptr.char.mix;">
+<!ENTITY % local.smallcptr.char.mix "">
+<!ENTITY % smallcptr.char.mix
+ "#PCDATA
+ |replaceable
+ |inlinemediaobject
+ %local.smallcptr.char.mix;">
+<!ENTITY % local.word.char.mix "">
+<!ENTITY % word.char.mix
+ "#PCDATA
+ |acronym|emphasis|trademark
+ |%link.char.class;
+ |inlinemediaobject
+ %local.word.char.mix;">
+<!ENTITY % local.docinfo.char.mix "">
+<!ENTITY % docinfo.char.mix
+ "#PCDATA
+ |%link.char.class;
+ |emphasis|trademark
+ |replaceable
+ |inlinemediaobject
+ %local.docinfo.char.mix;">
+<!ENTITY % tbl.table.mdl
+ "(title, (mediaobject+|tgroup+))">
+<!ENTITY % local.divcomponent.mix "">
+<!ENTITY % divcomponent.mix
+ "%list.class; |%admon.class;
+ |%linespecific.class;
+ |%para.class; |%informal.class;
+ |%formal.class; |%compound.class;
+ |%descobj.class;
+ %local.divcomponent.mix;">
+<!ENTITY % bookcomponent.content
+ "((%divcomponent.mix;)+, section*)
+ | section+">
+<!ENTITY aacute "&#x00E1;">
+<!ENTITY Aacute "&#x00C1;">
+<!ENTITY acirc "&#x00E2;">
+<!ENTITY Acirc "&#x00C2;">
+<!ENTITY agrave "&#x00E0;">
+<!ENTITY Agrave "&#x00C0;">
+<!ENTITY aring "&#x00E5;">
+<!ENTITY Aring "&#x00C5;">
+<!ENTITY atilde "&#x00E3;">
+<!ENTITY Atilde "&#x00C3;">
+<!ENTITY auml "&#x00E4;">
+<!ENTITY Auml "&#x00C4;">
+<!ENTITY aelig "&#x00E6;">
+<!ENTITY AElig "&#x00C6;">
+<!ENTITY ccedil "&#x00E7;">
+<!ENTITY Ccedil "&#x00C7;">
+<!ENTITY eth "&#x00F0;">
+<!ENTITY ETH "&#x00D0;">
+<!ENTITY eacute "&#x00E9;">
+<!ENTITY Eacute "&#x00C9;">
+<!ENTITY ecirc "&#x00EA;">
+<!ENTITY Ecirc "&#x00CA;">
+<!ENTITY egrave "&#x00E8;">
+<!ENTITY Egrave "&#x00C8;">
+<!ENTITY euml "&#x00EB;">
+<!ENTITY Euml "&#x00CB;">
+<!ENTITY iacute "&#x00ED;">
+<!ENTITY Iacute "&#x00CD;">
+<!ENTITY icirc "&#x00EE;">
+<!ENTITY Icirc "&#x00CE;">
+<!ENTITY igrave "&#x00EC;">
+<!ENTITY Igrave "&#x00CC;">
+<!ENTITY iuml "&#x00EF;">
+<!ENTITY Iuml "&#x00CF;">
+<!ENTITY ntilde "&#x00F1;">
+<!ENTITY Ntilde "&#x00D1;">
+<!ENTITY oacute "&#x00F3;">
+<!ENTITY Oacute "&#x00D3;">
+<!ENTITY ocirc "&#x00F4;">
+<!ENTITY Ocirc "&#x00D4;">
+<!ENTITY ograve "&#x00F2;">
+<!ENTITY Ograve "&#x00D2;">
+<!ENTITY oslash "&#x00F8;">
+<!ENTITY Oslash "&#x00D8;">
+<!ENTITY otilde "&#x00F5;">
+<!ENTITY Otilde "&#x00D5;">
+<!ENTITY ouml "&#x00F6;">
+<!ENTITY Ouml "&#x00D6;">
+<!ENTITY szlig "&#x00DF;">
+<!ENTITY thorn "&#x00FE;">
+<!ENTITY THORN "&#x00DE;">
+<!ENTITY uacute "&#x00FA;">
+<!ENTITY Uacute "&#x00DA;">
+<!ENTITY ucirc "&#x00FB;">
+<!ENTITY Ucirc "&#x00DB;">
+<!ENTITY ugrave "&#x00F9;">
+<!ENTITY Ugrave "&#x00D9;">
+<!ENTITY uuml "&#x00FC;">
+<!ENTITY Uuml "&#x00DC;">
+<!ENTITY yacute "&#x00FD;">
+<!ENTITY Yacute "&#x00DD;">
+<!ENTITY yuml "&#x00FF;">
+<!ENTITY half "&#x00BD;">
+<!ENTITY frac12 "&#x00BD;">
+<!ENTITY frac14 "&#x00BC;">
+<!ENTITY frac34 "&#x00BE;">
+<!ENTITY frac18 "&#x215B;">
+<!ENTITY frac38 "&#x215C;">
+<!ENTITY frac58 "&#x215D;">
+<!ENTITY frac78 "&#x215E;">
+<!ENTITY sup1 "&#x00B9;">
+<!ENTITY sup2 "&#x00B2;">
+<!ENTITY sup3 "&#x00B3;">
+<!ENTITY plus "&#x002B;">
+<!ENTITY plusmn "&#x00B1;">
+<!ENTITY lt "&#38;#60;">
+<!ENTITY equals "&#x003D;">
+<!ENTITY gt "&#x003E;">
+<!ENTITY divide "&#x00F7;">
+<!ENTITY times "&#x00D7;">
+<!ENTITY curren "&#x00A4;">
+<!ENTITY pound "&#x00A3;">
+<!ENTITY dollar "&#x0024;">
+<!ENTITY cent "&#x00A2;">
+<!ENTITY yen "&#x00A5;">
+<!ENTITY num "&#x0023;">
+<!ENTITY percnt "&#x0025;">
+<!ENTITY amp "&#38;#38;">
+<!ENTITY ast "&#x002A;">
+<!ENTITY commat "&#x0040;">
+<!ENTITY lsqb "&#x005B;">
+<!ENTITY bsol "&#x005C;">
+<!ENTITY rsqb "&#x005D;">
+<!ENTITY lcub "&#x007B;">
+<!ENTITY horbar "&#x2015;">
+<!ENTITY verbar "&#x007C;">
+<!ENTITY rcub "&#x007D;">
+<!ENTITY micro "&#x00B5;">
+<!ENTITY ohm "&#x2126;">
+<!ENTITY deg "&#x00B0;">
+<!ENTITY ordm "&#x00BA;">
+<!ENTITY ordf "&#x00AA;">
+<!ENTITY sect "&#x00A7;">
+<!ENTITY para "&#x00B6;">
+<!ENTITY middot "&#x00B7;">
+<!ENTITY larr "&#x2190;">
+<!ENTITY rarr "&#x2192;">
+<!ENTITY uarr "&#x2191;">
+<!ENTITY darr "&#x2193;">
+<!ENTITY copy "&#x00A9;">
+<!ENTITY reg "&#x00AE;">
+<!ENTITY trade "&#x2122;">
+<!ENTITY brvbar "&#x00A6;">
+<!ENTITY not "&#x00AC;">
+<!ENTITY sung "&#x2669;">
+<!ENTITY excl "&#x0021;">
+<!ENTITY iexcl "&#x00A1;">
+<!ENTITY quot "&#x0022;">
+<!ENTITY apos "&#x0027;">
+<!ENTITY lpar "&#x0028;">
+<!ENTITY rpar "&#x0029;">
+<!ENTITY comma "&#x002C;">
+<!ENTITY lowbar "&#x005F;">
+<!ENTITY hyphen "&#x002D;">
+<!ENTITY period "&#x002E;">
+<!ENTITY sol "&#x002F;">
+<!ENTITY colon "&#x003A;">
+<!ENTITY semi "&#x003B;">
+<!ENTITY quest "&#x003F;">
+<!ENTITY iquest "&#x00BF;">
+<!ENTITY laquo "&#x00AB;">
+<!ENTITY raquo "&#x00BB;">
+<!ENTITY lsquo "&#x2018;">
+<!ENTITY rsquo "&#x2019;">
+<!ENTITY ldquo "&#x201C;">
+<!ENTITY rdquo "&#x201D;">
+<!ENTITY nbsp "&#x00A0;">
+<!ENTITY shy "&#x00AD;">
+<!ENTITY emsp "&#x2003;">
+<!ENTITY ensp "&#x2002;">
+<!ENTITY emsp13 "&#x2004;">
+<!ENTITY emsp14 "&#x2005;">
+<!ENTITY numsp "&#x2007;">
+<!ENTITY puncsp "&#x2008;">
+<!ENTITY thinsp "&#x2009;">
+<!ENTITY hairsp "&#x200A;">
+<!ENTITY mdash "&#x2014;">
+<!ENTITY ndash "&#x2013;">
+<!ENTITY dash "&#x2010;">
+<!ENTITY blank "&#x2423;">
+<!ENTITY hellip "&#x2026;">
+<!ENTITY nldr "&#x2025;">
+<!ENTITY frac13 "&#x2153;">
+<!ENTITY frac23 "&#x2154;">
+<!ENTITY frac15 "&#x2155;">
+<!ENTITY frac25 "&#x2156;">
+<!ENTITY frac35 "&#x2157;">
+<!ENTITY frac45 "&#x2158;">
+<!ENTITY frac16 "&#x2159;">
+<!ENTITY frac56 "&#x215A;">
+<!ENTITY incare "&#x2105;">
+<!ENTITY block "&#x2588;">
+<!ENTITY uhblk "&#x2580;">
+<!ENTITY lhblk "&#x2584;">
+<!ENTITY blk14 "&#x2591;">
+<!ENTITY blk12 "&#x2592;">
+<!ENTITY blk34 "&#x2593;">
+<!ENTITY marker "&#x25AE;">
+<!ENTITY cir "&#x25CB;">
+<!ENTITY squ "&#x25A1;">
+<!ENTITY rect "&#x25AD;">
+<!ENTITY utri "&#x25B5;">
+<!ENTITY dtri "&#x25BF;">
+<!ENTITY star "&#x22C6;">
+<!ENTITY bull "&#x2022;">
+<!ENTITY squf "&#x25AA;">
+<!ENTITY utrif "&#x25B4;">
+<!ENTITY dtrif "&#x25BE;">
+<!ENTITY ltrif "&#x25C2;">
+<!ENTITY rtrif "&#x25B8;">
+<!ENTITY clubs "&#x2663;">
+<!ENTITY diams "&#x2666;">
+<!ENTITY hearts "&#x2665;">
+<!ENTITY spades "&#x2660;">
+<!ENTITY malt "&#x2720;">
+<!ENTITY dagger "&#x2020;">
+<!ENTITY Dagger "&#x2021;">
+<!ENTITY check "&#x2713;">
+<!ENTITY cross "&#x2717;">
+<!ENTITY sharp "&#x266F;">
+<!ENTITY flat "&#x266D;">
+<!ENTITY male "&#x2642;">
+<!ENTITY female "&#x2640;">
+<!ENTITY phone "&#x260E;">
+<!ENTITY telrec "&#x2315;">
+<!ENTITY copysr "&#x2117;">
+<!ENTITY caret "&#x2041;">
+<!ENTITY lsquor "&#x201A;">
+<!ENTITY ldquor "&#x201E;">
+<!ENTITY fflig "&#xFB00;">
+<!ENTITY filig "&#xFB01;">
+<!ENTITY ffilig "&#xFB03;">
+<!ENTITY ffllig "&#xFB04;">
+<!ENTITY fllig "&#xFB02;">
+<!ENTITY mldr "&#x2026;">
+<!ENTITY rdquor "&#x201C;">
+<!ENTITY rsquor "&#x2018;">
+<!ENTITY vellip "&#x22EE;">
+<!ENTITY hybull "&#x2043;">
+<!ENTITY loz "&#x25CA;">
+<!ENTITY lozf "&#x2726;">
+<!ENTITY ltri "&#x25C3;">
+<!ENTITY rtri "&#x25B9;">
+<!ENTITY starf "&#x2605;">
+<!ENTITY natur "&#x266E;">
+<!ENTITY rx "&#x211E;">
+<!ENTITY sext "&#x2736;">
+<!ENTITY target "&#x2316;">
+<!ENTITY dlcrop "&#x230D;">
+<!ENTITY drcrop "&#x230C;">
+<!ENTITY ulcrop "&#x230F;">
+<!ENTITY urcrop "&#x230E;">
+<!ENTITY % local.notation.class "">
+<!ENTITY % notation.class
+ "BMP| CGM-CHAR | CGM-BINARY | CGM-CLEAR | DITROFF | DVI
+ | EPS | EQN | FAX | GIF | GIF87a | GIF89a
+ | JPG | JPEG | IGES | PCX
+ | PIC | PNG | PS | SGML | TBL | TEX | TIFF | WMF | WPG
+ | linespecific
+ %local.notation.class;">
+<!NOTATION BMP PUBLIC
+"+//ISBN 0-7923-9432-1::Graphic Notation//NOTATION Microsoft Windows bitmap//EN">
+<!NOTATION CGM-CHAR PUBLIC "ISO 8632/2//NOTATION Character encoding//EN">
+<!NOTATION CGM-BINARY PUBLIC "ISO 8632/3//NOTATION Binary encoding//EN">
+<!NOTATION CGM-CLEAR PUBLIC "ISO 8632/4//NOTATION Clear text encoding//EN">
+<!NOTATION DITROFF SYSTEM "DITROFF">
+<!NOTATION DVI SYSTEM "DVI">
+<!NOTATION EPS PUBLIC
+"+//ISBN 0-201-18127-4::Adobe//NOTATION PostScript Language Ref. Manual//EN">
+<!NOTATION EQN SYSTEM "EQN">
+<!NOTATION FAX PUBLIC
+"-//USA-DOD//NOTATION CCITT Group 4 Facsimile Type 1 Untiled Raster//EN">
+<!NOTATION GIF SYSTEM "GIF">
+<!NOTATION GIF87a PUBLIC
+"-//CompuServe//NOTATION Graphics Interchange Format 87a//EN">
+<!NOTATION GIF89a PUBLIC
+"-//CompuServe//NOTATION Graphics Interchange Format 89a//EN">
+<!NOTATION JPG SYSTEM "JPG">
+<!NOTATION JPEG SYSTEM "JPG">
+<!NOTATION IGES PUBLIC
+"-//USA-DOD//NOTATION (ASME/ANSI Y14.26M-1987) Initial Graphics Exchange Specification//EN">
+<!NOTATION PCX PUBLIC
+"+//ISBN 0-7923-9432-1::Graphic Notation//NOTATION ZSoft PCX bitmap//EN">
+<!NOTATION PIC SYSTEM "PIC">
+<!NOTATION PNG SYSTEM "http://www.w3.org/TR/REC-png">
+<!NOTATION PS SYSTEM "PS">
+<!NOTATION SGML PUBLIC
+"ISO 8879:1986//NOTATION Standard Generalized Markup Language//EN">
+<!NOTATION TBL SYSTEM "TBL">
+<!NOTATION TEX PUBLIC
+"+//ISBN 0-201-13448-9::Knuth//NOTATION The TeXbook//EN">
+<!NOTATION TIFF SYSTEM "TIFF">
+<!NOTATION WMF PUBLIC
+"+//ISBN 0-7923-9432-1::Graphic Notation//NOTATION Microsoft Windows Metafile//EN">
+<!NOTATION WPG SYSTEM "WPG">
+<!NOTATION linespecific SYSTEM "linespecific">
+<!ENTITY euro "&#x20AC;">
+<!ENTITY % yesorno.attvals "CDATA">
+<!ENTITY % local.mediaobject.mix "">
+<!ENTITY % mediaobject.mix
+ "videoobject|audioobject|imageobject %local.mediaobject.mix;">
+<!ENTITY % formalobject.title.content "title, titleabbrev?">
+<!ENTITY % role.attrib
+ "role CDATA #IMPLIED">
+<!ENTITY % label.attrib
+ "label CDATA #IMPLIED">
+<!ENTITY % linespecific.attrib
+ "format NOTATION
+ (linespecific) 'linespecific'
+ linenumbering (numbered|unnumbered) #IMPLIED">
+<!ENTITY % linkendreq.attrib
+ "linkend IDREF #REQUIRED">
+<!ENTITY % local.mark.attrib "">
+<!ENTITY % mark.attrib
+ "mark CDATA #IMPLIED
+ %local.mark.attrib;"
+>
+<!ENTITY % moreinfo.attrib
+ "moreinfo (refentry|none) 'none'">
+<!ENTITY % pagenum.attrib
+ "pagenum CDATA #IMPLIED">
+<!ENTITY % local.status.attrib "">
+<!ENTITY % status.attrib
+ "status CDATA #IMPLIED
+ %local.status.attrib;"
+>
+<!ENTITY % width.attrib
+ "width CDATA #IMPLIED">
+<!ENTITY % local.title.attrib "">
+<!ENTITY % title.role.attrib "%role.attrib;">
+<!ELEMENT title (%title.char.mix;)*>
+<!ATTLIST title
+ %pagenum.attrib;
+ %common.attrib;
+ %title.role.attrib;
+ %local.title.attrib;
+>
+<!ENTITY % local.titleabbrev.attrib "">
+<!ENTITY % titleabbrev.role.attrib "%role.attrib;">
+<!ELEMENT titleabbrev (%title.char.mix;)*>
+<!ATTLIST titleabbrev
+ %common.attrib;
+ %titleabbrev.role.attrib;
+ %local.titleabbrev.attrib;
+>
+<!ENTITY % local.subtitle.attrib "">
+<!ENTITY % subtitle.role.attrib "%role.attrib;">
+<!ELEMENT subtitle (%title.char.mix;)*>
+<!ATTLIST subtitle
+ %common.attrib;
+ %subtitle.role.attrib;
+ %local.subtitle.attrib;
+>
+<!ENTITY % local.bibliomixed.attrib "">
+<!ENTITY % bibliomixed.role.attrib "%role.attrib;">
+<!ATTLIST bibliomixed
+ %common.attrib;
+ %bibliomixed.role.attrib;
+ %local.bibliomixed.attrib;
+>
+<!ENTITY % local.articleinfo.attrib "">
+<!ENTITY % articleinfo.role.attrib "%role.attrib;">
+<!ATTLIST articleinfo
+ %common.attrib;
+ %articleinfo.role.attrib;
+ %local.articleinfo.attrib;
+>
+<!ENTITY % bibliomset.role.attrib "%role.attrib;">
+<!ENTITY % local.bibliomset.attrib "">
+<!ELEMENT bibliomset (#PCDATA | %bibliocomponent.mix; | bibliomset)*>
+<!ATTLIST bibliomset
+ relation CDATA #IMPLIED
+ %bibliomset.role.attrib;
+ %common.attrib;
+ %local.bibliomset.attrib;
+>
+<!ENTITY % local.bibliomisc.attrib "">
+<!ENTITY % bibliomisc.role.attrib "%role.attrib;">
+<!ELEMENT bibliomisc (%para.char.mix;)*>
+<!ATTLIST bibliomisc
+ %common.attrib;
+ %bibliomisc.role.attrib;
+ %local.bibliomisc.attrib;
+>
+<!ENTITY % local.subjectset.attrib "">
+<!ENTITY % subjectset.role.attrib "%role.attrib;">
+<!ELEMENT subjectset (subject+)>
+<!ATTLIST subjectset
+ scheme NMTOKEN #IMPLIED
+ %common.attrib;
+ %subjectset.role.attrib;
+ %local.subjectset.attrib;
+>
+<!ENTITY % local.subject.attrib "">
+<!ENTITY % subject.role.attrib "%role.attrib;">
+<!ELEMENT subject (subjectterm+)>
+<!ATTLIST subject
+ weight CDATA #IMPLIED
+ %common.attrib;
+ %subject.role.attrib;
+ %local.subject.attrib;
+>
+<!ENTITY % local.subjectterm.attrib "">
+<!ENTITY % subjectterm.role.attrib "%role.attrib;">
+<!ELEMENT subjectterm (#PCDATA)>
+<!ATTLIST subjectterm
+ %common.attrib;
+ %subjectterm.role.attrib;
+ %local.subjectterm.attrib;
+>
+<!ENTITY % local.keywordset.attrib "">
+<!ENTITY % keywordset.role.attrib "%role.attrib;">
+<!ELEMENT keywordset (keyword+)>
+<!ATTLIST keywordset
+ %common.attrib;
+ %keywordset.role.attrib;
+ %local.keywordset.attrib;
+>
+<!ENTITY % local.keyword.attrib "">
+<!ENTITY % keyword.role.attrib "%role.attrib;">
+<!ELEMENT keyword (#PCDATA)>
+<!ATTLIST keyword
+ %common.attrib;
+ %keyword.role.attrib;
+ %local.keyword.attrib;
+>
+<!ENTITY % local.sidebar.attrib "">
+<!ENTITY % sidebar.role.attrib "%role.attrib;">
+<!ATTLIST sidebar
+ %common.attrib;
+ %sidebar.role.attrib;
+ %local.sidebar.attrib;
+>
+<!ENTITY % local.abstract.attrib "">
+<!ENTITY % abstract.role.attrib "%role.attrib;">
+<!ELEMENT abstract (title?, (%para.class;)+)>
+<!ATTLIST abstract
+ %common.attrib;
+ %abstract.role.attrib;
+ %local.abstract.attrib;
+>
+<!ENTITY % local.authorblurb.attrib "">
+<!ENTITY % authorblurb.role.attrib "%role.attrib;">
+<!ELEMENT authorblurb (title?, (%para.class;)+)>
+<!ATTLIST authorblurb
+ %common.attrib;
+ %authorblurb.role.attrib;
+ %local.authorblurb.attrib;
+>
+<!ENTITY % local.blockquote.attrib "">
+<!ENTITY % blockquote.role.attrib "%role.attrib;">
+<!ELEMENT blockquote (title?, attribution?, (%component.mix;)+)>
+<!ATTLIST blockquote
+ %common.attrib;
+ %blockquote.role.attrib;
+ %local.blockquote.attrib;
+>
+<!ENTITY % local.attribution.attrib "">
+<!ENTITY % attribution.role.attrib "%role.attrib;">
+<!ELEMENT attribution (%para.char.mix;)*>
+<!ATTLIST attribution
+ %common.attrib;
+ %attribution.role.attrib;
+ %local.attribution.attrib;
+>
+<!ENTITY % local.epigraph.attrib "">
+<!ENTITY % epigraph.role.attrib "%role.attrib;">
+<!ELEMENT epigraph (attribution?, (%para.class;)+)>
+<!ATTLIST epigraph
+ %common.attrib;
+ %epigraph.role.attrib;
+ %local.epigraph.attrib;
+>
+<!ENTITY % local.footnote.attrib "">
+<!ENTITY % footnote.role.attrib "%role.attrib;">
+<!ELEMENT footnote ((%footnote.mix;)+)>
+<!ATTLIST footnote
+ %label.attrib;
+ %common.attrib;
+ %footnote.role.attrib;
+ %local.footnote.attrib;
+>
+<!ENTITY % local.para.attrib "">
+<!ENTITY % para.role.attrib "%role.attrib;">
+<!ATTLIST para
+ %common.attrib;
+ %para.role.attrib;
+ %local.para.attrib;
+>
+<!ENTITY % local.admon.attrib "">
+<!ENTITY % admon.role.attrib "%role.attrib;">
+<!ELEMENT note (title?, (%admon.mix;)+)>
+<!ATTLIST note
+ %common.attrib;
+ %admon.role.attrib;
+ %local.admon.attrib;
+>
+<!ENTITY % local.itemizedlist.attrib "">
+<!ENTITY % itemizedlist.role.attrib "%role.attrib;">
+<!ELEMENT itemizedlist ((%formalobject.title.content;)?, listitem+)>
+<!ATTLIST itemizedlist spacing (normal
+ |compact) #IMPLIED
+ %mark.attrib;
+ %common.attrib;
+ %itemizedlist.role.attrib;
+ %local.itemizedlist.attrib;
+>
+<!ENTITY % local.orderedlist.attrib "">
+<!ENTITY % orderedlist.role.attrib "%role.attrib;">
+<!ELEMENT orderedlist ((%formalobject.title.content;)?, listitem+)>
+<!ATTLIST orderedlist
+ numeration (arabic
+ |upperalpha
+ |loweralpha
+ |upperroman
+ |lowerroman) #IMPLIED
+ inheritnum (inherit
+ |ignore) "ignore"
+ continuation (continues
+ |restarts) "restarts"
+ spacing (normal
+ |compact) #IMPLIED
+ %common.attrib;
+ %orderedlist.role.attrib;
+ %local.orderedlist.attrib;
+>
+<!ENTITY % local.listitem.attrib "">
+<!ENTITY % listitem.role.attrib "%role.attrib;">
+<!ELEMENT listitem ((%component.mix;)+)>
+<!ATTLIST listitem
+ override CDATA #IMPLIED
+ %common.attrib;
+ %listitem.role.attrib;
+ %local.listitem.attrib;
+>
+<!ENTITY % local.variablelist.attrib "">
+<!ENTITY % variablelist.role.attrib "%role.attrib;">
+<!ELEMENT variablelist ((%formalobject.title.content;)?, varlistentry+)>
+<!ATTLIST variablelist
+ termlength CDATA #IMPLIED
+ %common.attrib;
+ %variablelist.role.attrib;
+ %local.variablelist.attrib;
+>
+<!ENTITY % local.varlistentry.attrib "">
+<!ENTITY % varlistentry.role.attrib "%role.attrib;">
+<!ELEMENT varlistentry (term+, listitem)>
+<!ATTLIST varlistentry
+ %common.attrib;
+ %varlistentry.role.attrib;
+ %local.varlistentry.attrib;
+>
+<!ENTITY % local.term.attrib "">
+<!ENTITY % term.role.attrib "%role.attrib;">
+<!ELEMENT term (%para.char.mix;)*>
+<!ATTLIST term
+ %common.attrib;
+ %term.role.attrib;
+ %local.term.attrib;
+>
+<!ENTITY % local.example.attrib "">
+<!ENTITY % example.role.attrib "%role.attrib;">
+<!ELEMENT example ((%formalobject.title.content;), (%example.mix;)+)>
+<!ATTLIST example
+ %label.attrib;
+ %width.attrib;
+ %common.attrib;
+ %example.role.attrib;
+ %local.example.attrib;
+>
+<!ENTITY % local.programlisting.attrib "">
+<!ENTITY % programlisting.role.attrib "%role.attrib;">
+<!ATTLIST programlisting
+ %width.attrib;
+ %linespecific.attrib;
+ %common.attrib;
+ %programlisting.role.attrib;
+ %local.programlisting.attrib;
+>
+<!ENTITY % local.literallayout.attrib "">
+<!ENTITY % literallayout.role.attrib "%role.attrib;">
+<!ATTLIST literallayout
+ %width.attrib;
+ %linespecific.attrib;
+ class (monospaced|normal) "normal"
+ %common.attrib;
+ %literallayout.role.attrib;
+ %local.literallayout.attrib;
+>
+<!ENTITY % local.figure.attrib "">
+<!ENTITY % figure.role.attrib "%role.attrib;">
+<!ELEMENT figure ((%formalobject.title.content;), (%figure.mix; |
+ %link.char.class;)+)>
+<!ATTLIST figure
+ float %yesorno.attvals; '0'
+ pgwide %yesorno.attvals; #IMPLIED
+ %label.attrib;
+ %common.attrib;
+ %figure.role.attrib;
+ %local.figure.attrib;
+>
+<!ENTITY % local.mediaobject.attrib "">
+<!ENTITY % mediaobject.role.attrib "%role.attrib;">
+<!ELEMENT mediaobject (objectinfo?,
+ (%mediaobject.mix;),
+ (%mediaobject.mix;|textobject)*,
+ caption?)>
+<!ATTLIST mediaobject
+ %common.attrib;
+ %mediaobject.role.attrib;
+ %local.mediaobject.attrib;
+>
+<!ENTITY % local.inlinemediaobject.attrib "">
+<!ENTITY % inlinemediaobject.role.attrib "%role.attrib;">
+<!ELEMENT inlinemediaobject (objectinfo?,
+ (%mediaobject.mix;),
+ (%mediaobject.mix;|textobject)*)>
+<!ATTLIST inlinemediaobject
+ %common.attrib;
+ %inlinemediaobject.role.attrib;
+ %local.inlinemediaobject.attrib;
+>
+<!ENTITY % local.videoobject.attrib "">
+<!ENTITY % videoobject.role.attrib "%role.attrib;">
+<!ELEMENT videoobject (objectinfo?, videodata)>
+<!ATTLIST videoobject
+ %common.attrib;
+ %videoobject.role.attrib;
+ %local.videoobject.attrib;
+>
+<!ENTITY % local.audioobject.attrib "">
+<!ENTITY % audioobject.role.attrib "%role.attrib;">
+<!ELEMENT audioobject (objectinfo?, audiodata)>
+<!ATTLIST audioobject
+ %common.attrib;
+ %audioobject.role.attrib;
+ %local.audioobject.attrib;
+>
+<!ENTITY % local.imageobject.attrib "">
+<!ENTITY % imageobject.role.attrib "%role.attrib;">
+<!ELEMENT imageobject (objectinfo?, imagedata)>
+<!ATTLIST imageobject
+ %common.attrib;
+ %imageobject.role.attrib;
+ %local.imageobject.attrib;
+>
+<!ENTITY % local.textobject.attrib "">
+<!ENTITY % textobject.role.attrib "%role.attrib;">
+<!ELEMENT textobject (objectinfo?, (phrase|(%textobject.mix;)+))>
+<!ATTLIST textobject
+ %common.attrib;
+ %textobject.role.attrib;
+ %local.textobject.attrib;
+>
+<!ENTITY % local.objectinfo.attrib "">
+<!ENTITY % objectinfo.role.attrib "%role.attrib;">
+<!ATTLIST objectinfo
+ %common.attrib;
+ %objectinfo.role.attrib;
+ %local.objectinfo.attrib;
+>
+<!ENTITY % local.objectdata.attrib "">
+<!ENTITY % objectdata.attrib
+ "
+ entityref ENTITY #IMPLIED
+ fileref CDATA #IMPLIED
+ format (%notation.class;)
+ #IMPLIED
+ srccredit CDATA #IMPLIED
+ %local.objectdata.attrib;"
+>
+<!ENTITY % local.videodata.attrib "">
+<!ENTITY % videodata.role.attrib "%role.attrib;">
+<!ELEMENT videodata EMPTY>
+<!ATTLIST videodata
+ %common.attrib;
+ %objectdata.attrib;
+ width CDATA #IMPLIED
+ depth CDATA #IMPLIED
+ align (left
+ |right
+ |center) #IMPLIED
+ scale CDATA #IMPLIED
+ scalefit %yesorno.attvals;
+ #IMPLIED
+ %videodata.role.attrib;
+ %local.videodata.attrib;
+>
+<!ENTITY % local.audiodata.attrib "">
+<!ENTITY % audiodata.role.attrib "%role.attrib;">
+<!ELEMENT audiodata EMPTY>
+<!ATTLIST audiodata
+ %common.attrib;
+ %objectdata.attrib;
+ %local.audiodata.attrib;
+ %audiodata.role.attrib;
+>
+<!ENTITY % local.imagedata.attrib "">
+<!ENTITY % imagedata.role.attrib "%role.attrib;">
+<!ELEMENT imagedata EMPTY>
+<!ATTLIST imagedata
+ %common.attrib;
+ %objectdata.attrib;
+ width CDATA #IMPLIED
+ depth CDATA #IMPLIED
+ align (left
+ |right
+ |center) #IMPLIED
+ scale CDATA #IMPLIED
+ scalefit %yesorno.attvals;
+ #IMPLIED
+ %local.imagedata.attrib;
+ %imagedata.role.attrib;
+>
+<!ENTITY % local.caption.attrib "">
+<!ENTITY % caption.role.attrib "%role.attrib;">
+<!ELEMENT caption (%textobject.mix;)*>
+<!ATTLIST caption
+ %common.attrib;
+ %local.caption.attrib;
+ %caption.role.attrib;
+>
+<!ENTITY % tables.role.attrib "%role.attrib;">
+<!ENTITY % bodyatt "%label.attrib;">
+<!ENTITY % secur
+ "%common.attrib;
+ %tables.role.attrib;">
+<!ENTITY % common.table.attribs
+ "%bodyatt;
+ %secur;">
+<!ENTITY % tbl.entry.mdl "%para.char.mix; | %tabentry.mix;">
+<!ENTITY % yesorno 'CDATA'>
+<!ENTITY % tbl.table.att '
+ tabstyle CDATA #IMPLIED
+ tocentry %yesorno; #IMPLIED
+ shortentry %yesorno; #IMPLIED
+ orient (port|land) #IMPLIED
+ pgwide %yesorno; #IMPLIED '>
+<!ENTITY % tbl.tgroup.mdl "colspec*,spanspec*,thead?,tfoot?,tbody">
+<!ENTITY % tbl.tgroup.att '
+ tgroupstyle CDATA #IMPLIED '>
+<!ENTITY % tbl.hdft.mdl "colspec*,row+">
+<!ENTITY % tbl.row.mdl "(entry|entrytbl)+">
+<!ENTITY % tbl.entrytbl.mdl "colspec*,spanspec*,thead?,tbody">
+<!ELEMENT table (%tbl.table.mdl;)>
+<!ATTLIST table
+ frame (top|bottom|topbot|all|sides|none) #IMPLIED
+ colsep %yesorno; #IMPLIED
+ rowsep %yesorno; #IMPLIED
+ %tbl.table.att;
+ %bodyatt;
+ %secur;
+>
+<!ELEMENT tgroup (%tbl.tgroup.mdl;) >
+<!ATTLIST tgroup
+ cols CDATA #REQUIRED
+ %tbl.tgroup.att;
+ colsep %yesorno; #IMPLIED
+ rowsep %yesorno; #IMPLIED
+ align (left|right|center|justify|char) #IMPLIED
+ char CDATA #IMPLIED
+ charoff CDATA #IMPLIED
+ %secur;
+>
+<!ELEMENT colspec EMPTY >
+<!ATTLIST colspec
+ colnum CDATA #IMPLIED
+ colname CDATA #IMPLIED
+ colwidth CDATA #IMPLIED
+ colsep %yesorno; #IMPLIED
+ rowsep %yesorno; #IMPLIED
+ align (left|right|center|justify|char) #IMPLIED
+ char CDATA #IMPLIED
+ charoff CDATA #IMPLIED
+>
+<!ELEMENT spanspec EMPTY >
+<!ATTLIST spanspec
+ namest CDATA #REQUIRED
+ nameend CDATA #REQUIRED
+ spanname CDATA #REQUIRED
+ colsep %yesorno; #IMPLIED
+ rowsep %yesorno; #IMPLIED
+ align (left|right|center|justify|char) #IMPLIED
+ char CDATA #IMPLIED
+ charoff CDATA #IMPLIED
+>
+<!ELEMENT thead (%tbl.hdft.mdl;)>
+<!ATTLIST thead
+ valign (top|middle|bottom) #IMPLIED
+ %secur;
+>
+<!ELEMENT tfoot (%tbl.hdft.mdl;)>
+<!ATTLIST tfoot
+ valign (top|middle|bottom) #IMPLIED
+ %secur;
+>
+<!ELEMENT tbody (row+)>
+<!ATTLIST tbody
+ valign (top|middle|bottom) #IMPLIED
+ %secur;
+>
+<!ELEMENT row (%tbl.row.mdl;)>
+<!ATTLIST row
+ rowsep %yesorno; #IMPLIED
+ valign (top|middle|bottom) #IMPLIED
+ %secur;
+>
+<!ELEMENT entrytbl (%tbl.entrytbl.mdl;)>
+<!ATTLIST entrytbl
+ cols CDATA #REQUIRED
+ %tbl.tgroup.att;
+ colname CDATA #IMPLIED
+ spanname CDATA #IMPLIED
+ namest CDATA #IMPLIED
+ nameend CDATA #IMPLIED
+ colsep %yesorno; #IMPLIED
+ rowsep %yesorno; #IMPLIED
+ align (left|right|center|justify|char) #IMPLIED
+ char CDATA #IMPLIED
+ charoff CDATA #IMPLIED
+ %secur;
+>
+<!ELEMENT entry (%tbl.entry.mdl;)*>
+<!ATTLIST entry
+ colname CDATA #IMPLIED
+ namest CDATA #IMPLIED
+ nameend CDATA #IMPLIED
+ spanname CDATA #IMPLIED
+ morerows CDATA #IMPLIED
+ colsep %yesorno; #IMPLIED
+ rowsep %yesorno; #IMPLIED
+ align (left|right|center|justify|char) #IMPLIED
+ char CDATA #IMPLIED
+ charoff CDATA #IMPLIED
+ rotate %yesorno; #IMPLIED
+ valign (top|middle|bottom) #IMPLIED
+ %secur;
+>
+<!ENTITY % local.informaltable.attrib "">
+<!ATTLIST informaltable
+ frame (top
+ |bottom
+ |topbot
+ |all
+ |sides
+ |none) #IMPLIED
+ colsep %yesorno.attvals; #IMPLIED
+ rowsep %yesorno.attvals; #IMPLIED
+ %common.table.attribs;
+ %tbl.table.att;
+ %local.informaltable.attrib;
+>
+<!ENTITY % local.affiliation.attrib "">
+<!ENTITY % affiliation.role.attrib "%role.attrib;">
+<!ATTLIST affiliation
+ %common.attrib;
+ %affiliation.role.attrib;
+ %local.affiliation.attrib;
+>
+<!ENTITY % local.jobtitle.attrib "">
+<!ENTITY % jobtitle.role.attrib "%role.attrib;">
+<!ELEMENT jobtitle (%docinfo.char.mix;)*>
+<!ATTLIST jobtitle
+ %common.attrib;
+ %jobtitle.role.attrib;
+ %local.jobtitle.attrib;
+>
+<!ENTITY % local.author.attrib "">
+<!ENTITY % author.role.attrib "%role.attrib;">
+<!ELEMENT author ((%person.ident.mix;)+)>
+<!ATTLIST author
+ %common.attrib;
+ %author.role.attrib;
+ %local.author.attrib;
+>
+<!ENTITY % local.authorgroup.attrib "">
+<!ENTITY % authorgroup.role.attrib "%role.attrib;">
+<!ATTLIST authorgroup
+ %common.attrib;
+ %authorgroup.role.attrib;
+ %local.authorgroup.attrib;
+>
+<!ENTITY % local.authorinitials.attrib "">
+<!ENTITY % authorinitials.role.attrib "%role.attrib;">
+<!ELEMENT authorinitials (%docinfo.char.mix;)*>
+<!ATTLIST authorinitials
+ %common.attrib;
+ %authorinitials.role.attrib;
+ %local.authorinitials.attrib;
+>
+<!ENTITY % local.copyright.attrib "">
+<!ENTITY % copyright.role.attrib "%role.attrib;">
+<!ELEMENT copyright (year+, holder*)>
+<!ATTLIST copyright
+ %common.attrib;
+ %copyright.role.attrib;
+ %local.copyright.attrib;
+>
+<!ENTITY % local.year.attrib "">
+<!ENTITY % year.role.attrib "%role.attrib;">
+<!ELEMENT year (%docinfo.char.mix;)*>
+<!ATTLIST year
+ %common.attrib;
+ %year.role.attrib;
+ %local.year.attrib;
+>
+<!ENTITY % local.holder.attrib "">
+<!ENTITY % holder.role.attrib "%role.attrib;">
+<!ELEMENT holder (%docinfo.char.mix;)*>
+<!ATTLIST holder
+ %common.attrib;
+ %holder.role.attrib;
+ %local.holder.attrib;
+>
+<!ENTITY % local.corpauthor.attrib "">
+<!ENTITY % corpauthor.role.attrib "%role.attrib;">
+<!ELEMENT corpauthor (%docinfo.char.mix;)*>
+<!ATTLIST corpauthor
+ %common.attrib;
+ %corpauthor.role.attrib;
+ %local.corpauthor.attrib;
+>
+<!ENTITY % local.date.attrib "">
+<!ENTITY % date.role.attrib "%role.attrib;">
+<!ELEMENT date (%docinfo.char.mix;)*>
+<!ATTLIST date
+ %common.attrib;
+ %date.role.attrib;
+ %local.date.attrib;
+>
+<!ENTITY % local.edition.attrib "">
+<!ENTITY % edition.role.attrib "%role.attrib;">
+<!ELEMENT edition (%docinfo.char.mix;)*>
+<!ATTLIST edition
+ %common.attrib;
+ %edition.role.attrib;
+ %local.edition.attrib;
+>
+<!ENTITY % local.editor.attrib "">
+<!ENTITY % editor.role.attrib "%role.attrib;">
+<!ELEMENT editor ((%person.ident.mix;)+)>
+<!ATTLIST editor
+ %common.attrib;
+ %editor.role.attrib;
+ %local.editor.attrib;
+>
+<!ENTITY % local.issuenum.attrib "">
+<!ENTITY % issuenum.role.attrib "%role.attrib;">
+<!ELEMENT issuenum (%docinfo.char.mix;)*>
+<!ATTLIST issuenum
+ %common.attrib;
+ %issuenum.role.attrib;
+ %local.issuenum.attrib;
+>
+<!ENTITY % local.legalnotice.attrib "">
+<!ENTITY % legalnotice.role.attrib "%role.attrib;">
+<!ELEMENT legalnotice (title?, (%legalnotice.mix;)+)>
+<!ATTLIST legalnotice
+ %common.attrib;
+ %legalnotice.role.attrib;
+ %local.legalnotice.attrib;
+>
+<!ENTITY % local.orgname.attrib "">
+<!ENTITY % orgname.role.attrib "%role.attrib;">
+<!ELEMENT orgname (%docinfo.char.mix;)*>
+<!ATTLIST orgname
+ %common.attrib;
+ %orgname.role.attrib;
+ %local.orgname.attrib;
+>
+<!ENTITY % local.othercredit.attrib "">
+<!ENTITY % othercredit.role.attrib "%role.attrib;">
+<!ELEMENT othercredit ((%person.ident.mix;)+)>
+<!ATTLIST othercredit
+ %common.attrib;
+ %othercredit.role.attrib;
+ %local.othercredit.attrib;
+>
+<!ENTITY % local.firstname.attrib "">
+<!ENTITY % firstname.role.attrib "%role.attrib;">
+<!ELEMENT firstname (%docinfo.char.mix;)*>
+<!ATTLIST firstname
+ %common.attrib;
+ %firstname.role.attrib;
+ %local.firstname.attrib;
+>
+<!ENTITY % local.honorific.attrib "">
+<!ENTITY % honorific.role.attrib "%role.attrib;">
+<!ELEMENT honorific (%docinfo.char.mix;)*>
+<!ATTLIST honorific
+ %common.attrib;
+ %honorific.role.attrib;
+ %local.honorific.attrib;
+>
+<!ENTITY % local.lineage.attrib "">
+<!ENTITY % lineage.role.attrib "%role.attrib;">
+<!ELEMENT lineage (%docinfo.char.mix;)*>
+<!ATTLIST lineage
+ %common.attrib;
+ %lineage.role.attrib;
+ %local.lineage.attrib;
+>
+<!ENTITY % local.othername.attrib "">
+<!ENTITY % othername.role.attrib "%role.attrib;">
+<!ELEMENT othername (%docinfo.char.mix;)*>
+<!ATTLIST othername
+ %common.attrib;
+ %othername.role.attrib;
+ %local.othername.attrib;
+>
+<!ENTITY % local.surname.attrib "">
+<!ENTITY % surname.role.attrib "%role.attrib;">
+<!ELEMENT surname (%docinfo.char.mix;)*>
+<!ATTLIST surname
+ %common.attrib;
+ %surname.role.attrib;
+ %local.surname.attrib;
+>
+<!ENTITY % local.pubdate.attrib "">
+<!ENTITY % pubdate.role.attrib "%role.attrib;">
+<!ELEMENT pubdate (%docinfo.char.mix;)*>
+<!ATTLIST pubdate
+ %common.attrib;
+ %pubdate.role.attrib;
+ %local.pubdate.attrib;
+>
+<!ENTITY % local.publishername.attrib "">
+<!ENTITY % publishername.role.attrib "%role.attrib;">
+<!ELEMENT publishername (%docinfo.char.mix;)*>
+<!ATTLIST publishername
+ %common.attrib;
+ %publishername.role.attrib;
+ %local.publishername.attrib;
+>
+<!ENTITY % local.releaseinfo.attrib "">
+<!ENTITY % releaseinfo.role.attrib "%role.attrib;">
+<!ELEMENT releaseinfo (%docinfo.char.mix;)*>
+<!ATTLIST releaseinfo
+ %common.attrib;
+ %releaseinfo.role.attrib;
+ %local.releaseinfo.attrib;
+>
+<!ENTITY % local.revhistory.attrib "">
+<!ENTITY % revhistory.role.attrib "%role.attrib;">
+<!ELEMENT revhistory (revision+)>
+<!ATTLIST revhistory
+ %common.attrib;
+ %revhistory.role.attrib;
+ %local.revhistory.attrib;
+>
+<!ENTITY % local.revision.attrib "">
+<!ENTITY % revision.role.attrib "%role.attrib;">
+<!ELEMENT revision (revnumber, date, authorinitials*,
+ (revremark|revdescription)?)>
+<!ATTLIST revision
+ %common.attrib;
+ %revision.role.attrib;
+ %local.revision.attrib;
+>
+<!ENTITY % local.revnumber.attrib "">
+<!ENTITY % revnumber.role.attrib "%role.attrib;">
+<!ELEMENT revnumber (%docinfo.char.mix;)*>
+<!ATTLIST revnumber
+ %common.attrib;
+ %revnumber.role.attrib;
+ %local.revnumber.attrib;
+>
+<!ENTITY % local.revremark.attrib "">
+<!ENTITY % revremark.role.attrib "%role.attrib;">
+<!ELEMENT revremark (%docinfo.char.mix;)*>
+<!ATTLIST revremark
+ %common.attrib;
+ %revremark.role.attrib;
+ %local.revremark.attrib;
+>
+<!ENTITY % local.revdescription.attrib "">
+<!ENTITY % revdescription.role.attrib "%role.attrib;">
+<!ELEMENT revdescription ((%revdescription.mix;)+)>
+<!ATTLIST revdescription
+ %common.attrib;
+ %revdescription.role.attrib;
+ %local.revdescription.attrib;
+>
+<!ENTITY % local.volumenum.attrib "">
+<!ENTITY % volumenum.role.attrib "%role.attrib;">
+<!ELEMENT volumenum (%docinfo.char.mix;)*>
+<!ATTLIST volumenum
+ %common.attrib;
+ %volumenum.role.attrib;
+ %local.volumenum.attrib;
+>
+<!ENTITY % local.command.attrib "">
+<!ENTITY % command.role.attrib "%role.attrib;">
+<!ELEMENT command (%cptr.char.mix;)*>
+<!ATTLIST command
+ %moreinfo.attrib;
+ %common.attrib;
+ %command.role.attrib;
+ %local.command.attrib;
+>
+<!ENTITY % local.computeroutput.attrib "">
+<!ENTITY % computeroutput.role.attrib "%role.attrib;">
+<!ELEMENT computeroutput (%cptr.char.mix;)*>
+<!ATTLIST computeroutput
+ %moreinfo.attrib;
+ %common.attrib;
+ %computeroutput.role.attrib;
+ %local.computeroutput.attrib;
+>
+<!ENTITY % local.email.attrib "">
+<!ENTITY % email.role.attrib "%role.attrib;">
+<!ELEMENT email (%docinfo.char.mix;)*>
+<!ATTLIST email
+ %common.attrib;
+ %email.role.attrib;
+ %local.email.attrib;
+>
+<!ENTITY % local.filename.attrib "">
+<!ENTITY % filename.role.attrib "%role.attrib;">
+<!ELEMENT filename (%smallcptr.char.mix;)*>
+<!ATTLIST filename
+ class (headerfile
+ |devicefile
+ |libraryfile
+ |directory
+ |symlink) #IMPLIED
+ path CDATA #IMPLIED
+ %moreinfo.attrib;
+ %common.attrib;
+ %filename.role.attrib;
+ %local.filename.attrib;
+>
+<!ENTITY % local.lineannotation.attrib "">
+<!ENTITY % lineannotation.role.attrib "%role.attrib;">
+<!ELEMENT lineannotation (%para.char.mix;)*>
+<!ATTLIST lineannotation
+ %common.attrib;
+ %lineannotation.role.attrib;
+ %local.lineannotation.attrib;
+>
+<!ENTITY % local.literal.attrib "">
+<!ENTITY % literal.role.attrib "%role.attrib;">
+<!ELEMENT literal (%cptr.char.mix;)*>
+<!ATTLIST literal
+ %moreinfo.attrib;
+ %common.attrib;
+ %literal.role.attrib;
+ %local.literal.attrib;
+>
+<!ENTITY % local.option.attrib "">
+<!ENTITY % option.role.attrib "%role.attrib;">
+<!ELEMENT option (%smallcptr.char.mix;)*>
+<!ATTLIST option
+ %common.attrib;
+ %option.role.attrib;
+ %local.option.attrib;
+>
+<!ENTITY % local.replaceable.attrib "">
+<!ENTITY % replaceable.role.attrib "%role.attrib;">
+<!ATTLIST replaceable
+ class (command
+ |function
+ |option
+ |parameter) #IMPLIED
+ %common.attrib;
+ %replaceable.role.attrib;
+ %local.replaceable.attrib;
+>
+<!ENTITY % local.systemitem.attrib "">
+<!ENTITY % systemitem.role.attrib "%role.attrib;">
+<!ELEMENT systemitem (%smallcptr.char.mix; | acronym)*>
+<!ATTLIST systemitem
+ class (constant
+ |groupname
+ |library
+ |macro
+ |osname
+ |resource
+ |systemname
+ |username) #IMPLIED
+ %moreinfo.attrib;
+ %common.attrib;
+ %systemitem.role.attrib;
+ %local.systemitem.attrib;
+>
+<!ENTITY % local.userinput.attrib "">
+<!ENTITY % userinput.role.attrib "%role.attrib;">
+<!ELEMENT userinput (%cptr.char.mix;)*>
+<!ATTLIST userinput
+ %moreinfo.attrib;
+ %common.attrib;
+ %userinput.role.attrib;
+ %local.userinput.attrib;
+>
+<!ENTITY % local.abbrev.attrib "">
+<!ENTITY % abbrev.role.attrib "%role.attrib;">
+<!ELEMENT abbrev (%word.char.mix;)*>
+<!ATTLIST abbrev
+ %common.attrib;
+ %abbrev.role.attrib;
+ %local.abbrev.attrib;
+>
+<!ENTITY % local.acronym.attrib "">
+<!ENTITY % acronym.role.attrib "%role.attrib;">
+<!ELEMENT acronym (%word.char.mix;)*>
+<!ATTLIST acronym
+ %common.attrib;
+ %acronym.role.attrib;
+ %local.acronym.attrib;
+>
+<!ENTITY % local.citetitle.attrib "">
+<!ENTITY % citetitle.role.attrib "%role.attrib;">
+<!ELEMENT citetitle (%para.char.mix;)*>
+<!ATTLIST citetitle
+ pubwork (article
+ |book
+ |chapter
+ |part
+ |refentry
+ |section
+ |journal
+ |series
+ |set
+ |manuscript) #IMPLIED
+ %common.attrib;
+ %citetitle.role.attrib;
+ %local.citetitle.attrib;
+>
+<!ENTITY % local.emphasis.attrib "">
+<!ENTITY % emphasis.role.attrib "%role.attrib;">
+<!ELEMENT emphasis (%para.char.mix;)*>
+<!ATTLIST emphasis
+ %common.attrib;
+ %emphasis.role.attrib;
+ %local.emphasis.attrib;
+>
+<!ENTITY % local.phrase.attrib "">
+<!ENTITY % phrase.role.attrib "%role.attrib;">
+<!ELEMENT phrase (%para.char.mix;)*>
+<!ATTLIST phrase
+ %common.attrib;
+ %phrase.role.attrib;
+ %local.phrase.attrib;
+>
+<!ENTITY % local.quote.attrib "">
+<!ENTITY % quote.role.attrib "%role.attrib;">
+<!ELEMENT quote (%para.char.mix;)*>
+<!ATTLIST quote
+ %common.attrib;
+ %quote.role.attrib;
+ %local.quote.attrib;
+>
+<!ENTITY % local.trademark.attrib "">
+<!ENTITY % trademark.role.attrib "%role.attrib;">
+<!ATTLIST trademark
+ class (service
+ |trade
+ |registered
+ |copyright) 'trade'
+ %common.attrib;
+ %trademark.role.attrib;
+ %local.trademark.attrib;
+>
+<!ENTITY % local.link.attrib "">
+<!ENTITY % link.role.attrib "%role.attrib;">
+<!ELEMENT link (%para.char.mix;)*>
+<!ATTLIST link
+ endterm IDREF #IMPLIED
+ %linkendreq.attrib; type CDATA #IMPLIED
+ %common.attrib;
+ %link.role.attrib;
+ %local.link.attrib;
+>
+<!ENTITY % local.ulink.attrib "">
+<!ENTITY % ulink.role.attrib "%role.attrib;">
+<!ELEMENT ulink (%para.char.mix;)*>
+<!ATTLIST ulink
+ url CDATA #REQUIRED
+ type CDATA #IMPLIED
+ %common.attrib;
+ %ulink.role.attrib;
+ %local.ulink.attrib;
+>
+<!ENTITY % local.footnoteref.attrib "">
+<!ENTITY % footnoteref.role.attrib "%role.attrib;">
+<!ELEMENT footnoteref EMPTY>
+<!ATTLIST footnoteref
+ %linkendreq.attrib; %label.attrib;
+ %common.attrib;
+ %footnoteref.role.attrib;
+ %local.footnoteref.attrib;
+>
+<!ENTITY % local.xref.attrib "">
+<!ENTITY % xref.role.attrib "%role.attrib;">
+<!ELEMENT xref EMPTY>
+<!ATTLIST xref
+ endterm IDREF #IMPLIED
+ %linkendreq.attrib; %common.attrib;
+ %xref.role.attrib;
+ %local.xref.attrib;
+>
+<!ENTITY % local.appendix.class "">
+<!ENTITY % appendix.class "appendix %local.appendix.class;">
+<!ENTITY % div.title.content
+ "title, subtitle?, titleabbrev?">
+<!ENTITY % bookcomponent.title.content
+ "title, subtitle?, titleabbrev?">
+<!ENTITY % sect.title.content
+ "title, subtitle?, titleabbrev?">
+<!ENTITY % local.appendix.attrib "">
+<!ENTITY % appendix.role.attrib "%role.attrib;">
+<!ATTLIST appendix
+ %label.attrib;
+ %status.attrib;
+ %common.attrib;
+ %appendix.role.attrib;
+ %local.appendix.attrib;
+>
+<!ENTITY % local.section.attrib "">
+<!ENTITY % section.role.attrib "%role.attrib;">
+<!ATTLIST section
+ %label.attrib;
+ %status.attrib;
+ %common.attrib;
+ %section.role.attrib;
+ %local.section.attrib;
+>
+<!ENTITY % local.bibliography.attrib "">
+<!ENTITY % bibliography.role.attrib "%role.attrib;">
+<!ATTLIST bibliography
+ %status.attrib;
+ %common.attrib;
+ %bibliography.role.attrib;
+ %local.bibliography.attrib;
+>
+<!ENTITY % local.bibliodiv.attrib "">
+<!ENTITY % bibliodiv.role.attrib "%role.attrib;">
+<!ATTLIST bibliodiv
+ %status.attrib;
+ %common.attrib;
+ %bibliodiv.role.attrib;
+ %local.bibliodiv.attrib;
+>
+<!ENTITY % local.article.attrib "">
+<!ENTITY % article.role.attrib "%role.attrib;">
+<!ATTLIST article
+ class (journalarticle
+ |productsheet
+ |whitepaper
+ |techreport
+ |specification
+ |faq) #IMPLIED
+ parentbook IDREF #IMPLIED
+ %status.attrib;
+ %common.attrib;
+ %article.role.attrib;
+ %local.article.attrib;
+>
+<!ELEMENT objectinfo ((mediaobject | legalnotice
+ | keywordset | subjectset | %bibliocomponent.mix;)+)>
+<!ELEMENT section (sectioninfo?,
+ (%sect.title.content;),
+ (((%divcomponent.mix;)+, section*)
+ | section+))>
+<!ELEMENT sectioninfo ((mediaobject | legalnotice
+ | keywordset | subjectset | %bibliocomponent.mix;)+)>
+<!ELEMENT authorgroup ((author|editor|corpauthor|othercredit)+)>
+<!ELEMENT affiliation (jobtitle?, orgname?)>
+<!ELEMENT para (%para.char.mix;)*>
+<!ELEMENT informaltable (mediaobject+|tgroup+) >
+<!ELEMENT replaceable (#PCDATA
+ | %link.char.class;
+ | inlinemediaobject)*>
+<!ELEMENT trademark (#PCDATA
+ | %link.char.class;
+ | %tech.char.class;
+ | inlinemediaobject
+ | emphasis)*>
+<!ELEMENT article ((%div.title.content;)?, articleinfo?,
+ (%bookcomponent.content;),
+ ((%appendix.class;)|bibliography)*)>
+<!ELEMENT articleinfo ((mediaobject | legalnotice
+ | subjectset | keywordset | %bibliocomponent.mix;)+)>
+<!ELEMENT appendix ((%bookcomponent.title.content;),
+ (%bookcomponent.content;))>
+<!ELEMENT bibliography ((%bookcomponent.title.content;)?,
+ (%component.mix;)*,
+ (bibliodiv+ | bibliomixed+))>
+<!ELEMENT bibliomixed (#PCDATA | %bibliocomponent.mix; | bibliomset)*>
+<!ELEMENT bibliodiv ((%sect.title.content;)?, (%component.mix;)*,
+ (bibliomixed)+)>
+<!ELEMENT sidebar ((%formalobject.title.content;)?,
+ (%sidebar.mix;)+)>
+<!ELEMENT programlisting (%para.char.mix; | lineannotation)*>
+<!ELEMENT literallayout (%para.char.mix; | lineannotation)*>
diff --git a/2005/flow-accounting-lt2005/ltpdk/xml/i18n.xml b/2005/flow-accounting-lt2005/ltpdk/xml/i18n.xml
new file mode 100644
index 0000000..be0890a
--- /dev/null
+++ b/2005/flow-accounting-lt2005/ltpdk/xml/i18n.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+ <i18n name="text.toc" value="Table of Contents"/>
+ <i18n name="text.lot" value="List of Tables"/>
+ <i18n name="text.warning" value="Warning:"/>
+ <i18n name="text.note" value="Note:"/>
+ <i18n name="text.caution" value="Caution:"/>
+ <i18n name="text.important" value="Important:"/>
+ <i18n name="text.tip" value="Tip:"/>
+ <i18n name="text.headline1" value="EUROPES LARGEST GNU/LINUX EXHIBITION AND CONFERENCE"/>
+ <i18n name="text.headline2" value="MESSE UND KONGRESSZENTRUM KARLSRUHE // 5. BIS 8. JUNI 2003"/>
+ <i18n name="text.quickmenu" value="Quickmenu"/>
+</xsl:stylesheet>
diff --git a/2005/flow-accounting-lt2005/short_abstract b/2005/flow-accounting-lt2005/short_abstract
new file mode 100644
index 0000000..153b4c6
--- /dev/null
+++ b/2005/flow-accounting-lt2005/short_abstract
@@ -0,0 +1,7 @@
+Flow based network accounting with Linux
+
+Many networking scenarios require some form of network accounting that goes beyond some simple packet and byte counters as available from the 'ifconfig' output.
+
+The author has implemented an efficient approach, by which the accounting
+information is stored in the in-kernel connection tracking table of the
+ip_conntrack stateful firewall state machine.
personal git repositories of Harald Welte. Your mileage may vary