git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10986 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			199 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			199 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @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
 | |
| 
 |