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