/** @file | |
Multicast Listener Discovery support routines. | |
Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR> | |
This program and the accompanying materials | |
are licensed and made available under the terms and conditions of the BSD License | |
which accompanies this distribution. The full text of the license may be found at | |
http://opensource.org/licenses/bsd-license.php. | |
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
**/ | |
#ifndef __EFI_IP6_MLD_H__ | |
#define __EFI_IP6_MLD_H__ | |
#define IP6_UNSOLICITED_REPORT_INTERVAL 10 | |
#pragma pack(1) | |
typedef struct { | |
IP6_ICMP_HEAD Head; | |
UINT16 MaxRespDelay; | |
UINT16 Reserved; | |
EFI_IPv6_ADDRESS Group; | |
} IP6_MLD_HEAD; | |
#pragma pack() | |
// | |
// The status of multicast group. It isn't necessary to maintain | |
// explicit state of host state diagram. A group with finity | |
// DelayTime (less than 0xffffffff) is in "delaying listener" state. otherwise, it is in | |
// "idle listener" state. | |
// | |
typedef struct { | |
LIST_ENTRY Link; | |
INTN RefCnt; | |
EFI_IPv6_ADDRESS Address; | |
UINT32 DelayTimer; | |
BOOLEAN SendByUs; | |
EFI_MAC_ADDRESS Mac; | |
} IP6_MLD_GROUP; | |
// | |
// The MLD status. Each IP6 service instance has a MLD_SERVICE_DATA | |
// attached. The Mldv1QuerySeen remember whether the server on this | |
// connected network is v1 or v2. | |
// | |
typedef struct { | |
INTN Mldv1QuerySeen; | |
LIST_ENTRY Groups; | |
} IP6_MLD_SERVICE_DATA; | |
/** | |
Search a IP6_MLD_GROUP list entry node from a list array. | |
@param[in] IpSb Points to an IP6 service binding instance. | |
@param[in] MulticastAddr The IPv6 multicast address to be searched. | |
@return The found IP6_ML_GROUP list entry or NULL. | |
**/ | |
IP6_MLD_GROUP * | |
Ip6FindMldEntry ( | |
IN IP6_SERVICE *IpSb, | |
IN EFI_IPv6_ADDRESS *MulticastAddr | |
); | |
/** | |
Init the MLD data of the IP6 service instance, configure | |
MNP to receive ALL SYSTEM multicasts. | |
@param[in] IpSb The IP6 service whose MLD is to be initialized. | |
@retval EFI_OUT_OF_RESOURCES There are not sufficient resources to complete the | |
operation. | |
@retval EFI_SUCCESS The MLD module successfully initialized. | |
**/ | |
EFI_STATUS | |
Ip6InitMld ( | |
IN IP6_SERVICE *IpSb | |
); | |
/** | |
Join the multicast group on behalf of this IP6 service binding instance. | |
@param[in] IpSb The IP6 service binding instance. | |
@param[in] Interface Points to an IP6_INTERFACE structure. | |
@param[in] Address The group address to join. | |
@retval EFI_SUCCESS Successfully joined the multicast group. | |
@retval EFI_OUT_OF_RESOURCES Failed to allocate resources. | |
@retval Others Failed to join the multicast group. | |
**/ | |
EFI_STATUS | |
Ip6JoinGroup ( | |
IN IP6_SERVICE *IpSb, | |
IN IP6_INTERFACE *Interface, | |
IN EFI_IPv6_ADDRESS *Address | |
); | |
/** | |
Leave the IP6 multicast group. | |
@param[in] IpSb The IP6 service binding instance. | |
@param[in] Address The group address to leave. | |
@retval EFI_NOT_FOUND The IP6 service instance isn't in the group. | |
@retval EFI_SUCCESS Successfully left the multicast group. | |
@retval Others Failed to leave the multicast group. | |
**/ | |
EFI_STATUS | |
Ip6LeaveGroup ( | |
IN IP6_SERVICE *IpSb, | |
IN EFI_IPv6_ADDRESS *Address | |
); | |
/** | |
Worker function for EfiIp6Groups(). The caller | |
should verify that the parameters are valid. | |
@param[in] IpInstance The IP6 child to change the setting. | |
@param[in] JoinFlag TRUE to join the group, otherwise leave it. | |
@param[in] GroupAddress The target group address. If NULL, leave all | |
the group addresses. | |
@retval EFI_ALREADY_STARTED Wants to join the group, but is already a member of it. | |
@retval EFI_OUT_OF_RESOURCES Failed to allocate some resources. | |
@retval EFI_DEVICE_ERROR Failed to set the group configuraton. | |
@retval EFI_SUCCESS Successfully updated the group setting. | |
@retval EFI_NOT_FOUND Tried to leave a group of whom it isn't a member. | |
**/ | |
EFI_STATUS | |
Ip6Groups ( | |
IN IP6_PROTOCOL *IpInstance, | |
IN BOOLEAN JoinFlag, | |
IN EFI_IPv6_ADDRESS *GroupAddress OPTIONAL | |
); | |
/** | |
Process the Multicast Listener Query message. | |
@param[in] IpSb The IP service that received the packet. | |
@param[in] Head The IP head of the MLD query packet. | |
@param[in] Packet The content of the MLD query packet with IP head | |
removed. | |
@retval EFI_SUCCESS The MLD query packet processed successfully. | |
@retval EFI_INVALID_PARAMETER The packet is invalid. | |
@retval Others Failed to process the packet. | |
**/ | |
EFI_STATUS | |
Ip6ProcessMldQuery ( | |
IN IP6_SERVICE *IpSb, | |
IN EFI_IP6_HEADER *Head, | |
IN NET_BUF *Packet | |
); | |
/** | |
Process the Multicast Listener Report message. | |
@param[in] IpSb The IP service that received the packet. | |
@param[in] Head The IP head of the MLD report packet. | |
@param[in] Packet The content of the MLD report packet with IP head | |
removed. | |
@retval EFI_SUCCESS The MLD report packet processed successfully. | |
@retval EFI_INVALID_PARAMETER The packet is invalid. | |
**/ | |
EFI_STATUS | |
Ip6ProcessMldReport ( | |
IN IP6_SERVICE *IpSb, | |
IN EFI_IP6_HEADER *Head, | |
IN NET_BUF *Packet | |
); | |
/** | |
The heartbeat timer of the MLD module. It sends out solicited MLD report when | |
DelayTimer expires. | |
@param[in] IpSb The IP6 service binding instance. | |
**/ | |
VOID | |
Ip6MldTimerTicking ( | |
IN IP6_SERVICE *IpSb | |
); | |
#endif | |