1 /** @file
2   Multicast Listener Discovery support routines.
3 
4   Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>
5 
6   This program and the accompanying materials
7   are licensed and made available under the terms and conditions of the BSD License
8   which accompanies this distribution.  The full text of the license may be found at
9   http://opensource.org/licenses/bsd-license.php.
10 
11   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13 
14 **/
15 
16 #ifndef __EFI_IP6_MLD_H__
17 #define __EFI_IP6_MLD_H__
18 
19 #define IP6_UNSOLICITED_REPORT_INTERVAL 10
20 
21 #pragma pack(1)
22 typedef struct {
23   IP6_ICMP_HEAD           Head;
24   UINT16                  MaxRespDelay;
25   UINT16                  Reserved;
26   EFI_IPv6_ADDRESS        Group;
27 } IP6_MLD_HEAD;
28 #pragma pack()
29 
30 //
31 // The status of multicast group. It isn't necessary to maintain
32 // explicit state of host state diagram. A group with finity
33 // DelayTime (less than 0xffffffff) is in "delaying listener" state. otherwise, it is in
34 // "idle listener" state.
35 //
36 typedef struct {
37   LIST_ENTRY              Link;
38   INTN                    RefCnt;
39   EFI_IPv6_ADDRESS        Address;
40   UINT32                  DelayTimer;
41   BOOLEAN                 SendByUs;
42   EFI_MAC_ADDRESS         Mac;
43 } IP6_MLD_GROUP;
44 
45 //
46 // The MLD status. Each IP6 service instance has a MLD_SERVICE_DATA
47 // attached. The Mldv1QuerySeen remember whether the server on this
48 // connected network is v1 or v2.
49 //
50 typedef struct {
51   INTN                    Mldv1QuerySeen;
52   LIST_ENTRY              Groups;
53 } IP6_MLD_SERVICE_DATA;
54 
55 /**
56   Search a IP6_MLD_GROUP list entry node from a list array.
57 
58   @param[in]       IpSb          Points to an IP6 service binding instance.
59   @param[in]       MulticastAddr The IPv6 multicast address to be searched.
60 
61   @return The found IP6_ML_GROUP list entry or NULL.
62 
63 **/
64 IP6_MLD_GROUP *
65 Ip6FindMldEntry (
66   IN IP6_SERVICE            *IpSb,
67   IN EFI_IPv6_ADDRESS       *MulticastAddr
68   );
69 
70 /**
71   Init the MLD data of the IP6 service instance, configure
72   MNP to receive ALL SYSTEM multicasts.
73 
74   @param[in]  IpSb              The IP6 service whose MLD is to be initialized.
75 
76   @retval EFI_OUT_OF_RESOURCES  There are not sufficient resources to complete the
77                                 operation.
78   @retval EFI_SUCCESS           The MLD module successfully initialized.
79 
80 **/
81 EFI_STATUS
82 Ip6InitMld (
83   IN IP6_SERVICE            *IpSb
84   );
85 
86 /**
87   Join the multicast group on behalf of this IP6 service binding instance.
88 
89   @param[in]  IpSb               The IP6 service binding instance.
90   @param[in]  Interface          Points to an IP6_INTERFACE structure.
91   @param[in]  Address            The group address to join.
92 
93   @retval EFI_SUCCESS            Successfully joined the multicast group.
94   @retval EFI_OUT_OF_RESOURCES   Failed to allocate resources.
95   @retval Others                 Failed to join the multicast group.
96 
97 **/
98 EFI_STATUS
99 Ip6JoinGroup (
100   IN IP6_SERVICE            *IpSb,
101   IN IP6_INTERFACE          *Interface,
102   IN EFI_IPv6_ADDRESS       *Address
103   );
104 
105 /**
106   Leave the IP6 multicast group.
107 
108   @param[in]  IpSb               The IP6 service binding instance.
109   @param[in]  Address            The group address to leave.
110 
111   @retval EFI_NOT_FOUND          The IP6 service instance isn't in the group.
112   @retval EFI_SUCCESS            Successfully left the multicast group.
113   @retval Others                 Failed to leave the multicast group.
114 
115 **/
116 EFI_STATUS
117 Ip6LeaveGroup (
118  IN IP6_SERVICE            *IpSb,
119  IN EFI_IPv6_ADDRESS       *Address
120   );
121 
122 /**
123   Worker function for EfiIp6Groups(). The caller
124   should verify that the parameters are valid.
125 
126   @param[in]  IpInstance        The IP6 child to change the setting.
127   @param[in]  JoinFlag          TRUE to join the group, otherwise leave it.
128   @param[in]  GroupAddress      The target group address. If NULL, leave all
129                                 the group addresses.
130 
131   @retval EFI_ALREADY_STARTED   Wants to join the group, but is already a member of it.
132   @retval EFI_OUT_OF_RESOURCES  Failed to allocate some resources.
133   @retval EFI_DEVICE_ERROR      Failed to set the group configuraton.
134   @retval EFI_SUCCESS           Successfully updated the group setting.
135   @retval EFI_NOT_FOUND         Tried to leave a group of whom it isn't a member.
136 
137 **/
138 EFI_STATUS
139 Ip6Groups (
140   IN IP6_PROTOCOL           *IpInstance,
141   IN BOOLEAN                JoinFlag,
142   IN EFI_IPv6_ADDRESS       *GroupAddress       OPTIONAL
143   );
144 
145 /**
146   Process the Multicast Listener Query message.
147 
148   @param[in]  IpSb               The IP service that received the packet.
149   @param[in]  Head               The IP head of the MLD query packet.
150   @param[in]  Packet             The content of the MLD query packet with IP head
151                                  removed.
152 
153   @retval EFI_SUCCESS            The MLD query packet processed successfully.
154   @retval EFI_INVALID_PARAMETER  The packet is invalid.
155   @retval Others                 Failed to process the packet.
156 
157 **/
158 EFI_STATUS
159 Ip6ProcessMldQuery (
160   IN IP6_SERVICE            *IpSb,
161   IN EFI_IP6_HEADER         *Head,
162   IN NET_BUF                *Packet
163   );
164 
165 /**
166   Process the Multicast Listener Report message.
167 
168   @param[in]  IpSb               The IP service that received the packet.
169   @param[in]  Head               The IP head of the MLD report packet.
170   @param[in]  Packet             The content of the MLD report packet with IP head
171                                  removed.
172 
173   @retval EFI_SUCCESS            The MLD report packet processed successfully.
174   @retval EFI_INVALID_PARAMETER  The packet is invalid.
175 
176 **/
177 EFI_STATUS
178 Ip6ProcessMldReport (
179   IN IP6_SERVICE            *IpSb,
180   IN EFI_IP6_HEADER         *Head,
181   IN NET_BUF                *Packet
182   );
183 
184 
185 /**
186   The heartbeat timer of the MLD module. It sends out solicited MLD report when
187   DelayTimer expires.
188 
189   @param[in]  IpSb              The IP6 service binding instance.
190 
191 **/
192 VOID
193 Ip6MldTimerTicking (
194   IN IP6_SERVICE            *IpSb
195   );
196 
197 #endif
198 
199