2 Copyright (c) 2004 - 2007, Intel Corporation
3 All rights reserved. This program and the accompanying materials
4 are licensed and made available under the terms and conditions of the BSD License
5 which accompanies this distribution. The full text of the license may be found at
6 http://opensource.org/licenses/bsd-license.php
8 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
9 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
17 2000-Feb-17 M(f)J Genesis.
24 this routine calls undi to convert an multicast IP address to a MAC address
26 @param snp pointer to snp driver structure
27 @param IPv6 flag to indicate if this is an ipv6 address
28 @param IP multicast IP address
29 @param MAC pointer to hold the return MAC address
38 IN EFI_IP_ADDRESS
*IP
,
39 IN OUT EFI_MAC_ADDRESS
*MAC
42 PXE_CPB_MCAST_IP_TO_MAC
*cpb
;
43 PXE_DB_MCAST_IP_TO_MAC
*db
;
47 snp
->cdb
.OpCode
= PXE_OPCODE_MCAST_IP_TO_MAC
;
48 snp
->cdb
.OpFlags
= (UINT16
) (IPv6
? PXE_OPFLAGS_MCAST_IPV6_TO_MAC
: PXE_OPFLAGS_MCAST_IPV4_TO_MAC
);
49 snp
->cdb
.CPBsize
= sizeof (PXE_CPB_MCAST_IP_TO_MAC
);
50 snp
->cdb
.DBsize
= sizeof (PXE_DB_MCAST_IP_TO_MAC
);
52 snp
->cdb
.CPBaddr
= (UINT64
)(UINTN
) cpb
;
53 snp
->cdb
.DBaddr
= (UINT64
)(UINTN
) db
;
55 snp
->cdb
.StatCode
= PXE_STATCODE_INITIALIZE
;
56 snp
->cdb
.StatFlags
= PXE_STATFLAGS_INITIALIZE
;
57 snp
->cdb
.IFnum
= snp
->if_num
;
58 snp
->cdb
.Control
= PXE_CONTROL_LAST_CDB_IN_LIST
;
60 CopyMem (&cpb
->IP
, IP
, sizeof (PXE_IP_ADDR
));
63 // Issue UNDI command and check result.
65 DEBUG ((EFI_D_NET
, "\nsnp->undi.mcast_ip_to_mac() "));
67 (*snp
->issue_undi32_command
) ((UINT64
)(UINTN
) &snp
->cdb
);
69 switch (snp
->cdb
.StatCode
) {
70 case PXE_STATCODE_SUCCESS
:
73 case PXE_STATCODE_INVALID_CPB
:
74 return EFI_INVALID_PARAMETER
;
76 case PXE_STATCODE_UNSUPPORTED
:
79 "\nsnp->undi.mcast_ip_to_mac() %xh:%xh\n",
83 return EFI_UNSUPPORTED
;
87 // UNDI command failed. Return EFI_DEVICE_ERROR
92 "\nsnp->undi.mcast_ip_to_mac() %xh:%xh\n",
97 return EFI_DEVICE_ERROR
;
100 CopyMem (MAC
, &db
->MAC
, sizeof (PXE_MAC_ADDR
));
106 This is the SNP interface routine for converting a multicast IP address to
108 This routine basically retrieves snp structure, checks the SNP state and
109 calls the pxe_ip2mac routine to actually do the conversion
111 @param this context pointer
112 @param IPv6 flag to indicate if this is an ipv6 address
113 @param IP multicast IP address
114 @param MAC pointer to hold the return MAC address
120 snp_undi32_mcast_ip_to_mac (
121 IN EFI_SIMPLE_NETWORK_PROTOCOL
*this,
123 IN EFI_IP_ADDRESS
*IP
,
124 OUT EFI_MAC_ADDRESS
*MAC
132 // Get pointer to SNP driver instance for *this.
135 return EFI_INVALID_PARAMETER
;
138 if (IP
== NULL
|| MAC
== NULL
) {
139 return EFI_INVALID_PARAMETER
;
142 snp
= EFI_SIMPLE_NETWORK_DEV_FROM_THIS (this);
144 OldTpl
= gBS
->RaiseTPL (TPL_CALLBACK
);
146 switch (snp
->mode
.State
) {
147 case EfiSimpleNetworkInitialized
:
150 case EfiSimpleNetworkStopped
:
151 Status
= EFI_NOT_STARTED
;
155 Status
= EFI_DEVICE_ERROR
;
159 Status
= pxe_ip2mac (snp
, IPv6
, IP
, MAC
);
162 gBS
->RestoreTPL (OldTpl
);