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
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -43,11 +43,16 @@ struct IPv4Multicast {
|
||||
|
||||
template<typename AddressType>
|
||||
class AddressSet {
|
||||
public:
|
||||
struct ContainedAddress : DoublyLinkedListLinkImpl<ContainedAddress> {
|
||||
AddressType address;
|
||||
};
|
||||
|
||||
typedef DoublyLinkedList<ContainedAddress> 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<ContainedAddress> 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<ThisType> HashLink;
|
||||
typedef typename Addressing::AddressType AddressType;
|
||||
typedef MulticastFilter<Addressing> Filter;
|
||||
typedef AddressSet<AddressType> 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<AddressType> fAddresses;
|
||||
AddressSet fAddresses;
|
||||
HashLink fLink;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user