4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 // Competence Center NETwork research (NET), St. Augustin, GERMANY
6 // Stefan Bund <g0dil@berlios.de>
8 // This program is free software; you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation; either version 2 of the License, or
11 // (at your option) any later version.
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 // GNU General Public License for more details.
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the
20 // Free Software Foundation, Inc.,
21 // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24 \brief AnnotationRouter public header */
26 #ifndef HH_SENF_PPI_AnnotationRouter_
27 #define HH_SENF_PPI_AnnotationRouter_ 1
30 #include <boost/ptr_container/ptr_map.hpp>
32 #include "Connectors.hh"
34 //#include "AnnotationRouter.mpp"
35 ///////////////////////////////hh.p////////////////////////////////////////
41 /** \brief Route packets to destination according to some annotation value
43 This router takes packet on a single input and directs them to one of it outputs depending
44 on a \link packet_usage_annotation packet annotation\endlink. Each output connected
45 will be associated with a single annotation value. Incoming packets for which no matching
46 output is found are directed to a default output. If this output is left unconnected, those
47 packets will be dropped.
49 The \a AnnotationType template parameter defines the routing key. This annotation must
50 support the following operations:
51 \li Comparison with '<'
53 \li Output streaming to an ostream via '<<'
55 The following annotation can be used to route the packets according to a mac address.
57 struct TargetInterface
61 bool operator< (TargetInterface const & other)
62 { return mac < other.mac; }
64 TargetInterface(senf::MACAddress const & m)
68 std::ostream & operator<<(std::ostream & os, TargetInterface const & v)
69 { os << v.mac; return os; }
72 The additional senf::MACAddress constructor allows to construct an instance directly from a
73 mac address and allows to pass a senf::MACAddress value as routing key directly:
76 senf::ppi::module::AnnotationRouter router;
78 senf::ppi::connect(router, target1, senf::MACAddress::from_string("00:1a:2b:04:06:08"));
81 The special senf::ppi::connect() overload takes a third argument, the routing key. This must
82 be an AnnotationType value or must be (explicitly) convertible to AnnotationType.
84 The input will be throttled whenever any of the outputs except \a defaultOutput are
87 \ingroup routing_modules
89 \todo Call Module::v_init() on every connection change and remove disconnected connections
92 template <class AnnotationType>
93 class AnnotationRouter : public Module
95 SENF_PPI_MODULE(AnnotationRouter);
97 connector::PassiveInput<> input;
98 connector::ActiveOutput<> defaultOutput;
102 struct DuplicateKeyException : public senf::Exception
103 { DuplicateKeyException(AnnotationType const & key)
104 : senf::Exception("Duplicate senf::ppi::module::AnnotationRouter routing key ")
105 { append(boost::lexical_cast<std::string>(key)); } };
108 connector::ActiveOutput<> & newOutput(AnnotationType const & key);
111 // I didn't get template friend functions to work ...
114 template <class Target>
115 connector::GenericActiveOutput & connect(Target & target, AnnotationType const & key);
120 typedef boost::ptr_map<AnnotationType, connector::ActiveOutput<> > Outputs;
128 template <class Target, class AnnotationType, class ArgType>
129 connector::GenericActiveOutput & connect(
130 module::AnnotationRouter<AnnotationType> & source, Target & target,
131 ArgType const & key);
137 ///////////////////////////////hh.e////////////////////////////////////////
138 //#include "AnnotationRouter.cci"
139 #include "AnnotationRouter.ct"
140 #include "AnnotationRouter.cti"
147 // comment-column: 40
148 // c-file-style: "senf"
149 // indent-tabs-mode: nil
150 // ispell-local-dictionary: "american"
151 // compile-command: "scons -u test"