src/openflow/model/openflow-switch-net-device.cc
author Tom Henderson <tomh@tomh.org>
Thu, 11 Sep 2014 21:51:29 -0700
changeset 10931 e7b7af914245
parent 10652 dc18deba4502
child 10968 2d29fee2b7b8
permissions -rw-r--r--
make openflow-switch peek transport headers based on IPv4 protocol number information
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6890
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
     1
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
     2
/*
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
     3
 * This program is free software; you can redistribute it and/or modify
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
     4
 * it under the terms of the GNU General Public License version 2 as
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
     5
 * published by the Free Software Foundation;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
     6
 *
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
     7
 * This program is distributed in the hope that it will be useful,
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
     8
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
     9
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    10
 * GNU General Public License for more details.
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    11
 *
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    12
 * You should have received a copy of the GNU General Public License
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    13
 * along with this program; if not, write to the Free Software
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    14
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    15
 *
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    16
 * Author: Blake Hurd  <naimorai@gmail.com>
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    17
 */
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    18
#ifdef NS3_OPENFLOW
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    19
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    20
#include "openflow-switch-net-device.h"
10931
e7b7af914245 make openflow-switch peek transport headers based on IPv4 protocol number information
Tom Henderson <tomh@tomh.org>
parents: 10652
diff changeset
    21
#include "ns3/udp-l4-protocol.h"
e7b7af914245 make openflow-switch peek transport headers based on IPv4 protocol number information
Tom Henderson <tomh@tomh.org>
parents: 10652
diff changeset
    22
#include "ns3/tcp-l4-protocol.h"
6890
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    23
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    24
NS_LOG_COMPONENT_DEFINE ("OpenFlowSwitchNetDevice");
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    25
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    26
namespace ns3 {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    27
10652
dc18deba4502 [doxygen] Revert r10410, r10411, r10412
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10410
diff changeset
    28
NS_OBJECT_ENSURE_REGISTERED (OpenFlowSwitchNetDevice);
6890
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    29
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    30
const char *
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    31
OpenFlowSwitchNetDevice::GetManufacturerDescription ()
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    32
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    33
  return "The ns-3 team";
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    34
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    35
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    36
const char *
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    37
OpenFlowSwitchNetDevice::GetHardwareDescription ()
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    38
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    39
  return "N/A";
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    40
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    41
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    42
const char *
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    43
OpenFlowSwitchNetDevice::GetSoftwareDescription ()
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    44
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    45
  return "Simulated OpenFlow Switch";
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    46
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    47
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    48
const char *
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    49
OpenFlowSwitchNetDevice::GetSerialNumber ()
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    50
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    51
  return "N/A";
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    52
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    53
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    54
static uint64_t
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    55
GenerateId ()
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    56
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    57
  uint8_t ea[ETH_ADDR_LEN];
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    58
  eth_addr_random (ea);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    59
  return eth_addr_to_uint64 (ea);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    60
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    61
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    62
TypeId
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    63
OpenFlowSwitchNetDevice::GetTypeId (void)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    64
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    65
  static TypeId tid = TypeId ("ns3::OpenFlowSwitchNetDevice")
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    66
    .SetParent<NetDevice> ()
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    67
    .AddConstructor<OpenFlowSwitchNetDevice> ()
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    68
    .AddAttribute ("ID",
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    69
                   "The identification of the OpenFlowSwitchNetDevice/Datapath, needed for OpenFlow compatibility.",
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    70
                   UintegerValue (GenerateId ()),
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    71
                   MakeUintegerAccessor (&OpenFlowSwitchNetDevice::m_id),
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    72
                   MakeUintegerChecker<uint64_t> ())
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    73
    .AddAttribute ("FlowTableLookupDelay",
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    74
                   "A real switch will have an overhead for looking up in the flow table. For the default, we simulate a standard TCAM on an FPGA.",
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    75
                   TimeValue (NanoSeconds (30)),
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    76
                   MakeTimeAccessor (&OpenFlowSwitchNetDevice::m_lookupDelay),
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    77
                   MakeTimeChecker ())
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    78
    .AddAttribute ("Flags", // Note: The Controller can configure this value, overriding the user's setting.
7185
e27da23c35b5 openflow coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6890
diff changeset
    79
                   "Flags to turn different functionality on/off, such as whether to inform the controller when a flow expires, or how to handle fragments.",
e27da23c35b5 openflow coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6890
diff changeset
    80
                   UintegerValue (0), // Look at the ofp_config_flags enum in openflow/include/openflow.h for options.
e27da23c35b5 openflow coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6890
diff changeset
    81
                   MakeUintegerAccessor (&OpenFlowSwitchNetDevice::m_flags),
e27da23c35b5 openflow coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6890
diff changeset
    82
                   MakeUintegerChecker<uint16_t> ())
6890
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    83
    .AddAttribute ("FlowTableMissSendLength", // Note: The Controller can configure this value, overriding the user's setting.
7185
e27da23c35b5 openflow coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6890
diff changeset
    84
                   "When forwarding a packet the switch didn't match up to the controller, it can be more efficient to forward only the first x bytes.",
e27da23c35b5 openflow coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6890
diff changeset
    85
                   UintegerValue (OFP_DEFAULT_MISS_SEND_LEN), // 128 bytes
e27da23c35b5 openflow coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6890
diff changeset
    86
                   MakeUintegerAccessor (&OpenFlowSwitchNetDevice::m_missSendLen),
e27da23c35b5 openflow coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6890
diff changeset
    87
                   MakeUintegerChecker<uint16_t> ())
6890
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    88
  ;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    89
  return tid;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    90
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    91
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    92
OpenFlowSwitchNetDevice::OpenFlowSwitchNetDevice ()
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    93
  : m_node (0),
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    94
    m_ifIndex (0),
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    95
    m_mtu (0xffff)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    96
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    97
  NS_LOG_FUNCTION_NOARGS ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    98
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    99
  m_channel = CreateObject<BridgeChannel> ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   100
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   101
  time_init (); // OFSI's clock; needed to use the buffer storage system.
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   102
  // m_lastTimeout = time_now ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   103
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   104
  m_controller = 0;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   105
  // m_listenPVConn = 0;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   106
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   107
  m_chain = chain_create ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   108
  if (m_chain == 0)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   109
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   110
      NS_LOG_ERROR ("Not enough memory to create the flow table.");
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   111
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   112
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   113
  m_ports.reserve (DP_MAX_PORTS);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   114
  vport_table_init (&m_vportTable);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   115
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   116
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   117
OpenFlowSwitchNetDevice::~OpenFlowSwitchNetDevice ()
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   118
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   119
  NS_LOG_FUNCTION_NOARGS ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   120
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   121
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   122
void
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   123
OpenFlowSwitchNetDevice::DoDispose ()
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   124
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   125
  NS_LOG_FUNCTION_NOARGS ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   126
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   127
  for (Ports_t::iterator b = m_ports.begin (), e = m_ports.end (); b != e; b++)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   128
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   129
      SendPortStatus (*b, OFPPR_DELETE);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   130
      b->netdev = 0;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   131
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   132
  m_ports.clear ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   133
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   134
  m_controller = 0;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   135
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   136
  chain_destroy (m_chain);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   137
  RBTreeDestroy (m_vportTable.table);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   138
  m_channel = 0;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   139
  m_node = 0;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   140
  NetDevice::DoDispose ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   141
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   142
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   143
void
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   144
OpenFlowSwitchNetDevice::SetController (Ptr<ofi::Controller> c)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   145
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   146
  if (m_controller != 0)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   147
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   148
      NS_LOG_ERROR ("Controller already set.");
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   149
      return;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   150
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   151
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   152
  m_controller = c;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   153
  m_controller->AddSwitch (this);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   154
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   155
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   156
int
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   157
OpenFlowSwitchNetDevice::AddSwitchPort (Ptr<NetDevice> switchPort)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   158
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   159
  NS_LOG_FUNCTION_NOARGS ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   160
  NS_ASSERT (switchPort != this);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   161
  if (!Mac48Address::IsMatchingType (switchPort->GetAddress ()))
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   162
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   163
      NS_FATAL_ERROR ("Device does not support eui 48 addresses: cannot be added to switch.");
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   164
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   165
  if (!switchPort->SupportsSendFrom ())
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   166
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   167
      NS_FATAL_ERROR ("Device does not support SendFrom: cannot be added to switch.");
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   168
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   169
  if (m_address == Mac48Address ())
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   170
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   171
      m_address = Mac48Address::ConvertFrom (switchPort->GetAddress ());
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   172
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   173
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   174
  if (m_ports.size () < DP_MAX_PORTS)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   175
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   176
      ofi::Port p;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   177
      p.config = 0;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   178
      p.netdev = switchPort;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   179
      m_ports.push_back (p);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   180
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   181
      // Notify the controller that this port has been added
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   182
      SendPortStatus (p, OFPPR_ADD);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   183
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   184
      NS_LOG_DEBUG ("RegisterProtocolHandler for " << switchPort->GetInstanceTypeId ().GetName ());
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   185
      m_node->RegisterProtocolHandler (MakeCallback (&OpenFlowSwitchNetDevice::ReceiveFromDevice, this),
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   186
                                       0, switchPort, true);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   187
      m_channel->AddChannel (switchPort->GetChannel ());
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   188
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   189
  else
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   190
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   191
      return EXFULL;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   192
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   193
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   194
  return 0;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   195
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   196
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   197
void
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   198
OpenFlowSwitchNetDevice::SetIfIndex (const uint32_t index)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   199
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   200
  NS_LOG_FUNCTION_NOARGS ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   201
  m_ifIndex = index;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   202
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   203
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   204
uint32_t
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   205
OpenFlowSwitchNetDevice::GetIfIndex (void) const
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   206
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   207
  NS_LOG_FUNCTION_NOARGS ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   208
  return m_ifIndex;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   209
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   210
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   211
Ptr<Channel>
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   212
OpenFlowSwitchNetDevice::GetChannel (void) const
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   213
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   214
  NS_LOG_FUNCTION_NOARGS ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   215
  return m_channel;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   216
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   217
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   218
void
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   219
OpenFlowSwitchNetDevice::SetAddress (Address address)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   220
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   221
  NS_LOG_FUNCTION_NOARGS ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   222
  m_address = Mac48Address::ConvertFrom (address);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   223
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   224
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   225
Address
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   226
OpenFlowSwitchNetDevice::GetAddress (void) const
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   227
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   228
  NS_LOG_FUNCTION_NOARGS ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   229
  return m_address;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   230
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   231
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   232
bool
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   233
OpenFlowSwitchNetDevice::SetMtu (const uint16_t mtu)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   234
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   235
  NS_LOG_FUNCTION_NOARGS ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   236
  m_mtu = mtu;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   237
  return true;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   238
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   239
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   240
uint16_t
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   241
OpenFlowSwitchNetDevice::GetMtu (void) const
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   242
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   243
  NS_LOG_FUNCTION_NOARGS ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   244
  return m_mtu;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   245
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   246
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   247
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   248
bool
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   249
OpenFlowSwitchNetDevice::IsLinkUp (void) const
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   250
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   251
  NS_LOG_FUNCTION_NOARGS ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   252
  return true;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   253
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   254
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   255
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   256
void
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   257
OpenFlowSwitchNetDevice::AddLinkChangeCallback (Callback<void> callback)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   258
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   259
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   260
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   261
bool
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   262
OpenFlowSwitchNetDevice::IsBroadcast (void) const
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   263
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   264
  NS_LOG_FUNCTION_NOARGS ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   265
  return true;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   266
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   267
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   268
Address
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   269
OpenFlowSwitchNetDevice::GetBroadcast (void) const
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   270
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   271
  NS_LOG_FUNCTION_NOARGS ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   272
  return Mac48Address ("ff:ff:ff:ff:ff:ff");
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   273
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   274
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   275
bool
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   276
OpenFlowSwitchNetDevice::IsMulticast (void) const
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   277
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   278
  NS_LOG_FUNCTION_NOARGS ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   279
  return true;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   280
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   281
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   282
Address
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   283
OpenFlowSwitchNetDevice::GetMulticast (Ipv4Address multicastGroup) const
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   284
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   285
  NS_LOG_FUNCTION (this << multicastGroup);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   286
  Mac48Address multicast = Mac48Address::GetMulticast (multicastGroup);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   287
  return multicast;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   288
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   289
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   290
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   291
bool
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   292
OpenFlowSwitchNetDevice::IsPointToPoint (void) const
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   293
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   294
  NS_LOG_FUNCTION_NOARGS ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   295
  return false;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   296
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   297
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   298
bool
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   299
OpenFlowSwitchNetDevice::IsBridge (void) const
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   300
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   301
  NS_LOG_FUNCTION_NOARGS ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   302
  return true;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   303
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   304
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   305
void
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   306
OpenFlowSwitchNetDevice::DoOutput (uint32_t packet_uid, int in_port, size_t max_len, int out_port, bool ignore_no_fwd)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   307
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   308
  if (out_port != OFPP_CONTROLLER)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   309
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   310
      OutputPort (packet_uid, in_port, out_port, ignore_no_fwd);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   311
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   312
  else
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   313
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   314
      OutputControl (packet_uid, in_port, max_len, OFPR_ACTION);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   315
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   316
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   317
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   318
bool
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   319
OpenFlowSwitchNetDevice::Send (Ptr<Packet> packet, const Address& dest, uint16_t protocolNumber)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   320
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   321
  NS_LOG_FUNCTION_NOARGS ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   322
  return SendFrom (packet, m_address, dest, protocolNumber);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   323
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   324
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   325
bool
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   326
OpenFlowSwitchNetDevice::SendFrom (Ptr<Packet> packet, const Address& src, const Address& dest, uint16_t protocolNumber)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   327
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   328
  NS_LOG_FUNCTION_NOARGS ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   329
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   330
  ofpbuf *buffer = BufferFromPacket (packet,src,dest,GetMtu (),protocolNumber);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   331
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   332
  uint32_t packet_uid = save_buffer (buffer);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   333
  ofi::SwitchPacketMetadata data;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   334
  data.packet = packet;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   335
  data.buffer = buffer;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   336
  data.protocolNumber = protocolNumber;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   337
  data.src = Address (src);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   338
  data.dst = Address (dest);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   339
  m_packetData.insert (std::make_pair (packet_uid, data));
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   340
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   341
  RunThroughFlowTable (packet_uid, -1);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   342
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   343
  return true;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   344
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   345
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   346
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   347
Ptr<Node>
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   348
OpenFlowSwitchNetDevice::GetNode (void) const
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   349
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   350
  NS_LOG_FUNCTION_NOARGS ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   351
  return m_node;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   352
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   353
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   354
void
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   355
OpenFlowSwitchNetDevice::SetNode (Ptr<Node> node)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   356
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   357
  NS_LOG_FUNCTION_NOARGS ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   358
  m_node = node;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   359
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   360
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   361
bool
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   362
OpenFlowSwitchNetDevice::NeedsArp (void) const
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   363
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   364
  NS_LOG_FUNCTION_NOARGS ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   365
  return true;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   366
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   367
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   368
void
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   369
OpenFlowSwitchNetDevice::SetReceiveCallback (NetDevice::ReceiveCallback cb)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   370
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   371
  NS_LOG_FUNCTION_NOARGS ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   372
  m_rxCallback = cb;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   373
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   374
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   375
void
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   376
OpenFlowSwitchNetDevice::SetPromiscReceiveCallback (NetDevice::PromiscReceiveCallback cb)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   377
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   378
  NS_LOG_FUNCTION_NOARGS ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   379
  m_promiscRxCallback = cb;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   380
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   381
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   382
bool
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   383
OpenFlowSwitchNetDevice::SupportsSendFrom () const
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   384
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   385
  NS_LOG_FUNCTION_NOARGS ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   386
  return true;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   387
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   388
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   389
Address
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   390
OpenFlowSwitchNetDevice::GetMulticast (Ipv6Address addr) const
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   391
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   392
  NS_LOG_FUNCTION (this << addr);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   393
  return Mac48Address::GetMulticast (addr);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   394
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   395
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   396
// Add a virtual port table entry.
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   397
int
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   398
OpenFlowSwitchNetDevice::AddVPort (const ofp_vport_mod *ovpm)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   399
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   400
  size_t actions_len = ntohs (ovpm->header.length) - sizeof *ovpm;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   401
  unsigned int vport = ntohl (ovpm->vport);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   402
  unsigned int parent_port = ntohl (ovpm->parent_port);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   403
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   404
  // check whether port table entry exists for specified port number
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   405
  vport_table_entry *vpe = vport_table_lookup (&m_vportTable, vport);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   406
  if (vpe != 0)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   407
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   408
      NS_LOG_ERROR ("vport " << vport << " already exists!");
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   409
      SendErrorMsg (OFPET_BAD_ACTION, OFPET_VPORT_MOD_FAILED, ovpm, ntohs (ovpm->header.length));
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   410
      return EINVAL;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   411
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   412
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   413
  // check whether actions are valid
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   414
  uint16_t v_code = ofi::ValidateVPortActions (ovpm->actions, actions_len);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   415
  if (v_code != ACT_VALIDATION_OK)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   416
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   417
      SendErrorMsg (OFPET_BAD_ACTION, v_code, ovpm, ntohs (ovpm->header.length));
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   418
      return EINVAL;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   419
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   420
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   421
  vpe = vport_table_entry_alloc (actions_len);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   422
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   423
  vpe->vport = vport;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   424
  vpe->parent_port = parent_port;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   425
  if (vport < OFPP_VP_START || vport > OFPP_VP_END)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   426
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   427
      NS_LOG_ERROR ("port " << vport << " is not in the virtual port range (" << OFPP_VP_START << "-" << OFPP_VP_END << ")");
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   428
      SendErrorMsg (OFPET_BAD_ACTION, OFPET_VPORT_MOD_FAILED, ovpm, ntohs (ovpm->header.length));
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   429
      free_vport_table_entry (vpe); // free allocated entry
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   430
      return EINVAL;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   431
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   432
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   433
  vpe->port_acts->actions_len = actions_len;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   434
  memcpy (vpe->port_acts->actions, ovpm->actions, actions_len);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   435
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   436
  int error = insert_vport_table_entry (&m_vportTable, vpe);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   437
  if (error)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   438
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   439
      NS_LOG_ERROR ("could not insert port table entry for port " << vport);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   440
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   441
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   442
  return error;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   443
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   444
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   445
ofpbuf *
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   446
OpenFlowSwitchNetDevice::BufferFromPacket (Ptr<Packet> packet, Address src, Address dst, int mtu, uint16_t protocol)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   447
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   448
  NS_LOG_INFO ("Creating Openflow buffer from packet.");
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   449
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   450
  /*
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   451
   * Allocate buffer with some headroom to add headers in forwarding
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   452
   * to the controller or adding a vlan tag, plus an extra 2 bytes to
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   453
   * allow IP headers to be aligned on a 4-byte boundary.
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   454
   */
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   455
  const int headroom = 128 + 2;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   456
  const int hard_header = VLAN_ETH_HEADER_LEN;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   457
  ofpbuf *buffer = ofpbuf_new (headroom + hard_header + mtu);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   458
  buffer->data = (char*)buffer->data + headroom + hard_header;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   459
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   460
  int l2_length = 0, l3_length = 0, l4_length = 0;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   461
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   462
  // Load headers
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   463
  EthernetHeader eth_hd;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   464
  if (packet->PeekHeader (eth_hd))
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   465
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   466
      buffer->l2 = new eth_header;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   467
      eth_header* eth_h = (eth_header*)buffer->l2;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   468
      dst.CopyTo (eth_h->eth_dst);              // Destination Mac Address
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   469
      src.CopyTo (eth_h->eth_src);              // Source Mac Address
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   470
      eth_h->eth_type = htons (ETH_TYPE_IP);    // Ether Type
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   471
      NS_LOG_INFO ("Parsed EthernetHeader");
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   472
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   473
      l2_length = ETH_HEADER_LEN;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   474
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   475
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   476
  // We have to wrap this because PeekHeader has an assert fail if we check for an Ipv4Header that isn't there.
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   477
  if (protocol == Ipv4L3Protocol::PROT_NUMBER)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   478
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   479
      Ipv4Header ip_hd;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   480
      if (packet->PeekHeader (ip_hd))
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   481
        {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   482
          buffer->l3 = new ip_header;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   483
          ip_header* ip_h = (ip_header*)buffer->l3;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   484
          ip_h->ip_ihl_ver  = IP_IHL_VER (5, IP_VERSION);       // Version
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   485
          ip_h->ip_tos      = ip_hd.GetTos ();                  // Type of Service/Differentiated Services
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   486
          ip_h->ip_tot_len  = packet->GetSize ();               // Total Length
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   487
          ip_h->ip_id       = ip_hd.GetIdentification ();       // Identification
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   488
          ip_h->ip_frag_off = ip_hd.GetFragmentOffset ();       // Fragment Offset
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   489
          ip_h->ip_ttl      = ip_hd.GetTtl ();                  // Time to Live
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   490
          ip_h->ip_proto    = ip_hd.GetProtocol ();             // Protocol
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   491
          ip_h->ip_src      = htonl (ip_hd.GetSource ().Get ()); // Source Address
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   492
          ip_h->ip_dst      = htonl (ip_hd.GetDestination ().Get ()); // Destination Address
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   493
          ip_h->ip_csum     = csum (&ip_h, sizeof ip_h);        // Header Checksum
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   494
          NS_LOG_INFO ("Parsed Ipv4Header");
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   495
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   496
          l3_length = IP_HEADER_LEN;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   497
        }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   498
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   499
  else
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   500
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   501
      // ARP Packet; the underlying OpenFlow header isn't used to match, so this is probably superfluous.
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   502
      ArpHeader arp_hd;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   503
      if (packet->PeekHeader (arp_hd))
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   504
        {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   505
          buffer->l3 = new arp_eth_header;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   506
          arp_eth_header* arp_h = (arp_eth_header*)buffer->l3;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   507
          arp_h->ar_hrd = ARP_HRD_ETHERNET;                             // Hardware type.
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   508
          arp_h->ar_pro = ARP_PRO_IP;                                   // Protocol type.
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   509
          arp_h->ar_op = arp_hd.m_type;                                 // Opcode.
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   510
          arp_hd.GetDestinationHardwareAddress ().CopyTo (arp_h->ar_tha); // Target hardware address.
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   511
          arp_hd.GetSourceHardwareAddress ().CopyTo (arp_h->ar_sha);    // Sender hardware address.
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   512
          arp_h->ar_tpa = arp_hd.GetDestinationIpv4Address ().Get ();   // Target protocol address.
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   513
          arp_h->ar_spa = arp_hd.GetSourceIpv4Address ().Get ();        // Sender protocol address.
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   514
          arp_h->ar_hln = sizeof arp_h->ar_tha;                         // Hardware address length.
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   515
          arp_h->ar_pln = sizeof arp_h->ar_tpa;                         // Protocol address length.
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   516
          NS_LOG_INFO ("Parsed ArpHeader");
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   517
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   518
          l3_length = ARP_ETH_HEADER_LEN;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   519
        }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   520
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   521
10931
e7b7af914245 make openflow-switch peek transport headers based on IPv4 protocol number information
Tom Henderson <tomh@tomh.org>
parents: 10652
diff changeset
   522
  if (protocol == Ipv4L3Protocol::PROT_NUMBER)
6890
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   523
    {
10931
e7b7af914245 make openflow-switch peek transport headers based on IPv4 protocol number information
Tom Henderson <tomh@tomh.org>
parents: 10652
diff changeset
   524
      ip_header* ip_h = (ip_header*)buffer->l3;
e7b7af914245 make openflow-switch peek transport headers based on IPv4 protocol number information
Tom Henderson <tomh@tomh.org>
parents: 10652
diff changeset
   525
      if (ip_h->ip_proto == TcpL4Protocol::PROT_NUMBER)
e7b7af914245 make openflow-switch peek transport headers based on IPv4 protocol number information
Tom Henderson <tomh@tomh.org>
parents: 10652
diff changeset
   526
        {
e7b7af914245 make openflow-switch peek transport headers based on IPv4 protocol number information
Tom Henderson <tomh@tomh.org>
parents: 10652
diff changeset
   527
          TcpHeader tcp_hd;
e7b7af914245 make openflow-switch peek transport headers based on IPv4 protocol number information
Tom Henderson <tomh@tomh.org>
parents: 10652
diff changeset
   528
          if (packet->PeekHeader (tcp_hd))
e7b7af914245 make openflow-switch peek transport headers based on IPv4 protocol number information
Tom Henderson <tomh@tomh.org>
parents: 10652
diff changeset
   529
            {
e7b7af914245 make openflow-switch peek transport headers based on IPv4 protocol number information
Tom Henderson <tomh@tomh.org>
parents: 10652
diff changeset
   530
              buffer->l4 = new tcp_header;
e7b7af914245 make openflow-switch peek transport headers based on IPv4 protocol number information
Tom Henderson <tomh@tomh.org>
parents: 10652
diff changeset
   531
              tcp_header* tcp_h = (tcp_header*)buffer->l4;
e7b7af914245 make openflow-switch peek transport headers based on IPv4 protocol number information
Tom Henderson <tomh@tomh.org>
parents: 10652
diff changeset
   532
              tcp_h->tcp_src = htons (tcp_hd.GetSourcePort ());         // Source Port
e7b7af914245 make openflow-switch peek transport headers based on IPv4 protocol number information
Tom Henderson <tomh@tomh.org>
parents: 10652
diff changeset
   533
              tcp_h->tcp_dst = htons (tcp_hd.GetDestinationPort ());    // Destination Port
e7b7af914245 make openflow-switch peek transport headers based on IPv4 protocol number information
Tom Henderson <tomh@tomh.org>
parents: 10652
diff changeset
   534
              tcp_h->tcp_seq = tcp_hd.GetSequenceNumber ().GetValue (); // Sequence Number
e7b7af914245 make openflow-switch peek transport headers based on IPv4 protocol number information
Tom Henderson <tomh@tomh.org>
parents: 10652
diff changeset
   535
              tcp_h->tcp_ack = tcp_hd.GetAckNumber ().GetValue ();      // ACK Number
e7b7af914245 make openflow-switch peek transport headers based on IPv4 protocol number information
Tom Henderson <tomh@tomh.org>
parents: 10652
diff changeset
   536
              tcp_h->tcp_ctl = TCP_FLAGS (tcp_hd.GetFlags ());  // Data Offset + Reserved + Flags
e7b7af914245 make openflow-switch peek transport headers based on IPv4 protocol number information
Tom Henderson <tomh@tomh.org>
parents: 10652
diff changeset
   537
              tcp_h->tcp_winsz = tcp_hd.GetWindowSize ();       // Window Size
e7b7af914245 make openflow-switch peek transport headers based on IPv4 protocol number information
Tom Henderson <tomh@tomh.org>
parents: 10652
diff changeset
   538
              tcp_h->tcp_urg = tcp_hd.GetUrgentPointer ();      // Urgent Pointer
e7b7af914245 make openflow-switch peek transport headers based on IPv4 protocol number information
Tom Henderson <tomh@tomh.org>
parents: 10652
diff changeset
   539
              tcp_h->tcp_csum = csum (&tcp_h, sizeof tcp_h);    // Header Checksum
e7b7af914245 make openflow-switch peek transport headers based on IPv4 protocol number information
Tom Henderson <tomh@tomh.org>
parents: 10652
diff changeset
   540
              NS_LOG_INFO ("Parsed TcpHeader");
6890
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   541
10931
e7b7af914245 make openflow-switch peek transport headers based on IPv4 protocol number information
Tom Henderson <tomh@tomh.org>
parents: 10652
diff changeset
   542
              l4_length = TCP_HEADER_LEN;
e7b7af914245 make openflow-switch peek transport headers based on IPv4 protocol number information
Tom Henderson <tomh@tomh.org>
parents: 10652
diff changeset
   543
            }
e7b7af914245 make openflow-switch peek transport headers based on IPv4 protocol number information
Tom Henderson <tomh@tomh.org>
parents: 10652
diff changeset
   544
        }
e7b7af914245 make openflow-switch peek transport headers based on IPv4 protocol number information
Tom Henderson <tomh@tomh.org>
parents: 10652
diff changeset
   545
      else if (ip_h->ip_proto == UdpL4Protocol::PROT_NUMBER)
6890
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   546
        {
10931
e7b7af914245 make openflow-switch peek transport headers based on IPv4 protocol number information
Tom Henderson <tomh@tomh.org>
parents: 10652
diff changeset
   547
          UdpHeader udp_hd;
e7b7af914245 make openflow-switch peek transport headers based on IPv4 protocol number information
Tom Henderson <tomh@tomh.org>
parents: 10652
diff changeset
   548
          if (packet->PeekHeader (udp_hd))
e7b7af914245 make openflow-switch peek transport headers based on IPv4 protocol number information
Tom Henderson <tomh@tomh.org>
parents: 10652
diff changeset
   549
            {
e7b7af914245 make openflow-switch peek transport headers based on IPv4 protocol number information
Tom Henderson <tomh@tomh.org>
parents: 10652
diff changeset
   550
              buffer->l4 = new udp_header;
e7b7af914245 make openflow-switch peek transport headers based on IPv4 protocol number information
Tom Henderson <tomh@tomh.org>
parents: 10652
diff changeset
   551
              udp_header* udp_h = (udp_header*)buffer->l4;
e7b7af914245 make openflow-switch peek transport headers based on IPv4 protocol number information
Tom Henderson <tomh@tomh.org>
parents: 10652
diff changeset
   552
              udp_h->udp_src = htons (udp_hd.GetSourcePort ());     // Source Port
e7b7af914245 make openflow-switch peek transport headers based on IPv4 protocol number information
Tom Henderson <tomh@tomh.org>
parents: 10652
diff changeset
   553
              udp_h->udp_dst = htons (udp_hd.GetDestinationPort ()); // Destination Port
e7b7af914245 make openflow-switch peek transport headers based on IPv4 protocol number information
Tom Henderson <tomh@tomh.org>
parents: 10652
diff changeset
   554
              udp_h->udp_len = htons (UDP_HEADER_LEN + packet->GetSize ());
6890
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   555
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   556
              ip_header* ip_h = (ip_header*)buffer->l3;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   557
              uint32_t udp_csum = csum_add32 (0, ip_h->ip_src);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   558
              udp_csum = csum_add32 (udp_csum, ip_h->ip_dst);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   559
              udp_csum = csum_add16 (udp_csum, IP_TYPE_UDP << 8);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   560
              udp_csum = csum_add16 (udp_csum, udp_h->udp_len);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   561
              udp_csum = csum_continue (udp_csum, udp_h, sizeof udp_h);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   562
              udp_h->udp_csum = csum_finish (csum_continue (udp_csum, buffer->data, buffer->size)); // Header Checksum
10931
e7b7af914245 make openflow-switch peek transport headers based on IPv4 protocol number information
Tom Henderson <tomh@tomh.org>
parents: 10652
diff changeset
   563
              NS_LOG_INFO ("Parsed UdpHeader");
e7b7af914245 make openflow-switch peek transport headers based on IPv4 protocol number information
Tom Henderson <tomh@tomh.org>
parents: 10652
diff changeset
   564
e7b7af914245 make openflow-switch peek transport headers based on IPv4 protocol number information
Tom Henderson <tomh@tomh.org>
parents: 10652
diff changeset
   565
              l4_length = UDP_HEADER_LEN;
6890
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   566
            }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   567
        }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   568
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   569
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   570
  // Load Packet data into buffer data
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   571
  packet->CopyData ((uint8_t*)buffer->data, packet->GetSize ());
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   572
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   573
  if (buffer->l4)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   574
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   575
      ofpbuf_push (buffer, buffer->l4, l4_length);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   576
      delete (tcp_header*)buffer->l4;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   577
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   578
  if (buffer->l3)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   579
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   580
      ofpbuf_push (buffer, buffer->l3, l3_length);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   581
      delete (ip_header*)buffer->l3;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   582
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   583
  if (buffer->l2)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   584
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   585
      ofpbuf_push (buffer, buffer->l2, l2_length);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   586
      delete (eth_header*)buffer->l2;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   587
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   588
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   589
  return buffer;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   590
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   591
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   592
void
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   593
OpenFlowSwitchNetDevice::ReceiveFromDevice (Ptr<NetDevice> netdev, Ptr<const Packet> packet, uint16_t protocol,
7185
e27da23c35b5 openflow coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6890
diff changeset
   594
                                            const Address& src, const Address& dst, PacketType packetType)
6890
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   595
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   596
  NS_LOG_FUNCTION_NOARGS ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   597
  NS_LOG_INFO ("--------------------------------------------");
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   598
  NS_LOG_DEBUG ("UID is " << packet->GetUid ());
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   599
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   600
  if (!m_promiscRxCallback.IsNull ())
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   601
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   602
      m_promiscRxCallback (this, packet, protocol, src, dst, packetType);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   603
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   604
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   605
  Mac48Address dst48 = Mac48Address::ConvertFrom (dst);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   606
  NS_LOG_INFO ("Received packet from " << Mac48Address::ConvertFrom (src) << " looking for " << dst48);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   607
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   608
  for (size_t i = 0; i < m_ports.size (); i++)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   609
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   610
      if (m_ports[i].netdev == netdev)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   611
        {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   612
          if (packetType == PACKET_HOST && dst48 == m_address)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   613
            {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   614
              m_rxCallback (this, packet, protocol, src);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   615
            }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   616
          else if (packetType == PACKET_BROADCAST || packetType == PACKET_MULTICAST || packetType == PACKET_OTHERHOST)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   617
            {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   618
              if (packetType == PACKET_OTHERHOST && dst48 == m_address)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   619
                {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   620
                  m_rxCallback (this, packet, protocol, src);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   621
                }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   622
              else
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   623
                {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   624
                  if (packetType != PACKET_OTHERHOST)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   625
                    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   626
                      m_rxCallback (this, packet, protocol, src);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   627
                    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   628
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   629
                  ofi::SwitchPacketMetadata data;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   630
                  data.packet = packet->Copy ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   631
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   632
                  ofpbuf *buffer = BufferFromPacket (data.packet,src,dst,netdev->GetMtu (),protocol);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   633
                  m_ports[i].rx_packets++;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   634
                  m_ports[i].rx_bytes += buffer->size;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   635
                  data.buffer = buffer;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   636
                  uint32_t packet_uid = save_buffer (buffer);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   637
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   638
                  data.protocolNumber = protocol;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   639
                  data.src = Address (src);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   640
                  data.dst = Address (dst);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   641
                  m_packetData.insert (std::make_pair (packet_uid, data));
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   642
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   643
                  RunThroughFlowTable (packet_uid, i);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   644
                }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   645
            }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   646
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   647
          break;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   648
        }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   649
    }
7185
e27da23c35b5 openflow coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6890
diff changeset
   650
6890
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   651
  // Run periodic execution.
7256
b04ba6772f8c rerun check-style.py at default level to enforce space after function name
Tom Henderson <tomh@tomh.org>
parents: 7185
diff changeset
   652
  Time now = Simulator::Now ();
6890
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   653
  if (now >= Seconds (m_lastExecute.GetSeconds () + 1)) // If a second or more has passed from the simulation time, execute.
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   654
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   655
      // If port status is modified in any way, notify the controller.
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   656
      for (size_t i = 0; i < m_ports.size (); i++)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   657
        {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   658
          if (UpdatePortStatus (m_ports[i]))
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   659
            {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   660
              SendPortStatus (m_ports[i], OFPPR_MODIFY);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   661
            }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   662
        }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   663
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   664
      // If any flows have expired, delete them and notify the controller.
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   665
      List deleted = LIST_INITIALIZER (&deleted);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   666
      sw_flow *f, *n;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   667
      chain_timeout (m_chain, &deleted);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   668
      LIST_FOR_EACH_SAFE (f, n, sw_flow, node, &deleted)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   669
      {
7185
e27da23c35b5 openflow coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6890
diff changeset
   670
        std::ostringstream str;
e27da23c35b5 openflow coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6890
diff changeset
   671
        str << "Flow [";
e27da23c35b5 openflow coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6890
diff changeset
   672
        for (int i = 0; i < 6; i++)
e27da23c35b5 openflow coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6890
diff changeset
   673
          str << (i!=0 ? ":" : "") << std::hex << f->key.flow.dl_src[i]/16 << f->key.flow.dl_src[i]%16;
e27da23c35b5 openflow coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6890
diff changeset
   674
        str << " -> ";
e27da23c35b5 openflow coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6890
diff changeset
   675
        for (int i = 0; i < 6; i++)
e27da23c35b5 openflow coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6890
diff changeset
   676
          str << (i!=0 ? ":" : "") << std::hex << f->key.flow.dl_dst[i]/16 << f->key.flow.dl_dst[i]%16;
e27da23c35b5 openflow coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6890
diff changeset
   677
        str <<  "] expired.";
6890
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   678
	
7185
e27da23c35b5 openflow coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6890
diff changeset
   679
        NS_LOG_INFO (str.str ());
6890
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   680
        SendFlowExpired (f, (ofp_flow_expired_reason)f->reason);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   681
        list_remove (&f->node);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   682
        flow_free (f);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   683
      }
7185
e27da23c35b5 openflow coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6890
diff changeset
   684
6890
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   685
      m_lastExecute = now;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   686
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   687
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   688
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   689
int
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   690
OpenFlowSwitchNetDevice::OutputAll (uint32_t packet_uid, int in_port, bool flood)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   691
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   692
  NS_LOG_FUNCTION_NOARGS ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   693
  NS_LOG_INFO ("Flooding over ports.");
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   694
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   695
  int prev_port = -1;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   696
  for (size_t i = 0; i < m_ports.size (); i++)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   697
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   698
      if (i == (unsigned)in_port) // Originating port
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   699
        {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   700
          continue;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   701
        }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   702
      if (flood && m_ports[i].config & OFPPC_NO_FLOOD) // Port configured to not allow flooding
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   703
        {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   704
          continue;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   705
        }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   706
      if (prev_port != -1)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   707
        {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   708
          OutputPort (packet_uid, in_port, prev_port, false);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   709
        }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   710
      prev_port = i;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   711
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   712
  if (prev_port != -1)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   713
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   714
      OutputPort (packet_uid, in_port, prev_port, false);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   715
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   716
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   717
  return 0;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   718
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   719
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   720
void
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   721
OpenFlowSwitchNetDevice::OutputPacket (uint32_t packet_uid, int out_port)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   722
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   723
  if (out_port >= 0 && out_port < DP_MAX_PORTS)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   724
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   725
      ofi::Port& p = m_ports[out_port];
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   726
      if (p.netdev != 0 && !(p.config & OFPPC_PORT_DOWN))
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   727
        {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   728
          ofi::SwitchPacketMetadata data = m_packetData.find (packet_uid)->second;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   729
          size_t bufsize = data.buffer->size;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   730
          NS_LOG_INFO ("Sending packet " << data.packet->GetUid () << " over port " << out_port);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   731
          if (p.netdev->SendFrom (data.packet->Copy (), data.src, data.dst, data.protocolNumber))
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   732
            {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   733
              p.tx_packets++;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   734
              p.tx_bytes += bufsize;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   735
            }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   736
          else
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   737
            {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   738
              p.tx_dropped++;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   739
            }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   740
          return;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   741
        }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   742
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   743
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   744
  NS_LOG_DEBUG ("can't forward to bad port " << out_port);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   745
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   746
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   747
void
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   748
OpenFlowSwitchNetDevice::OutputPort (uint32_t packet_uid, int in_port, int out_port, bool ignore_no_fwd)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   749
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   750
  NS_LOG_FUNCTION_NOARGS ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   751
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   752
  if (out_port == OFPP_FLOOD)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   753
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   754
      OutputAll (packet_uid, in_port, true);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   755
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   756
  else if (out_port == OFPP_ALL)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   757
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   758
      OutputAll (packet_uid, in_port, false);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   759
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   760
  else if (out_port == OFPP_CONTROLLER)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   761
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   762
      OutputControl (packet_uid, in_port, 0, OFPR_ACTION);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   763
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   764
  else if (out_port == OFPP_IN_PORT)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   765
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   766
      OutputPacket (packet_uid, in_port);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   767
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   768
  else if (out_port == OFPP_TABLE)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   769
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   770
      RunThroughFlowTable (packet_uid, in_port < DP_MAX_PORTS ? in_port : -1, false);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   771
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   772
  else if (out_port >= OFPP_VP_START && out_port <= OFPP_VP_END)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   773
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   774
      // port is a virtual port
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   775
      NS_LOG_INFO ("packet sent to virtual port " << out_port);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   776
      if (in_port < DP_MAX_PORTS)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   777
        {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   778
          RunThroughVPortTable (packet_uid, in_port, out_port);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   779
        }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   780
      else
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   781
        {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   782
          RunThroughVPortTable (packet_uid, -1, out_port);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   783
        }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   784
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   785
  else if (in_port == out_port)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   786
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   787
      NS_LOG_DEBUG ("can't directly forward to input port");
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   788
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   789
  else
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   790
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   791
      OutputPacket (packet_uid, out_port);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   792
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   793
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   794
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   795
void*
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   796
OpenFlowSwitchNetDevice::MakeOpenflowReply (size_t openflow_len, uint8_t type, ofpbuf **bufferp)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   797
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   798
  return make_openflow_xid (openflow_len, type, 0, bufferp);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   799
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   800
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   801
int
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   802
OpenFlowSwitchNetDevice::SendOpenflowBuffer (ofpbuf *buffer)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   803
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   804
  if (m_controller != 0)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   805
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   806
      update_openflow_length (buffer);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   807
      m_controller->ReceiveFromSwitch (this, buffer);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   808
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   809
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   810
  return 0;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   811
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   812
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   813
void
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   814
OpenFlowSwitchNetDevice::OutputControl (uint32_t packet_uid, int in_port, size_t max_len, int reason)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   815
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   816
  NS_LOG_INFO ("Sending packet to controller");
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   817
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   818
  ofpbuf* buffer = m_packetData.find (packet_uid)->second.buffer;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   819
  size_t total_len = buffer->size;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   820
  if (packet_uid != std::numeric_limits<uint32_t>::max () && max_len != 0 && buffer->size > max_len)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   821
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   822
      buffer->size = max_len;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   823
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   824
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   825
  ofp_packet_in *opi = (ofp_packet_in*)ofpbuf_push_uninit (buffer, offsetof (ofp_packet_in, data));
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   826
  opi->header.version = OFP_VERSION;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   827
  opi->header.type    = OFPT_PACKET_IN;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   828
  opi->header.length  = htons (buffer->size);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   829
  opi->header.xid     = htonl (0);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   830
  opi->buffer_id      = htonl (packet_uid);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   831
  opi->total_len      = htons (total_len);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   832
  opi->in_port        = htons (in_port);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   833
  opi->reason         = reason;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   834
  opi->pad            = 0;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   835
  SendOpenflowBuffer (buffer);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   836
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   837
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   838
void
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   839
OpenFlowSwitchNetDevice::FillPortDesc (ofi::Port p, ofp_phy_port *desc)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   840
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   841
  desc->port_no = htons (GetSwitchPortIndex (p));
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   842
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   843
  std::ostringstream nm;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   844
  nm << "eth" << GetSwitchPortIndex (p);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   845
  strncpy ((char *)desc->name, nm.str ().c_str (), sizeof desc->name);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   846
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   847
  p.netdev->GetAddress ().CopyTo (desc->hw_addr);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   848
  desc->config = htonl (p.config);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   849
  desc->state = htonl (p.state);
7185
e27da23c35b5 openflow coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6890
diff changeset
   850
9870
6543f3876ff5 [Doxygen] use \todo
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9249
diff changeset
   851
  /// \todo This should probably be fixed eventually to specify different available features.
6890
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   852
  desc->curr = 0; // htonl(netdev_get_features(p->netdev, NETDEV_FEAT_CURRENT));
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   853
  desc->supported = 0; // htonl(netdev_get_features(p->netdev, NETDEV_FEAT_SUPPORTED));
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   854
  desc->advertised = 0; // htonl(netdev_get_features(p->netdev, NETDEV_FEAT_ADVERTISED));
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   855
  desc->peer = 0; // htonl(netdev_get_features(p->netdev, NETDEV_FEAT_PEER));
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   856
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   857
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   858
void
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   859
OpenFlowSwitchNetDevice::SendFeaturesReply ()
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   860
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   861
  ofpbuf *buffer;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   862
  ofp_switch_features *ofr = (ofp_switch_features*)MakeOpenflowReply (sizeof *ofr, OFPT_FEATURES_REPLY, &buffer);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   863
  ofr->datapath_id  = htonll (m_id);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   864
  ofr->n_tables     = m_chain->n_tables;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   865
  ofr->n_buffers    = htonl (N_PKT_BUFFERS);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   866
  ofr->capabilities = htonl (OFP_SUPPORTED_CAPABILITIES);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   867
  ofr->actions      = htonl (OFP_SUPPORTED_ACTIONS);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   868
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   869
  for (size_t i = 0; i < m_ports.size (); i++)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   870
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   871
      ofp_phy_port* opp = (ofp_phy_port*)ofpbuf_put_zeros (buffer, sizeof *opp);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   872
      FillPortDesc (m_ports[i], opp);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   873
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   874
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   875
  SendOpenflowBuffer (buffer);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   876
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   877
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   878
void
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   879
OpenFlowSwitchNetDevice::SendVPortTableFeatures ()
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   880
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   881
  ofpbuf *buffer;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   882
  ofp_vport_table_features *ovtfr = (ofp_vport_table_features*)MakeOpenflowReply (sizeof *ovtfr, OFPT_VPORT_TABLE_FEATURES_REPLY, &buffer);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   883
  ovtfr->actions = htonl (OFP_SUPPORTED_VPORT_TABLE_ACTIONS);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   884
  ovtfr->max_vports = htonl (m_vportTable.max_vports);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   885
  ovtfr->max_chain_depth = htons (-1); // support a chain depth of 2^16
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   886
  ovtfr->mixed_chaining = true;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   887
  SendOpenflowBuffer (buffer);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   888
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   889
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   890
int
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   891
OpenFlowSwitchNetDevice::UpdatePortStatus (ofi::Port& p)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   892
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   893
  uint32_t orig_config = p.config;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   894
  uint32_t orig_state = p.state;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   895
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   896
  // Port is always enabled because the Net Device is always enabled.
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   897
  p.config &= ~OFPPC_PORT_DOWN;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   898
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   899
  if (p.netdev->IsLinkUp ())
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   900
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   901
      p.state &= ~OFPPS_LINK_DOWN;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   902
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   903
  else
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   904
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   905
      p.state |= OFPPS_LINK_DOWN;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   906
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   907
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   908
  return ((orig_config != p.config) || (orig_state != p.state));
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   909
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   910
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   911
void
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   912
OpenFlowSwitchNetDevice::SendPortStatus (ofi::Port p, uint8_t status)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   913
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   914
  ofpbuf *buffer;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   915
  ofp_port_status *ops = (ofp_port_status*)MakeOpenflowReply (sizeof *ops, OFPT_PORT_STATUS, &buffer);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   916
  ops->reason = status;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   917
  memset (ops->pad, 0, sizeof ops->pad);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   918
  FillPortDesc (p, &ops->desc);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   919
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   920
  SendOpenflowBuffer (buffer);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   921
  ofpbuf_delete (buffer);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   922
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   923
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   924
void
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   925
OpenFlowSwitchNetDevice::SendFlowExpired (sw_flow *flow, enum ofp_flow_expired_reason reason)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   926
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   927
  ofpbuf *buffer;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   928
  ofp_flow_expired *ofe = (ofp_flow_expired*)MakeOpenflowReply (sizeof *ofe, OFPT_FLOW_EXPIRED, &buffer);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   929
  flow_fill_match (&ofe->match, &flow->key);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   930
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   931
  ofe->priority = htons (flow->priority);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   932
  ofe->reason = reason;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   933
  memset (ofe->pad, 0, sizeof ofe->pad);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   934
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   935
  ofe->duration     = htonl (time_now () - flow->created);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   936
  memset (ofe->pad2, 0, sizeof ofe->pad2);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   937
  ofe->packet_count = htonll (flow->packet_count);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   938
  ofe->byte_count   = htonll (flow->byte_count);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   939
  SendOpenflowBuffer (buffer);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   940
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   941
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   942
void
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   943
OpenFlowSwitchNetDevice::SendErrorMsg (uint16_t type, uint16_t code, const void *data, size_t len)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   944
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   945
  ofpbuf *buffer;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   946
  ofp_error_msg *oem = (ofp_error_msg*)MakeOpenflowReply (sizeof(*oem) + len, OFPT_ERROR, &buffer);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   947
  oem->type = htons (type);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   948
  oem->code = htons (code);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   949
  memcpy (oem->data, data, len);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   950
  SendOpenflowBuffer (buffer);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   951
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   952
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   953
void
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   954
OpenFlowSwitchNetDevice::FlowTableLookup (sw_flow_key key, ofpbuf* buffer, uint32_t packet_uid, int port, bool send_to_controller)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   955
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   956
  sw_flow *flow = chain_lookup (m_chain, &key);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   957
  if (flow != 0)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   958
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   959
      NS_LOG_INFO ("Flow matched");
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   960
      flow_used (flow, buffer);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   961
      ofi::ExecuteActions (this, packet_uid, buffer, &key, flow->sf_acts->actions, flow->sf_acts->actions_len, false);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   962
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   963
  else
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   964
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   965
      NS_LOG_INFO ("Flow not matched.");
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   966
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   967
      if (send_to_controller)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   968
        {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   969
          OutputControl (packet_uid, port, m_missSendLen, OFPR_NO_MATCH);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   970
        }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   971
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   972
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   973
  // Clean up; at this point we're done with the packet.
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   974
  m_packetData.erase (packet_uid);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   975
  discard_buffer (packet_uid);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   976
  ofpbuf_delete (buffer);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   977
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   978
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   979
void
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   980
OpenFlowSwitchNetDevice::RunThroughFlowTable (uint32_t packet_uid, int port, bool send_to_controller)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   981
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   982
  ofi::SwitchPacketMetadata data = m_packetData.find (packet_uid)->second;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   983
  ofpbuf* buffer = data.buffer;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   984
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   985
  sw_flow_key key;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   986
  key.wildcards = 0; // Lookup cannot take wildcards.
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   987
  // Extract the matching key's flow data from the packet's headers; if the policy is to drop fragments and the message is a fragment, drop it.
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   988
  if (flow_extract (buffer, port != -1 ? port : OFPP_NONE, &key.flow) && (m_flags & OFPC_FRAG_MASK) == OFPC_FRAG_DROP)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   989
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   990
      ofpbuf_delete (buffer);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   991
      return;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   992
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   993
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   994
  // drop MPLS packets with TTL 1
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   995
  if (buffer->l2_5)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   996
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   997
      mpls_header mpls_h;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   998
      mpls_h.value = ntohl (*((uint32_t*)buffer->l2_5));
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   999
      if (mpls_h.ttl == 1)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1000
        {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1001
          // increment mpls drop counter
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1002
          if (port != -1)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1003
            {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1004
              m_ports[port].mpls_ttl0_dropped++;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1005
            }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1006
          return;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1007
        }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1008
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1009
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1010
  // If we received the packet on a port, and opted not to receive any messages from it...
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1011
  if (port != -1)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1012
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1013
      uint32_t config = m_ports[port].config;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1014
      if (config & (OFPPC_NO_RECV | OFPPC_NO_RECV_STP)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1015
          && config & (!eth_addr_equals (key.flow.dl_dst, stp_eth_addr) ? OFPPC_NO_RECV : OFPPC_NO_RECV_STP))
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1016
        {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1017
          return;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1018
        }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1019
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1020
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1021
  NS_LOG_INFO ("Matching against the flow table.");
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1022
  Simulator::Schedule (m_lookupDelay, &OpenFlowSwitchNetDevice::FlowTableLookup, this, key, buffer, packet_uid, port, send_to_controller);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1023
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1024
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1025
int
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1026
OpenFlowSwitchNetDevice::RunThroughVPortTable (uint32_t packet_uid, int port, uint32_t vport)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1027
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1028
  ofpbuf* buffer = m_packetData.find (packet_uid)->second.buffer;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1029
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1030
  // extract the flow again since we need it
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1031
  // and the layer pointers may changed
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1032
  sw_flow_key key;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1033
  key.wildcards = 0;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1034
  if (flow_extract (buffer, port != -1 ? port : OFPP_NONE, &key.flow)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1035
      && (m_flags & OFPC_FRAG_MASK) == OFPC_FRAG_DROP)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1036
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1037
      return 0;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1038
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1039
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1040
  // run through the chain of port table entries
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1041
  vport_table_entry *vpe = vport_table_lookup (&m_vportTable, vport);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1042
  m_vportTable.lookup_count++;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1043
  if (vpe)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1044
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1045
      m_vportTable.port_match_count++;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1046
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1047
  while (vpe != 0)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1048
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1049
      ofi::ExecuteVPortActions (this, packet_uid, m_packetData.find (packet_uid)->second.buffer, &key, vpe->port_acts->actions, vpe->port_acts->actions_len);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1050
      vport_used (vpe, buffer); // update counters for virtual port
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1051
      if (vpe->parent_port_ptr == 0)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1052
        {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1053
          // if a port table's parent_port_ptr is 0 then
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1054
          // the parent_port should be a physical port
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1055
          if (vpe->parent_port <= OFPP_VP_START) // done traversing port chain, send packet to output port
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1056
            {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1057
              OutputPort (packet_uid, port != -1 ? port : OFPP_NONE, vpe->parent_port, false);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1058
            }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1059
          else
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1060
            {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1061
              NS_LOG_ERROR ("virtual port points to parent port\n");
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1062
            }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1063
        }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1064
      else // increment the number of port entries accessed by chaining
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1065
        {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1066
          m_vportTable.chain_match_count++;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1067
        }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1068
      // move to the parent port entry
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1069
      vpe = vpe->parent_port_ptr;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1070
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1071
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1072
  return 0;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1073
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1074
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1075
int
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1076
OpenFlowSwitchNetDevice::ReceiveFeaturesRequest (const void *msg)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1077
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1078
  SendFeaturesReply ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1079
  return 0;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1080
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1081
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1082
int
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1083
OpenFlowSwitchNetDevice::ReceiveVPortTableFeaturesRequest (const void *msg)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1084
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1085
  SendVPortTableFeatures ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1086
  return 0;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1087
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1088
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1089
int
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1090
OpenFlowSwitchNetDevice::ReceiveGetConfigRequest (const void *msg)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1091
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1092
  ofpbuf *buffer;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1093
  ofp_switch_config *osc = (ofp_switch_config*)MakeOpenflowReply (sizeof *osc, OFPT_GET_CONFIG_REPLY, &buffer);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1094
  osc->flags = htons (m_flags);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1095
  osc->miss_send_len = htons (m_missSendLen);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1096
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1097
  return SendOpenflowBuffer (buffer);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1098
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1099
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1100
int
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1101
OpenFlowSwitchNetDevice::ReceiveSetConfig (const void *msg)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1102
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1103
  const ofp_switch_config *osc = (ofp_switch_config*)msg;
7185
e27da23c35b5 openflow coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6890
diff changeset
  1104
6890
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1105
  int n_flags = ntohs (osc->flags) & (OFPC_SEND_FLOW_EXP | OFPC_FRAG_MASK);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1106
  if ((n_flags & OFPC_FRAG_MASK) != OFPC_FRAG_NORMAL && (n_flags & OFPC_FRAG_MASK) != OFPC_FRAG_DROP)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1107
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1108
      n_flags = (n_flags & ~OFPC_FRAG_MASK) | OFPC_FRAG_DROP;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1109
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1110
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1111
  m_flags = n_flags;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1112
  m_missSendLen = ntohs (osc->miss_send_len);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1113
  return 0;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1114
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1115
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1116
int
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1117
OpenFlowSwitchNetDevice::ReceivePacketOut (const void *msg)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1118
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1119
  const ofp_packet_out *opo = (ofp_packet_out*)msg;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1120
  ofpbuf *buffer;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1121
  size_t actions_len = ntohs (opo->actions_len);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1122
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1123
  if (actions_len > (ntohs (opo->header.length) - sizeof *opo))
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1124
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1125
      NS_LOG_DEBUG ("message too short for number of actions");
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1126
      return -EINVAL;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1127
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1128
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1129
  if (ntohl (opo->buffer_id) == (uint32_t) -1)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1130
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1131
      // FIXME: can we avoid copying data here?
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1132
      int data_len = ntohs (opo->header.length) - sizeof *opo - actions_len;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1133
      buffer = ofpbuf_new (data_len);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1134
      ofpbuf_put (buffer, (uint8_t *)opo->actions + actions_len, data_len);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1135
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1136
  else
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1137
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1138
      buffer = retrieve_buffer (ntohl (opo->buffer_id));
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1139
      if (buffer == 0)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1140
        {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1141
          return -ESRCH;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1142
        }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1143
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1144
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1145
  sw_flow_key key;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1146
  flow_extract (buffer, opo->in_port, &key.flow); // ntohs(opo->in_port)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1147
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1148
  uint16_t v_code = ofi::ValidateActions (&key, opo->actions, actions_len);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1149
  if (v_code != ACT_VALIDATION_OK)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1150
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1151
      SendErrorMsg (OFPET_BAD_ACTION, v_code, msg, ntohs (opo->header.length));
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1152
      ofpbuf_delete (buffer);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1153
      return -EINVAL;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1154
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1155
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1156
  ofi::ExecuteActions (this, opo->buffer_id, buffer, &key, opo->actions, actions_len, true);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1157
  return 0;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1158
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1159
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1160
int
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1161
OpenFlowSwitchNetDevice::ReceivePortMod (const void *msg)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1162
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1163
  ofp_port_mod* opm = (ofp_port_mod*)msg;
7185
e27da23c35b5 openflow coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6890
diff changeset
  1164
6890
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1165
  int port = opm->port_no; // ntohs(opm->port_no);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1166
  if (port < DP_MAX_PORTS)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1167
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1168
      ofi::Port& p = m_ports[port];
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1169
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1170
      // Make sure the port id hasn't changed since this was sent
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1171
      Mac48Address hw_addr = Mac48Address ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1172
      hw_addr.CopyFrom (opm->hw_addr);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1173
      if (p.netdev->GetAddress () != hw_addr)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1174
        {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1175
          return 0;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1176
        }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1177
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1178
      if (opm->mask)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1179
        {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1180
          uint32_t config_mask = ntohl (opm->mask);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1181
          p.config &= ~config_mask;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1182
          p.config |= ntohl (opm->config) & config_mask;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1183
        }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1184
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1185
      if (opm->mask & htonl (OFPPC_PORT_DOWN))
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1186
        {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1187
          if ((opm->config & htonl (OFPPC_PORT_DOWN)) && (p.config & OFPPC_PORT_DOWN) == 0)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1188
            {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1189
              p.config |= OFPPC_PORT_DOWN;
9870
6543f3876ff5 [Doxygen] use \todo
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9249
diff changeset
  1190
              /// \todo Possibly disable the Port's Net Device via the appropriate interface.
6890
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1191
            }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1192
          else if ((opm->config & htonl (OFPPC_PORT_DOWN)) == 0 && (p.config & OFPPC_PORT_DOWN))
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1193
            {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1194
              p.config &= ~OFPPC_PORT_DOWN;
9870
6543f3876ff5 [Doxygen] use \todo
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9249
diff changeset
  1195
              /// \todo Possibly enable the Port's Net Device via the appropriate interface.
6890
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1196
            }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1197
        }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1198
    }
7185
e27da23c35b5 openflow coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6890
diff changeset
  1199
6890
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1200
  return 0;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1201
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1202
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1203
// add or remove a virtual port table entry
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1204
int
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1205
OpenFlowSwitchNetDevice::ReceiveVPortMod (const void *msg)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1206
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1207
  const ofp_vport_mod *ovpm = (ofp_vport_mod*)msg;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1208
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1209
  uint16_t command = ntohs (ovpm->command);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1210
  if (command == OFPVP_ADD)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1211
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1212
      return AddVPort (ovpm);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1213
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1214
  else if (command == OFPVP_DELETE)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1215
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1216
      if (remove_vport_table_entry (&m_vportTable, ntohl (ovpm->vport)))
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1217
        {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1218
          SendErrorMsg (OFPET_BAD_ACTION, OFPET_VPORT_MOD_FAILED, ovpm, ntohs (ovpm->header.length));
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1219
        }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1220
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1221
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1222
  return 0;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1223
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1224
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1225
int
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1226
OpenFlowSwitchNetDevice::AddFlow (const ofp_flow_mod *ofm)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1227
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1228
  size_t actions_len = ntohs (ofm->header.length) - sizeof *ofm;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1229
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1230
  // Allocate memory.
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1231
  sw_flow *flow = flow_alloc (actions_len);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1232
  if (flow == 0)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1233
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1234
      if (ntohl (ofm->buffer_id) != (uint32_t) -1)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1235
        {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1236
          discard_buffer (ntohl (ofm->buffer_id));
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1237
        }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1238
      return -ENOMEM;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1239
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1240
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1241
  flow_extract_match (&flow->key, &ofm->match);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1242
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1243
  uint16_t v_code = ofi::ValidateActions (&flow->key, ofm->actions, actions_len);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1244
  if (v_code != ACT_VALIDATION_OK)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1245
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1246
      SendErrorMsg (OFPET_BAD_ACTION, v_code, ofm, ntohs (ofm->header.length));
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1247
      flow_free (flow);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1248
      if (ntohl (ofm->buffer_id) != (uint32_t) -1)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1249
        {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1250
          discard_buffer (ntohl (ofm->buffer_id));
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1251
        }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1252
      return -ENOMEM;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1253
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1254
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1255
  // Fill out flow.
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1256
  flow->priority = flow->key.wildcards ? ntohs (ofm->priority) : -1;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1257
  flow->idle_timeout = ntohs (ofm->idle_timeout);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1258
  flow->hard_timeout = ntohs (ofm->hard_timeout);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1259
  flow->used = flow->created = time_now ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1260
  flow->sf_acts->actions_len = actions_len;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1261
  flow->byte_count = 0;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1262
  flow->packet_count = 0;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1263
  memcpy (flow->sf_acts->actions, ofm->actions, actions_len);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1264
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1265
  // Act.
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1266
  int error = chain_insert (m_chain, flow);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1267
  if (error)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1268
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1269
      if (error == -ENOBUFS)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1270
        {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1271
          SendErrorMsg (OFPET_FLOW_MOD_FAILED, OFPFMFC_ALL_TABLES_FULL, ofm, ntohs (ofm->header.length));
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1272
        }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1273
      flow_free (flow);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1274
      if (ntohl (ofm->buffer_id) != (uint32_t) -1)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1275
        {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1276
          discard_buffer (ntohl (ofm->buffer_id));
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1277
        }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1278
      return error;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1279
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1280
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1281
  NS_LOG_INFO ("Added new flow.");
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1282
  if (ntohl (ofm->buffer_id) != std::numeric_limits<uint32_t>::max ())
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1283
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1284
      ofpbuf *buffer = retrieve_buffer (ofm->buffer_id); // ntohl(ofm->buffer_id)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1285
      if (buffer)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1286
        {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1287
          sw_flow_key key;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1288
          flow_used (flow, buffer);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1289
          flow_extract (buffer, ofm->match.in_port, &key.flow); // ntohs(ofm->match.in_port);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1290
          ofi::ExecuteActions (this, ofm->buffer_id, buffer, &key, ofm->actions, actions_len, false);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1291
          ofpbuf_delete (buffer);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1292
        }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1293
      else
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1294
        {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1295
          return -ESRCH;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1296
        }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1297
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1298
  return 0;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1299
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1300
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1301
int
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1302
OpenFlowSwitchNetDevice::ModFlow (const ofp_flow_mod *ofm)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1303
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1304
  sw_flow_key key;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1305
  flow_extract_match (&key, &ofm->match);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1306
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1307
  size_t actions_len = ntohs (ofm->header.length) - sizeof *ofm;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1308
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1309
  uint16_t v_code = ofi::ValidateActions (&key, ofm->actions, actions_len);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1310
  if (v_code != ACT_VALIDATION_OK)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1311
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1312
      SendErrorMsg ((ofp_error_type)OFPET_BAD_ACTION, v_code, ofm, ntohs (ofm->header.length));
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1313
      if (ntohl (ofm->buffer_id) != (uint32_t) -1)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1314
        {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1315
          discard_buffer (ntohl (ofm->buffer_id));
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1316
        }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1317
      return -ENOMEM;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1318
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1319
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1320
  uint16_t priority = key.wildcards ? ntohs (ofm->priority) : -1;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1321
  int strict = (ofm->command == htons (OFPFC_MODIFY_STRICT)) ? 1 : 0;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1322
  chain_modify (m_chain, &key, priority, strict, ofm->actions, actions_len);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1323
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1324
  if (ntohl (ofm->buffer_id) != std::numeric_limits<uint32_t>::max ())
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1325
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1326
      ofpbuf *buffer = retrieve_buffer (ofm->buffer_id); // ntohl (ofm->buffer_id)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1327
      if (buffer)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1328
        {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1329
          sw_flow_key skb_key;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1330
          flow_extract (buffer, ofm->match.in_port, &skb_key.flow); // ntohs(ofm->match.in_port);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1331
          ofi::ExecuteActions (this, ofm->buffer_id, buffer, &skb_key, ofm->actions, actions_len, false);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1332
          ofpbuf_delete (buffer);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1333
        }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1334
      else
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1335
        {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1336
          return -ESRCH;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1337
        }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1338
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1339
  return 0;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1340
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1341
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1342
int
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1343
OpenFlowSwitchNetDevice::ReceiveFlow (const void *msg)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1344
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1345
  NS_LOG_FUNCTION_NOARGS ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1346
  const ofp_flow_mod *ofm = (ofp_flow_mod*)msg;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1347
  uint16_t command = ntohs (ofm->command);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1348
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1349
  if (command == OFPFC_ADD)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1350
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1351
      return AddFlow (ofm);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1352
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1353
  else if ((command == OFPFC_MODIFY) || (command == OFPFC_MODIFY_STRICT))
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1354
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1355
      return ModFlow (ofm);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1356
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1357
  else if (command == OFPFC_DELETE)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1358
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1359
      sw_flow_key key;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1360
      flow_extract_match (&key, &ofm->match);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1361
      return chain_delete (m_chain, &key, ofm->out_port, 0, 0) ? 0 : -ESRCH;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1362
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1363
  else if (command == OFPFC_DELETE_STRICT)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1364
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1365
      sw_flow_key key;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1366
      uint16_t priority;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1367
      flow_extract_match (&key, &ofm->match);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1368
      priority = key.wildcards ? ntohs (ofm->priority) : -1;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1369
      return chain_delete (m_chain, &key, ofm->out_port, priority, 1) ? 0 : -ESRCH;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1370
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1371
  else
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1372
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1373
      return -ENODEV;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1374
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1375
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1376
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1377
int
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1378
OpenFlowSwitchNetDevice::StatsDump (ofi::StatsDumpCallback *cb)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1379
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1380
  ofp_stats_reply *osr;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1381
  ofpbuf *buffer;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1382
  int err;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1383
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1384
  if (cb->done)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1385
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1386
      return 0;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1387
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1388
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1389
  osr = (ofp_stats_reply*)MakeOpenflowReply (sizeof *osr, OFPT_STATS_REPLY, &buffer);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1390
  osr->type = htons (cb->s->type);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1391
  osr->flags = 0;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1392
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1393
  err = cb->s->DoDump (this, cb->state, buffer);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1394
  if (err >= 0)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1395
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1396
      if (err == 0)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1397
        {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1398
          cb->done = true;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1399
        }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1400
      else
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1401
        {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1402
          // Buffer might have been reallocated, so find our data again.
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1403
          osr = (ofp_stats_reply*)ofpbuf_at_assert (buffer, 0, sizeof *osr);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1404
          osr->flags = ntohs (OFPSF_REPLY_MORE);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1405
        }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1406
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1407
      int err2 = SendOpenflowBuffer (buffer);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1408
      if (err2)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1409
        {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1410
          err = err2;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1411
        }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1412
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1413
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1414
  return err;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1415
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1416
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1417
void
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1418
OpenFlowSwitchNetDevice::StatsDone (ofi::StatsDumpCallback *cb)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1419
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1420
  if (cb)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1421
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1422
      cb->s->DoCleanup (cb->state);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1423
      free (cb->s);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1424
      free (cb);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1425
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1426
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1427
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1428
int
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1429
OpenFlowSwitchNetDevice::ReceiveStatsRequest (const void *oh)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1430
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1431
  const ofp_stats_request *rq = (ofp_stats_request*)oh;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1432
  size_t rq_len = ntohs (rq->header.length);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1433
  int type = ntohs (rq->type);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1434
  int body_len = rq_len - offsetof (ofp_stats_request, body);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1435
  ofi::Stats* st = new ofi::Stats ((ofp_stats_types)type, (unsigned)body_len);
7185
e27da23c35b5 openflow coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6890
diff changeset
  1436
6890
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1437
  if (st == 0)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1438
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1439
      return -EINVAL;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1440
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1441
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1442
  ofi::StatsDumpCallback cb;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1443
  cb.done = false;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1444
  cb.rq = (ofp_stats_request*)xmemdup (rq, rq_len);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1445
  cb.s = st;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1446
  cb.state = 0;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1447
  cb.swtch = this;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1448
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1449
  if (cb.s)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1450
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1451
      int err = cb.s->DoInit (rq->body, body_len, &cb.state);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1452
      if (err)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1453
        {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1454
          NS_LOG_WARN ("failed initialization of stats request type " << type << ": " << strerror (-err));
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1455
          free (cb.rq);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1456
          return err;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1457
        }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1458
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1459
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1460
  if (m_controller != 0)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1461
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1462
      m_controller->StartDump (&cb);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1463
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1464
  else
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1465
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1466
      NS_LOG_ERROR ("Switch needs to be registered to a controller in order to start the stats reply.");
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1467
    }
7185
e27da23c35b5 openflow coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6890
diff changeset
  1468
6890
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1469
  return 0;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1470
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1471
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1472
int
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1473
OpenFlowSwitchNetDevice::ReceiveEchoRequest (const void *oh)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1474
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1475
  return SendOpenflowBuffer (make_echo_reply ((ofp_header*)oh));
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1476
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1477
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1478
int
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1479
OpenFlowSwitchNetDevice::ReceiveEchoReply (const void *oh)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1480
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1481
  return 0;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1482
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1483
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1484
int
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1485
OpenFlowSwitchNetDevice::ForwardControlInput (const void *msg, size_t length)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1486
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1487
  // Check encapsulated length.
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1488
  ofp_header *oh = (ofp_header*) msg;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1489
  if (ntohs (oh->length) > length)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1490
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1491
      return -EINVAL;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1492
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1493
  assert (oh->version == OFP_VERSION);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1494
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1495
  int error = 0;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1496
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1497
  // Figure out how to handle it.
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1498
  switch (oh->type)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1499
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1500
    case OFPT_FEATURES_REQUEST:
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1501
      error = length < sizeof(ofp_header) ? -EFAULT : ReceiveFeaturesRequest (msg);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1502
      break;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1503
    case OFPT_GET_CONFIG_REQUEST:
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1504
      error = length < sizeof(ofp_header) ? -EFAULT : ReceiveGetConfigRequest (msg);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1505
      break;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1506
    case OFPT_SET_CONFIG:
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1507
      error = length < sizeof(ofp_switch_config) ? -EFAULT : ReceiveSetConfig (msg);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1508
      break;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1509
    case OFPT_PACKET_OUT:
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1510
      error = length < sizeof(ofp_packet_out) ? -EFAULT : ReceivePacketOut (msg);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1511
      break;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1512
    case OFPT_FLOW_MOD:
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1513
      error = length < sizeof(ofp_flow_mod) ? -EFAULT : ReceiveFlow (msg);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1514
      break;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1515
    case OFPT_PORT_MOD:
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1516
      error = length < sizeof(ofp_port_mod) ? -EFAULT : ReceivePortMod (msg);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1517
      break;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1518
    case OFPT_STATS_REQUEST:
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1519
      error = length < sizeof(ofp_stats_request) ? -EFAULT : ReceiveStatsRequest (msg);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1520
      break;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1521
    case OFPT_ECHO_REQUEST:
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1522
      error = length < sizeof(ofp_header) ? -EFAULT : ReceiveEchoRequest (msg);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1523
      break;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1524
    case OFPT_ECHO_REPLY:
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1525
      error = length < sizeof(ofp_header) ? -EFAULT : ReceiveEchoReply (msg);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1526
      break;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1527
    case OFPT_VPORT_MOD:
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1528
      error = length < sizeof(ofp_vport_mod) ? -EFAULT : ReceiveVPortMod (msg);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1529
      break;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1530
    case OFPT_VPORT_TABLE_FEATURES_REQUEST:
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1531
      error = length < sizeof(ofp_header) ? -EFAULT : ReceiveVPortTableFeaturesRequest (msg);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1532
      break;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1533
    default:
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1534
      SendErrorMsg ((ofp_error_type)OFPET_BAD_REQUEST, (ofp_bad_request_code)OFPBRC_BAD_TYPE, msg, length);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1535
      error = -EINVAL;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1536
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1537
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1538
  if (msg != 0)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1539
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1540
      free ((ofpbuf*)msg);
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1541
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1542
  return error;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1543
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1544
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1545
sw_chain*
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1546
OpenFlowSwitchNetDevice::GetChain ()
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1547
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1548
  return m_chain;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1549
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1550
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1551
uint32_t
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1552
OpenFlowSwitchNetDevice::GetNSwitchPorts (void) const
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1553
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1554
  NS_LOG_FUNCTION_NOARGS ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1555
  return m_ports.size ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1556
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1557
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1558
ofi::Port
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1559
OpenFlowSwitchNetDevice::GetSwitchPort (uint32_t n) const
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1560
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1561
  NS_LOG_FUNCTION_NOARGS ();
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1562
  return m_ports[n];
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1563
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1564
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1565
int
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1566
OpenFlowSwitchNetDevice::GetSwitchPortIndex (ofi::Port p)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1567
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1568
  for (size_t i = 0; i < m_ports.size (); i++)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1569
    {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1570
      if (m_ports[i].netdev == p.netdev)
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1571
        {
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1572
          return i;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1573
        }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1574
    }
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1575
  return -1;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1576
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1577
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1578
vport_table_t
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1579
OpenFlowSwitchNetDevice::GetVPortTable ()
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1580
{
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1581
  return m_vportTable;
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1582
}
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1583
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1584
} // namespace ns3
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1585
e5da7045526e Merge OpenFlow
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
  1586
#endif // NS3_OPENFLOW