1. Update NetLib to a combined NetLib support dual network stack: 1) Add Network Debug facility for IPv4 stack. 2) Extend the library APIs to support IPv6 stack: a. NetIp6IsUnspecifiedAddr b. NetIp6IsLinkLocalAddr c. NetIp6IsNetEqual d. NetLibCreateIPv6DPathNode. e. NetIp6PseudoHeadChecksum f. NetIp6IsValidUnicast 3) Update the structure definitions: a. Update NET_BUF to add EFI_IP6_HEADER and EFI_UDP_HEADER b. Add NET_IP6_PSEUDO_HDR 4) Update Ip4IsUnicast to NetIp4IsUnicast 2. Update the impacted modules to adopt the combined NetLib. 3. Clean up coding style errors in all network drivers and libraries. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9391 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			208 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			208 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
| 
 | |
| Copyright (c) 2005 - 2009, Intel Corporation.<BR>
 | |
| All rights reserved. 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_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 malformated.
 | |
|   @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 nubmer 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
 |