audk/NetworkPkg/Ip6Dxe/Ip6Mld.h

193 lines
5.8 KiB
C

/** @file
Multicast Listener Discovery support routines.
Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#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 configuration.
@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