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