The multicast classifier classifies packets according to both source and destination (group) addresses. It maintains a (chained hash) table mapping source/group pairs to slot numbers. When a packet arrives containing a source/group unknown to the classifier, it invokes an Otcl procedure []Node::new-group to add an entry to its table. This OTcl procedure may use the method set-hash to add new (source, group, slot) 3-tuples to the classifier's table. The multicast classifier is defined in ~ns/classifier-mcast.cc as follows:
static class MCastClassifierClass : public TclClass { public: MCastClassifierClass() : TclClass("Classifier/Multicast") {} TclObject* create(int argc, const char*const* argv) { return (new MCastClassifier()); } } class_mcast_classifier; class MCastClassifier : public Classifier { public: MCastClassifier(); ~MCastClassifier(); protected: int command(int argc, const char*const* argv); int classify(Packet *const p); int findslot(); void set_hash(nsaddr_t src, nsaddr_t dst, int slot); int hash(nsaddr_t src, nsaddr_t dst) const { u_int32_t s = src ^ dst; s ^= s \>\> 16; s ^= s \>\> 8; return (s & 0xff); } struct hashnode { int slot; nsaddr_t src; nsaddr_t dst; hashnode* next; }; hashnode* ht_[256]; const hashnode* lookup(nsaddr_t src, nsaddr_t dst) const; }; int MCastClassifier::classify(Packet *const pkt) { IPHeader *h = IPHeader::access(pkt-\>bits()); nsaddr_t src = h-\>src() \>\> 8; /*XXX*/ nsaddr_t dst = h-\>dst(); const hashnode* p = lookup(src, dst); if (p == 0) { /* * Didn't find an entry. * Call tcl exactly once to install one. * If tcl doesn't come through then fail. */ Tcl::instance().evalf("%s new-group %u %u", name(), src, dst); p = lookup(src, dst); if (p == 0) return (-1); } return (p-\>slot); }The MCastClassifier implements a chained hash table and applies a hash function on both the packet source and destination addresses. The hash function returns the slot number to index the slot_ table in the underlying object. A hash miss implies packet delivery to a previously-unknown group; OTcl is called to handle the situation. The OTcl code is expected to insert an appropriate entry into the hash table.