2 Copyright (c) 2006, 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.
27 IN EFI_IP_ADDRESS
*IP
,
28 IN OUT EFI_MAC_ADDRESS
*MAC
33 this routine calls undi to convert an multicast IP address to a MAC address
36 snp - pointer to snp driver structure
37 IPv6 - flag to indicate if this is an ipv6 address
38 IP - multicast IP address
39 MAC - pointer to hold the return MAC address
45 PXE_CPB_MCAST_IP_TO_MAC
*cpb
;
46 PXE_DB_MCAST_IP_TO_MAC
*db
;
50 snp
->cdb
.OpCode
= PXE_OPCODE_MCAST_IP_TO_MAC
;
51 snp
->cdb
.OpFlags
= (UINT16
) (IPv6
? PXE_OPFLAGS_MCAST_IPV6_TO_MAC
: PXE_OPFLAGS_MCAST_IPV4_TO_MAC
);
52 snp
->cdb
.CPBsize
= sizeof (PXE_CPB_MCAST_IP_TO_MAC
);
53 snp
->cdb
.DBsize
= sizeof (PXE_DB_MCAST_IP_TO_MAC
);
55 snp
->cdb
.CPBaddr
= (UINT64
) (UINTN
) cpb
;
56 snp
->cdb
.DBaddr
= (UINT64
) (UINTN
) db
;
58 snp
->cdb
.StatCode
= PXE_STATCODE_INITIALIZE
;
59 snp
->cdb
.StatFlags
= PXE_STATFLAGS_INITIALIZE
;
60 snp
->cdb
.IFnum
= snp
->if_num
;
61 snp
->cdb
.Control
= PXE_CONTROL_LAST_CDB_IN_LIST
;
63 CopyMem (&cpb
->IP
, IP
, sizeof (PXE_IP_ADDR
));
66 // Issue UNDI command and check result.
68 DEBUG ((EFI_D_NET
, "\nsnp->undi.mcast_ip_to_mac() "));
70 (*snp
->issue_undi32_command
) ((UINT64
) (UINTN
) &snp
->cdb
);
72 switch (snp
->cdb
.StatCode
) {
73 case PXE_STATCODE_SUCCESS
:
76 case PXE_STATCODE_INVALID_CPB
:
77 return EFI_INVALID_PARAMETER
;
79 case PXE_STATCODE_UNSUPPORTED
:
82 "\nsnp->undi.mcast_ip_to_mac() %xh:%xh\n",
86 return EFI_UNSUPPORTED
;
90 // UNDI command failed. Return EFI_DEVICE_ERROR
95 "\nsnp->undi.mcast_ip_to_mac() %xh:%xh\n",
100 return EFI_DEVICE_ERROR
;
103 CopyMem (MAC
, &db
->MAC
, sizeof (PXE_MAC_ADDR
));
109 snp_undi32_mcast_ip_to_mac (
110 IN EFI_SIMPLE_NETWORK_PROTOCOL
*this,
112 IN EFI_IP_ADDRESS
*IP
,
113 OUT EFI_MAC_ADDRESS
*MAC
118 This is the SNP interface routine for converting a multicast IP address to
120 This routine basically retrieves snp structure, checks the SNP state and
121 calls the pxe_ip2mac routine to actually do the conversion
124 this - context pointer
125 IPv6 - flag to indicate if this is an ipv6 address
126 IP - multicast IP address
127 MAC - pointer to hold the return MAC address
136 // Get pointer to SNP driver instance for *this.
139 return EFI_INVALID_PARAMETER
;
142 snp
= EFI_SIMPLE_NETWORK_DEV_FROM_THIS (this);
145 return EFI_DEVICE_ERROR
;
148 switch (snp
->mode
.State
) {
149 case EfiSimpleNetworkInitialized
:
152 case EfiSimpleNetworkStopped
:
153 return EFI_NOT_STARTED
;
155 case EfiSimpleNetworkStarted
:
156 return EFI_DEVICE_ERROR
;
159 return EFI_DEVICE_ERROR
;
162 if (IP
== NULL
|| MAC
== NULL
) {
163 return EFI_INVALID_PARAMETER
;
166 return pxe_ip2mac (snp
, IPv6
, IP
, MAC
);