summaryrefslogtreecommitdiff
path: root/server/componentIGMP.h
blob: d870b648fe364e927c3447ebb467e65432d04b9f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/*
 *  $Id: componentIGMP.h,v 1.1 2009/02/13 10:39:22 schmirl Exp $
 */
 
#ifndef VDR_STREAMDEV_IGMPSERVER_H
#define VDR_STREAMDEV_IGMPSERVER_H

#include <sys/time.h>
#include <time.h>
#include <vdr/thread.h>
#include "server/component.h"
#include "../common.h"

class cMulticastGroup;

class cComponentIGMP: public cServerComponent, public cThread {
private:
	char m_ReadBuffer[2048];
	cList<cMulticastGroup> m_Groups;
	in_addr_t m_BindIp;
	int m_MaxChannelNumber;
	struct timeval m_GeneralQueryTimer;
	int m_StartupQueryCount;
	bool m_Querier;
	cCondWait m_CondWait;

#if APIVERSNUM >= 20300
	cMulticastGroup* FindGroup(in_addr_t Group);
#else
	cMulticastGroup* FindGroup(in_addr_t Group) const;
#endif

	/* Add or remove local host to multicast group */
	bool IGMPMembership(in_addr_t Group, bool Add = true);
	void IGMPSendQuery(in_addr_t Group, int Timeout);

	cServerConnection* ProcessMessage(struct igmp *Igmp, in_addr_t Group, in_addr_t Sender);

	void IGMPStartGeneralQueryTimer();
	void IGMPStartOtherQuerierPresentTimer();
	void IGMPSendGeneralQuery();

	void IGMPStartTimer(cMulticastGroup* Group, in_addr_t Member);
	void IGMPStartV1HostTimer(cMulticastGroup* Group);
	void IGMPStartTimerAfterLeave(cMulticastGroup* Group, unsigned int MaxResponseTime);
	void IGMPStartRetransmitTimer(cMulticastGroup* Group);
	void IGMPClearRetransmitTimer(cMulticastGroup* Group);
	void IGMPSendGroupQuery(cMulticastGroup* Group);
	cServerConnection* IGMPStartMulticast(cMulticastGroup* Group);
	void IGMPStopMulticast(cMulticastGroup* Group);

	virtual void Action();

protected:
	virtual cServerConnection *NewClient(void);

public:
	virtual bool Initialize(void);
	virtual void Destruct(void);
	virtual cServerConnection* Accept(void);

	cComponentIGMP(void);
	~cComponentIGMP(void);
};

#endif // VDR_STREAMDEV_IGMPSERVER_H