/** @file
  EBL commands for Network Devices

  Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
  (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR>

  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.

**/

#include "Ebl.h"

EFI_STATUS
ParseIp (
  IN  CHAR8           *String,
  OUT EFI_IP_ADDRESS  *Address
  )
{
  Address->v4.Addr[0] = (UINT8)AsciiStrDecimalToUintn (String);
  String = AsciiStrStr(String, ".") + 1;
  Address->v4.Addr[1] = (UINT8)AsciiStrDecimalToUintn (String);
  String = AsciiStrStr(String, ".") + 1;
  Address->v4.Addr[2] = (UINT8)AsciiStrDecimalToUintn (String);
  String = AsciiStrStr(String, ".") + 1;
  Address->v4.Addr[3] = (UINT8)AsciiStrDecimalToUintn (String);

  return EFI_SUCCESS;
}

EFI_STATUS
EFIAPI
EblIpCmd (
  IN UINTN  Argc,
  IN CHAR8  **Argv
  )
{
  EFI_STATUS        Status = EFI_INVALID_PARAMETER;
  EFI_MAC_ADDRESS   Mac;
  EFI_IP_ADDRESS    Ip;

  if (Argc == 1) {
    // Get current IP/MAC

    // Get current MAC address
    Status = EblGetCurrentMacAddress (&Mac);
    if (EFI_ERROR (Status)) {
      goto Exit;
    }

    AsciiPrint ("MAC Address:  %02x:%02x:%02x:%02x:%02x:%02x\n", Mac.Addr[0],  Mac.Addr[1],  Mac.Addr[2],  Mac.Addr[3],  Mac.Addr[4],  Mac.Addr[5]);

    // Get current IP address
    Status = EblGetCurrentIpAddress (&Ip);
    if (EFI_ERROR(Status)) {
      AsciiPrint("IP Address is not configured.\n");
      Status = EFI_SUCCESS;
      goto Exit;
    }

    AsciiPrint("IP Address:   %d.%d.%d.%d\n", Ip.v4.Addr[0], Ip.v4.Addr[1],Ip.v4.Addr[2], Ip.v4.Addr[3]);

  } else if ((Argv[1][0] == 'r') && (Argc == 2)) {
    // Get new address via dhcp
    Status = EblPerformDHCP (TRUE);
  } else if ((Argv[1][0] == 's') && (Argc == 3)) {
    // Set static IP
    Status = ParseIp (Argv[2], &Ip);
    if (EFI_ERROR (Status)) {
      goto Exit;
    }

    Status = EblSetStationIp (&Ip, NULL);
  }

Exit:
  return Status;
}

GLOBAL_REMOVE_IF_UNREFERENCED const EBL_COMMAND_TABLE mCmdNetworkTemplate[] =
{
  {
    "ip",
    " ; print current ip address\n\r   [r]; request DHCP address\n\r   [s] ipaddr; set static IP address",
    NULL,
    EblIpCmd
  }
};


/**
  Initialize the commands in this in this file
**/
VOID
EblInitializeNetworkCmd (
  VOID
  )
{
  EblAddCommands (mCmdNetworkTemplate, sizeof (mCmdNetworkTemplate)/sizeof (EBL_COMMAND_TABLE));
}

