/** @file | |
Copyright (c) 2005 - 2015, Intel Corporation. All rights reserved.<BR> | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
**/ | |
#ifndef __EFI_IP4_IGMP_H__ | |
#define __EFI_IP4_IGMP_H__ | |
// | |
// IGMP message type | |
// | |
#define IGMP_MEMBERSHIP_QUERY 0x11 | |
#define IGMP_V1_MEMBERSHIP_REPORT 0x12 | |
#define IGMP_V2_MEMBERSHIP_REPORT 0x16 | |
#define IGMP_LEAVE_GROUP 0x17 | |
#define IGMP_V1ROUTER_PRESENT 400 | |
#define IGMP_UNSOLICIATED_REPORT 10 | |
#pragma pack(1) | |
typedef struct { | |
UINT8 Type; | |
UINT8 MaxRespTime; | |
UINT16 Checksum; | |
IP4_ADDR Group; | |
} IGMP_HEAD; | |
#pragma pack() | |
/// | |
/// The status of multicast group. It isn't necessary to maintain | |
/// explicit state of host state diagram. A group with non-zero | |
/// DelayTime is in "delaying member" state. otherwise, it is in | |
/// "idle member" state. | |
/// | |
typedef struct { | |
LIST_ENTRY Link; | |
INTN RefCnt; | |
IP4_ADDR Address; | |
INTN DelayTime; | |
BOOLEAN ReportByUs; | |
EFI_MAC_ADDRESS Mac; | |
} IGMP_GROUP; | |
/// | |
/// The IGMP status. Each IP4 service instance has a IGMP_SERVICE_DATA | |
/// attached. The Igmpv1QuerySeen remember whether the server on this | |
/// connected network is v1 or v2. | |
/// | |
typedef struct { | |
INTN Igmpv1QuerySeen; | |
LIST_ENTRY Groups; | |
} IGMP_SERVICE_DATA; | |
/** | |
Init the IGMP control data of the IP4 service instance, configure | |
MNP to receive ALL SYSTEM multicast. | |
@param[in, out] IpSb The IP4 service whose IGMP is to be initialized. | |
@retval EFI_SUCCESS IGMP of the IpSb is successfully initialized. | |
@retval EFI_OUT_OF_RESOURCES Failed to allocate resource to initialize IGMP. | |
@retval Others Failed to initialize the IGMP of IpSb. | |
**/ | |
EFI_STATUS | |
Ip4InitIgmp ( | |
IN OUT IP4_SERVICE *IpSb | |
); | |
/** | |
Join the multicast group on behalf of this IP4 child | |
@param[in] IpInstance The IP4 child that wants to join the group. | |
@param[in] Address The group to join. | |
@retval EFI_SUCCESS Successfully join the multicast group. | |
@retval EFI_OUT_OF_RESOURCES Failed to allocate resources. | |
@retval Others Failed to join the multicast group. | |
**/ | |
EFI_STATUS | |
Ip4JoinGroup ( | |
IN IP4_PROTOCOL *IpInstance, | |
IN IP4_ADDR Address | |
); | |
/** | |
Leave the IP4 multicast group on behalf of IpInstance. | |
@param[in] IpInstance The IP4 child that wants to leave the group | |
address. | |
@param[in] Address The group address to leave. | |
@retval EFI_NOT_FOUND The IP4 service instance isn't in the group. | |
@retval EFI_SUCCESS Successfully leave the multicast group. | |
@retval Others Failed to leave the multicast group. | |
**/ | |
EFI_STATUS | |
Ip4LeaveGroup ( | |
IN IP4_PROTOCOL *IpInstance, | |
IN IP4_ADDR Address | |
); | |
/** | |
Handle the received IGMP message for the IP4 service instance. | |
@param[in] IpSb The IP4 service instance that received the message. | |
@param[in] Head The IP4 header of the received message. | |
@param[in] Packet The IGMP message, without IP4 header. | |
@retval EFI_INVALID_PARAMETER The IGMP message is malformatted. | |
@retval EFI_SUCCESS The IGMP message is successfully processed. | |
**/ | |
EFI_STATUS | |
Ip4IgmpHandle ( | |
IN IP4_SERVICE *IpSb, | |
IN IP4_HEAD *Head, | |
IN NET_BUF *Packet | |
); | |
/** | |
The periodical timer function for IGMP. It does the following | |
things: | |
1. Decrease the Igmpv1QuerySeen to make it possible to refresh | |
the IGMP server type. | |
2. Decrease the report timer for each IGMP group in "delaying | |
member" state. | |
@param[in] IpSb The IP4 service instance that is ticking. | |
**/ | |
VOID | |
Ip4IgmpTicking ( | |
IN IP4_SERVICE *IpSb | |
); | |
/** | |
Add a group address to the array of group addresses. | |
The caller should make sure that no duplicated address | |
existed in the array. Although the function doesn't | |
assume the byte order of the both Source and Addr, the | |
network byte order is used by the caller. | |
@param[in] Source The array of group addresses to add to. | |
@param[in] Count The number of group addresses in the Source. | |
@param[in] Addr The IP4 multicast address to add. | |
@return NULL if failed to allocate memory for the new groups, | |
otherwise the new combined group addresses. | |
**/ | |
IP4_ADDR * | |
Ip4CombineGroups ( | |
IN IP4_ADDR *Source, | |
IN UINT32 Count, | |
IN IP4_ADDR Addr | |
); | |
/** | |
Remove a group address from the array of group addresses. | |
Although the function doesn't assume the byte order of the | |
both Groups and Addr, the network byte order is used by | |
the caller. | |
@param Groups The array of group addresses to remove from. | |
@param Count The number of group addresses in the Groups. | |
@param Addr The IP4 multicast address to remove. | |
@return The number of group addresses in the Groups after remove. | |
It is Count if the Addr isn't in the Groups. | |
**/ | |
INTN | |
Ip4RemoveGroupAddr ( | |
IN OUT IP4_ADDR *Groups, | |
IN UINT32 Count, | |
IN IP4_ADDR Addr | |
); | |
/** | |
Find the IGMP_GROUP structure which contains the status of multicast | |
group Address in this IGMP control block | |
@param[in] IgmpCtrl The IGMP control block to search from. | |
@param[in] Address The multicast address to search. | |
@return NULL if the multicast address isn't in the IGMP control block. Otherwise | |
the point to the IGMP_GROUP which contains the status of multicast group | |
for Address. | |
**/ | |
IGMP_GROUP * | |
Ip4FindGroup ( | |
IN IGMP_SERVICE_DATA *IgmpCtrl, | |
IN IP4_ADDR Address | |
); | |
#endif |