]> git.vomp.tv Git - vompserver.git/blob - udpreplier.c
IPv6 support for discovery protocol
[vompserver.git] / udpreplier.c
1 /*
2     Copyright 2004-2005 Chris Tallon
3
4     This file is part of VOMP.
5
6     VOMP is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     VOMP is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with VOMP; if not, write to the Free Software
18     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19 */
20
21 #include "vompclientrrproc.h"
22
23 #include "udpreplier.h"
24
25 UDPReplier::UDPReplier()
26 {
27   message = NULL;
28   messageLen = 0;
29 }
30
31 UDPReplier::~UDPReplier()
32 {
33   shutdown();
34 }
35
36 int UDPReplier::shutdown()
37 {
38   if (threadIsActive()) threadCancel();
39
40   if (message) delete[] message;
41   message = NULL;
42   return 1;
43 }
44
45 int UDPReplier::run(USHORT port, char* serverName, USHORT serverPort)
46 {
47   if (threadIsActive()) return 1;
48
49   /*
50   VOMP Discovery Protocol V1
51
52   Client transmits: "VDP-0001\0<6-byte MAC>"...
53   ... for IPv4: broadcasts on ports 51051-51055
54   ... for IPv6: multicasts to ff15:766f:6d70:2064:6973:636f:7665:7279 port 51051
55
56   Server responds:
57
58   Field 1 p0: 9 bytes "VDP-0002\0"
59
60   Field 2 p9, 1 byte:
61
62   0 = no IP specified
63   4 = first 4 bytes of field 3 are IPv4 address of server
64   6 = field 3 16 bytes are IPv6 address of server
65
66   Field 3, p10, 16 bytes:
67   As described above. If field 2 is 0, this should be all zeros. If this is an IPv4 address, remaining bytes should be zeros.
68
69   Field 4 p26, 2 bytes:
70   Port number of server
71
72   Field 5 p28, 4 bytes:
73   VOMP protocol version (defined in vdr.cc)
74
75   Field 6 p32, variable length
76   String of server name, null terminated
77   */
78   
79   messageLen = strlen(serverName) + 33;
80   message = new char[messageLen];
81   memset(message, 0, messageLen);
82   // by zeroing the packet, this sets no ip address return information
83   
84   strcpy(message, "VDP-0002");
85   
86   USHORT temp = htons(serverPort);
87   memcpy(&message[26], &temp, 2);
88   
89   ULONG temp2 = htonl(VompClientRRProc::getProtocolVersionMin());
90   memcpy(&message[28], &temp2, 4);
91   
92   strcpy(&message[32], serverName);
93   // Fix Me add also the maximum version somewhere
94   if (!ds.init(port))
95   {
96     shutdown();
97     return 0;
98   }
99
100   if (!threadStart())
101   {
102     shutdown();
103     return 0;
104   }
105
106   Log::getInstance()->log("UDPReplier", Log::DEBUG, "UDP replier started");
107   return 1;
108 }
109
110 void UDPReplier::threadMethod()
111 {
112   int retval;
113   while(1)
114   {
115     retval = ds.waitforMessage(0);
116     if (retval == 1) continue;
117
118     if (!strncmp(ds.getData(), "VDP-0001", 8))
119     {
120       Log::getInstance()->log("UDPReplier", Log::DEBUG, "UDP request from %s", ds.getFromIPA());
121       ds.send(ds.getFromIPA(), ds.getFromPort(), message, messageLen);
122     }
123   }
124 }