From ab7e05a39ba3901dbde96b19b70ed1414513111e Mon Sep 17 00:00:00 2001 From: Hugo Santos Date: Wed, 2 May 2007 12:40:50 +0000 Subject: [PATCH] also dump filter mode and sources in 'ipv4_multicast'. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20966 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../kernel/network/protocols/ipv4/ipv4.cpp | 18 +++++++++-- .../kernel/network/protocols/ipv4/multicast.h | 30 ++++++++++++++++--- 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/src/add-ons/kernel/network/protocols/ipv4/ipv4.cpp b/src/add-ons/kernel/network/protocols/ipv4/ipv4.cpp index 9fdf1eca74..dd19b910b1 100644 --- a/src/add-ons/kernel/network/protocols/ipv4/ipv4.cpp +++ b/src/add-ons/kernel/network/protocols/ipv4/ipv4.cpp @@ -1554,9 +1554,21 @@ dump_ipv4_multicast(int argc, char *argv[]) char addrBuf[64]; - kprintf("%p: group <%s, %s> sock %p\n", state, - state->Interface()->name, print_address(&state->Address(), - addrBuf, sizeof(addrBuf)), state->Parent()->Socket()); + kprintf("%p: group <%s, %s, %s {", state, state->Interface()->name, + print_address(&state->Address(), addrBuf, sizeof(addrBuf)), + state->Mode() == IPv4GroupInterface::kExclude ? "Exclude" : + "Include"); + + int count = 0; + IPv4GroupInterface::AddressSet::Iterator it = + state->Sources().GetIterator(); + while (it.HasNext()) { + kprintf("%s%s", count > 0 ? ", " : "", print_address(&it.Next(), + addrBuf, sizeof(addrBuf))); + count++; + } + + kprintf("}> sock %p\n", state->Parent()->Socket()); } return 0; diff --git a/src/add-ons/kernel/network/protocols/ipv4/multicast.h b/src/add-ons/kernel/network/protocols/ipv4/multicast.h index 2c252e46f8..5a2e799c93 100644 --- a/src/add-ons/kernel/network/protocols/ipv4/multicast.h +++ b/src/add-ons/kernel/network/protocols/ipv4/multicast.h @@ -43,11 +43,16 @@ struct IPv4Multicast { template class AddressSet { -public: struct ContainedAddress : DoublyLinkedListLinkImpl { AddressType address; }; + typedef DoublyLinkedList AddressList; + +public: + AddressSet() + : fCount(0) {} + ~AddressSet() { Clear(); } status_t Add(const AddressType &address) @@ -88,9 +93,21 @@ public: Remove(fAddresses.Head()->address); } -private: - typedef DoublyLinkedList AddressList; + class Iterator { + public: + Iterator(const AddressList &addresses) + : fBaseIterator(addresses.GetIterator()) {} + bool HasNext() const { return fBaseIterator.HasNext(); } + AddressType &Next() { return fBaseIterator.Next()->address; } + + private: + typename AddressList::ConstIterator fBaseIterator; + }; + + Iterator GetIterator() const { return Iterator(fAddresses); } + +private: ContainedAddress *_Get(const AddressType &address) const { typename AddressList::ConstIterator it = fAddresses.GetIterator(); @@ -103,6 +120,7 @@ private: } AddressList fAddresses; + int fCount; }; @@ -114,6 +132,7 @@ public: typedef HashTableLink HashLink; typedef typename Addressing::AddressType AddressType; typedef MulticastFilter Filter; + typedef AddressSet AddressSet; enum FilterMode { kInclude, @@ -139,6 +158,9 @@ public: bool IsEmpty() const; void Clear(); + FilterMode Mode() const { return fFilterMode; } + const AddressSet &Sources() const { return fAddresses; } + bool FilterAccepts(net_buffer *buffer) const; struct HashDefinition { @@ -165,7 +187,7 @@ private: AddressType fMulticastAddress; net_interface *fInterface; FilterMode fFilterMode; - AddressSet fAddresses; + AddressSet fAddresses; HashLink fLink; };