83cbd279 |
1 | /** @file\r |
2 | \r |
1f6729ff |
3 | Copyright (c) 2005 - 2015, Intel Corporation. All rights reserved.<BR>\r |
e5eed7d3 |
4 | This program and the accompanying materials\r |
83cbd279 |
5 | are licensed and made available under the terms and conditions of the BSD License\r |
6 | which accompanies this distribution. The full text of the license may be found at\r |
7 | http://opensource.org/licenses/bsd-license.php\r |
8 | \r |
9 | THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r |
10 | WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r |
11 | \r |
83cbd279 |
12 | **/\r |
13 | \r |
14 | #ifndef __EFI_IP4_IGMP_H__\r |
15 | #define __EFI_IP4_IGMP_H__\r |
16 | \r |
f6b7393c |
17 | //\r |
18 | // IGMP message type\r |
19 | //\r |
20 | #define IGMP_MEMBERSHIP_QUERY 0x11\r |
21 | #define IGMP_V1_MEMBERSHIP_REPORT 0x12\r |
22 | #define IGMP_V2_MEMBERSHIP_REPORT 0x16\r |
23 | #define IGMP_LEAVE_GROUP 0x17\r |
24 | \r |
25 | #define IGMP_V1ROUTER_PRESENT 400\r |
26 | #define IGMP_UNSOLICIATED_REPORT 10\r |
27 | \r |
83cbd279 |
28 | #pragma pack(1)\r |
29 | typedef struct {\r |
30 | UINT8 Type;\r |
31 | UINT8 MaxRespTime;\r |
32 | UINT16 Checksum;\r |
33 | IP4_ADDR Group;\r |
34 | } IGMP_HEAD;\r |
35 | #pragma pack()\r |
36 | \r |
96e1079f |
37 | ///\r |
38 | /// The status of multicast group. It isn't necessary to maintain\r |
39 | /// explicit state of host state diagram. A group with non-zero\r |
40 | /// DelayTime is in "delaying member" state. otherwise, it is in\r |
41 | /// "idle member" state.\r |
42 | ///\r |
83cbd279 |
43 | typedef struct {\r |
e48e37fc |
44 | LIST_ENTRY Link;\r |
83cbd279 |
45 | INTN RefCnt;\r |
46 | IP4_ADDR Address;\r |
47 | INTN DelayTime;\r |
48 | BOOLEAN ReportByUs;\r |
49 | EFI_MAC_ADDRESS Mac;\r |
50 | } IGMP_GROUP;\r |
51 | \r |
96e1079f |
52 | ///\r |
53 | /// The IGMP status. Each IP4 service instance has a IGMP_SERVICE_DATA\r |
54 | /// attached. The Igmpv1QuerySeen remember whether the server on this\r |
55 | /// connected network is v1 or v2.\r |
56 | ///\r |
83cbd279 |
57 | typedef struct {\r |
58 | INTN Igmpv1QuerySeen;\r |
e48e37fc |
59 | LIST_ENTRY Groups;\r |
83cbd279 |
60 | } IGMP_SERVICE_DATA;\r |
61 | \r |
2ff29212 |
62 | /**\r |
63 | Init the IGMP control data of the IP4 service instance, configure\r |
64 | MNP to receive ALL SYSTEM multicast.\r |
65 | \r |
3e8c18da |
66 | @param[in, out] IpSb The IP4 service whose IGMP is to be initialized.\r |
2ff29212 |
67 | \r |
68 | @retval EFI_SUCCESS IGMP of the IpSb is successfully initialized.\r |
69 | @retval EFI_OUT_OF_RESOURCES Failed to allocate resource to initialize IGMP.\r |
70 | @retval Others Failed to initialize the IGMP of IpSb.\r |
71 | \r |
72 | **/\r |
83cbd279 |
73 | EFI_STATUS\r |
74 | Ip4InitIgmp (\r |
2ff29212 |
75 | IN OUT IP4_SERVICE *IpSb\r |
83cbd279 |
76 | );\r |
77 | \r |
2ff29212 |
78 | /**\r |
79 | Join the multicast group on behalf of this IP4 child\r |
80 | \r |
1f6729ff |
81 | @param[in] IpInstance The IP4 child that wants to join the group.\r |
82 | @param[in] Address The group to join.\r |
2ff29212 |
83 | \r |
1f6729ff |
84 | @retval EFI_SUCCESS Successfully join the multicast group.\r |
85 | @retval EFI_OUT_OF_RESOURCES Failed to allocate resources.\r |
2ff29212 |
86 | @retval Others Failed to join the multicast group.\r |
87 | \r |
88 | **/\r |
83cbd279 |
89 | EFI_STATUS\r |
90 | Ip4JoinGroup (\r |
2ff29212 |
91 | IN IP4_PROTOCOL *IpInstance,\r |
92 | IN IP4_ADDR Address\r |
83cbd279 |
93 | );\r |
94 | \r |
2ff29212 |
95 | /**\r |
96 | Leave the IP4 multicast group on behalf of IpInstance.\r |
97 | \r |
3e8c18da |
98 | @param[in] IpInstance The IP4 child that wants to leave the group\r |
1f6729ff |
99 | address.\r |
100 | @param[in] Address The group address to leave.\r |
2ff29212 |
101 | \r |
1f6729ff |
102 | @retval EFI_NOT_FOUND The IP4 service instance isn't in the group.\r |
2ff29212 |
103 | @retval EFI_SUCCESS Successfully leave the multicast group.\r |
104 | @retval Others Failed to leave the multicast group.\r |
105 | \r |
106 | **/\r |
83cbd279 |
107 | EFI_STATUS\r |
108 | Ip4LeaveGroup (\r |
2ff29212 |
109 | IN IP4_PROTOCOL *IpInstance,\r |
110 | IN IP4_ADDR Address\r |
83cbd279 |
111 | );\r |
112 | \r |
2ff29212 |
113 | /**\r |
114 | Handle the received IGMP message for the IP4 service instance.\r |
115 | \r |
1f6729ff |
116 | @param[in] IpSb The IP4 service instance that received the message.\r |
117 | @param[in] Head The IP4 header of the received message.\r |
118 | @param[in] Packet The IGMP message, without IP4 header.\r |
2ff29212 |
119 | \r |
120 | @retval EFI_INVALID_PARAMETER The IGMP message is malformated.\r |
121 | @retval EFI_SUCCESS The IGMP message is successfully processed.\r |
122 | \r |
123 | **/\r |
83cbd279 |
124 | EFI_STATUS\r |
125 | Ip4IgmpHandle (\r |
2ff29212 |
126 | IN IP4_SERVICE *IpSb,\r |
127 | IN IP4_HEAD *Head,\r |
128 | IN NET_BUF *Packet\r |
83cbd279 |
129 | );\r |
130 | \r |
2ff29212 |
131 | /**\r |
132 | The periodical timer function for IGMP. It does the following\r |
133 | things:\r |
134 | 1. Decrease the Igmpv1QuerySeen to make it possible to refresh\r |
135 | the IGMP server type.\r |
136 | 2. Decrease the report timer for each IGMP group in "delaying\r |
137 | member" state.\r |
138 | \r |
1f6729ff |
139 | @param[in] IpSb The IP4 service instance that is ticking.\r |
2ff29212 |
140 | \r |
141 | **/\r |
83cbd279 |
142 | VOID\r |
143 | Ip4IgmpTicking (\r |
2ff29212 |
144 | IN IP4_SERVICE *IpSb\r |
83cbd279 |
145 | );\r |
146 | \r |
2ff29212 |
147 | /**\r |
148 | Add a group address to the array of group addresses.\r |
149 | The caller should make sure that no duplicated address\r |
150 | existed in the array. Although the function doesn't\r |
151 | assume the byte order of the both Source and Addr, the\r |
152 | network byte order is used by the caller.\r |
153 | \r |
1f6729ff |
154 | @param[in] Source The array of group addresses to add to.\r |
155 | @param[in] Count The number of group addresses in the Source.\r |
156 | @param[in] Addr The IP4 multicast address to add.\r |
2ff29212 |
157 | \r |
158 | @return NULL if failed to allocate memory for the new groups,\r |
159 | otherwise the new combined group addresses.\r |
160 | \r |
161 | **/\r |
83cbd279 |
162 | IP4_ADDR *\r |
163 | Ip4CombineGroups (\r |
2ff29212 |
164 | IN IP4_ADDR *Source,\r |
165 | IN UINT32 Count,\r |
166 | IN IP4_ADDR Addr\r |
83cbd279 |
167 | );\r |
168 | \r |
2ff29212 |
169 | /**\r |
170 | Remove a group address from the array of group addresses.\r |
171 | Although the function doesn't assume the byte order of the\r |
172 | both Groups and Addr, the network byte order is used by\r |
173 | the caller.\r |
174 | \r |
1f6729ff |
175 | @param Groups The array of group addresses to remove from.\r |
176 | @param Count The number of group addresses in the Groups.\r |
177 | @param Addr The IP4 multicast address to remove.\r |
2ff29212 |
178 | \r |
179 | @return The nubmer of group addresses in the Groups after remove.\r |
180 | It is Count if the Addr isn't in the Groups.\r |
181 | \r |
182 | **/\r |
83cbd279 |
183 | INTN\r |
184 | Ip4RemoveGroupAddr (\r |
2ff29212 |
185 | IN OUT IP4_ADDR *Groups,\r |
186 | IN UINT32 Count,\r |
187 | IN IP4_ADDR Addr\r |
83cbd279 |
188 | );\r |
189 | \r |
2ff29212 |
190 | /**\r |
191 | Find the IGMP_GROUP structure which contains the status of multicast\r |
192 | group Address in this IGMP control block\r |
193 | \r |
1f6729ff |
194 | @param[in] IgmpCtrl The IGMP control block to search from.\r |
195 | @param[in] Address The multicast address to search.\r |
2ff29212 |
196 | \r |
197 | @return NULL if the multicast address isn't in the IGMP control block. Otherwise\r |
198 | the point to the IGMP_GROUP which contains the status of multicast group\r |
199 | for Address.\r |
200 | \r |
201 | **/\r |
83cbd279 |
202 | IGMP_GROUP *\r |
203 | Ip4FindGroup (\r |
2ff29212 |
204 | IN IGMP_SERVICE_DATA *IgmpCtrl,\r |
205 | IN IP4_ADDR Address\r |
83cbd279 |
206 | );\r |
207 | #endif\r |