11771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek/** @file 21771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek 31771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek Implementation of the SNP.ReceiveFilters() function and its private helpers 41771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek if any. 51771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek 61771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek Copyright (C) 2013, Red Hat, Inc. 71771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR> 81771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek 91771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek This program and the accompanying materials are licensed and made available 101771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek under the terms and conditions of the BSD License which accompanies this 111771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek distribution. The full text of the license may be found at 121771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek http://opensource.org/licenses/bsd-license.php 131771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek 141771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT 151771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 161771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek 171771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek**/ 181771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek 191771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek#include <Library/UefiBootServicesTableLib.h> 201771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek 211771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek#include "VirtioNet.h" 221771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek 231771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek/** 241771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek Manages the multicast receive filters of a network interface. 251771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek 261771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek @param This The protocol instance pointer. 271771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek @param Enable A bit mask of receive filters to enable on the 281771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek network interface. 291771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek @param Disable A bit mask of receive filters to disable on the 301771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek network interface. 311771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek @param ResetMCastFilter Set to TRUE to reset the contents of the multicast 321771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek receive filters on the network interface to their 331771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek default values. 341771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek @param McastFilterCnt Number of multicast HW MAC addresses in the new 351771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek MCastFilter list. This value must be less than or 361771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek equal to the MCastFilterCnt field of 371771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek EFI_SIMPLE_NETWORK_MODE. This field is optional if 381771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek ResetMCastFilter is TRUE. 391771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek @param MCastFilter A pointer to a list of new multicast receive filter 401771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek HW MAC addresses. This list will replace any 411771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek existing multicast HW MAC address list. This field 421771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek is optional if ResetMCastFilter is TRUE. 431771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek 441771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek @retval EFI_SUCCESS The multicast receive filter list was updated. 451771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek @retval EFI_NOT_STARTED The network interface has not been started. 461771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek @retval EFI_INVALID_PARAMETER One or more of the parameters has an 471771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek unsupported value. 481771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek @retval EFI_DEVICE_ERROR The command could not be sent to the network 491771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek interface. 501771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek @retval EFI_UNSUPPORTED This function is not supported by the network 511771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek interface. 521771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek 531771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek**/ 541771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek 551771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo ErsekEFI_STATUS 561771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo ErsekEFIAPI 571771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo ErsekVirtioNetReceiveFilters ( 581771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek IN EFI_SIMPLE_NETWORK_PROTOCOL *This, 591771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek IN UINT32 Enable, 601771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek IN UINT32 Disable, 611771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek IN BOOLEAN ResetMCastFilter, 621771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek IN UINTN MCastFilterCnt OPTIONAL, 631771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek IN EFI_MAC_ADDRESS *MCastFilter OPTIONAL 641771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek ) 651771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek{ 661771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek VNET_DEV *Dev; 671771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek EFI_TPL OldTpl; 681771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek EFI_STATUS Status; 691771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek 701771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek if (This == NULL) { 711771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek return EFI_INVALID_PARAMETER; 721771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek } 731771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek 741771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek Dev = VIRTIO_NET_FROM_SNP (This); 751771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek OldTpl = gBS->RaiseTPL (TPL_CALLBACK); 761771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek switch (Dev->Snm.State) { 771771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek case EfiSimpleNetworkStopped: 781771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek Status = EFI_NOT_STARTED; 791771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek goto Exit; 801771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek case EfiSimpleNetworkStarted: 811771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek Status = EFI_DEVICE_ERROR; 821771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek goto Exit; 831771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek default: 841771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek break; 851771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek } 861771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek 871771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek // 881771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek // MNP apparently fails to initialize on top of us if we simply return 891771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek // EFI_UNSUPPORTED in this function. 901771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek // 911771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek // Hence we openly refuse multicast functionality, and fake the rest by 921771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek // selecting a no stricter filter setting than whatever is requested. The 931771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek // UEFI-2.3.1+errC spec allows this. In practice we don't change our current 941771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek // (default) filter. Additionally, receiving software is responsible for 951771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek // discarding any packets getting through the filter. 961771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek // 971771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek Status = ( 981771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek ((Enable | Disable) & ~Dev->Snm.ReceiveFilterMask) != 0 || 991771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek (!ResetMCastFilter && MCastFilterCnt > Dev->Snm.MaxMCastFilterCount) 1001771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek ) ? EFI_INVALID_PARAMETER : EFI_SUCCESS; 1011771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek 1021771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo ErsekExit: 1031771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek gBS->RestoreTPL (OldTpl); 1041771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek return Status; 1051771d0a1ee9e5b7baf37fe78c22998380902f495Laszlo Ersek} 106