2#ifndef CLICK_BATCHELEMENT_HH
3#define CLICK_BATCHELEMENT_HH
4#include <click/glue.hh>
9#include <click/master.hh>
11#include <click/packet_anno.hh>
25class PushToPushBatchVisitor;
26class BatchModePropagate;
29class BatchElement :
public Element {
public:
35 click_chatter(
"Warning in %s : simple_action_batch should be implemented."
36 " This element is useless, batch will be returned untouched.",
name().c_str());
41 head = simple_action_batch(head);
43 output_push_batch(
port,head);
49 head = simple_action_batch(head);
59 output_push_batch(
port,batch);
70 _ports[1][
port].push(p);
93 input_pull_batch(
int port,
int max) {
106 BatchModePropagate() : ispush(true) {}
108 bool visit(
Element *e,
bool isoutput,
int,
115 class PushToPushBatchVisitor :
public RouterVisitor {
public:
117 PushToPushBatchVisitor(
Element* origin);
119 bool visit(
Element *,
bool,
int,
127#define BATCH_ELEMENT_DEFINE_SIMPLE_ACTION_BATCH(T) \
128 PacketBatch* simple_action_batch(PacketBatch* batch) override {\
129 EXECUTE_FOR_EACH_PACKET_DROPPABLE(T::simple_action,batch,[](Packet*){});\
134#define BATCH_ELEMENT_DEFINE_SIMPLE_ACTION_BATCH(T)
135class BatchElement :
public Element {
public:
136 inline void checked_output_push_batch(
int,
PacketBatch*) {
137 click_chatter(
"Error : checked_output_push_batch called without batching being enabled");
159template <
typename T,
typename Base = BatchElement>
163 Base::checked_output_push(
static_cast<T&
>(*this).classify(p),p);
168 CLASSIFY_EACH_PACKET(Base::noutputs() + 1,
static_cast<T&
>(*this).classify,batch,Base::checked_output_push_batch);
190 p =
static_cast<T&
>(*this).simple_action(p);
198 p =
static_cast<T&
>(*this).simple_action(p);
204 head =
static_cast<T&
>(*this).simple_action_batch(head);
206 output_push_batch(
port,head);
212 head =
static_cast<T&
>(*this).simple_action_batch(head);
240 p =
static_cast<T&
>(*this).simple_action(p);
248 p =
static_cast<T&
>(*this).simple_action(p);
254 head = _sm_action_batch(head);
262 head = _sm_action_batch(head);
270 EXECUTE_FOR_EACH_PACKET_DROPPABLE(
static_cast<T&
>(*this).simple_action, batch, [](
Packet*){});
Definition batchelement.hh:160
void push(int, Packet *p)
Push packet p onto push input port.
Definition batchelement.hh:162
Packet * pull() const
Pull a packet over this port and return it.
Definition element.hh:841
void push(Packet *p) const
Push packet p over this port.
Definition element.hh:765
Base class for Click elements.
Definition element.hh:42
const Port & port(bool isoutput, int port) const
Return one of the element's ports.
Definition element.hh:566
String name() const
Return the element's name.
Definition element.cc:555
enum batch_mode in_batch_mode
Definition element.hh:382
const Port & output(int port) const
Return one of the element's output ports.
Definition element.hh:591
int noutputs() const
Return the number of output ports.
Definition element.hh:555
const Port & input(int port) const
Return one of the element's input ports.
Definition element.hh:579
void checked_output_push(int port, Packet *p) const
Push packet p to output port, or kill it if port is out of range.
Definition element.hh:1031
Definition packetbatch.hh:415
static PacketBatch * make_from_packet(Packet *p)
Definition packetbatch.hh:664
A network packet.
Definition packet.hh:68
void kill()
Delete this packet.
Definition packet.hh:1804
A router configuration.
Definition router.hh:28
Base class for router configuration visitors.
Definition routervisitor.hh:17
Definition batchelement.hh:187
void push(int port, Packet *p) override
Push packet p onto push input port.
Definition batchelement.hh:189
Packet * pull(int port) override
Pull a packet from pull output port.
Definition batchelement.hh:195
Definition batchelement.hh:237
Packet * pull(int port) override
Pull a packet from pull output port.
Definition batchelement.hh:245
void push(int port, Packet *p) override
Push packet p onto push input port.
Definition batchelement.hh:239
The Handler class for router handlers.
The Packet class models packets in Click.
Router configuration visitors for finding elements and ports.
Click's vector container template.