src/devices/p2p/p2p-topology.cc
author Tom Henderson <tomh@tomh.org>
Mon, 26 Mar 2007 06:39:20 -0700
changeset 376 5801e09f82bf
parent 375 de64c081a2e0
child 377 8fec8bed8a9e
permissions -rw-r--r--
Add net devices to net-device-list in topology
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
368
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
     1
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
     2
//
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
     3
// Copyright (c) 2006 Georgia Tech Research Corporation
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
     4
//
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
     5
// This program is free software; you can redistribute it and/or modify
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
     6
// it under the terms of the GNU General Public License version 2 as
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
     7
// published by the Free Software Foundation;
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
     8
//
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
     9
// This program is distributed in the hope that it will be useful,
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    10
// but WITHOUT ANY WARRANTY; without even the implied warranty of
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    11
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    12
// GNU General Public License for more details.
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    13
//
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    14
// You should have received a copy of the GNU General Public License
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    15
// along with this program; if not, write to the Free Software
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    16
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    17
//
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    18
// Author: George F. Riley<riley@ece.gatech.edu>
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    19
//
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    20
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    21
//
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    22
// Topology helper for ns3.
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    23
// George F. Riley, Georgia Tech, Spring 2007
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    24
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    25
#include "ns3/debug.h"
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    26
#include "ns3/assert.h"
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    27
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    28
#include "ns3/nstime.h"
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    29
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    30
#include "ns3/internet-node.h"
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    31
#include "ns3/ipv4-address.h"
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    32
#include "ns3/drop-tail.h"
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    33
#include "ns3/arp-ipv4-interface.h"
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    34
#include "ns3/ipv4.h"
376
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
    35
#include "ns3/net-device-list.h"
368
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    36
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    37
#include "p2p-channel.h"
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    38
#include "p2p-net-device.h"
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    39
#include "p2p-topology.h"
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    40
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    41
#define nil 0
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    42
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    43
namespace ns3 {
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    44
369
29ea5d1a83c8 Rename classes from Serial to PointToPoint
Tom Henderson <tomh@tomh.org>
parents: 368
diff changeset
    45
PointToPointChannel *
29ea5d1a83c8 Rename classes from Serial to PointToPoint
Tom Henderson <tomh@tomh.org>
parents: 368
diff changeset
    46
PointToPointTopology::AddPointToPointLink(
376
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
    47
  Node* n1,
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
    48
  const Ipv4Address& addr1,
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
    49
  Node* n2,
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
    50
  const Ipv4Address& addr2,
373
960c8e8721de Move simple-p2p.cc to DataRate; fix small bug in DataRate and add include guards
Tom Henderson <tomh@tomh.org>
parents: 369
diff changeset
    51
  const DataRate& bps,
368
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    52
  const Time& delay)
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    53
{
376
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
    54
  // First get the NetDeviceList capability from each node
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
    55
  NetDeviceList* ndl1 = n1->GetNetDeviceList();
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
    56
  NetDeviceList* ndl2 = n2->GetNetDeviceList();
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
    57
  if (!ndl1 || !ndl2) return nil;  // Both ends must have NetDeviceList
368
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    58
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    59
  // Duplex link is assumed to be subnetted as a /30
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    60
  // May run this unnumbered in the future?
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    61
  Ipv4Mask netmask("255.255.255.252");
376
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
    62
  NS_ASSERT (netmask.IsMatch(addr1,addr2));
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
    63
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
    64
  // create channel expicitly (XXX no reference counting here yet)
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
    65
  PointToPointChannel* channel = new PointToPointChannel(bps, delay);
368
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    66
376
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
    67
  PointToPointNetDevice* net1 = new PointToPointNetDevice(n1);
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
    68
  net1->AddQueue(Queue::Default().Copy());
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
    69
  ndl1->Add(net1);
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
    70
  Ipv4Interface *interf1 = new ArpIpv4Interface (n1, net1);
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
    71
  uint32_t index1 = n1->GetIpv4 ()->AddInterface (interf1);
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
    72
  net1->Attach (channel);
368
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    73
376
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
    74
  interf1->SetAddress (addr1);
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
    75
  interf1->SetNetworkMask (netmask);
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
    76
  interf1->SetUp ();
368
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    77
376
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
    78
  PointToPointNetDevice* net2 = new PointToPointNetDevice(n2);
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
    79
  net2->AddQueue(Queue::Default().Copy());
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
    80
  ndl2->Add(net2);
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
    81
  Ipv4Interface *interf2 = new ArpIpv4Interface (n2, net2);
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
    82
  uint32_t index2 = n2->GetIpv4 ()->AddInterface (interf2);
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
    83
  net2->Attach (channel);
368
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    84
376
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
    85
  interf2->SetAddress (addr2);
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
    86
  interf2->SetNetworkMask (netmask);
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
    87
  interf2->SetUp ();
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
    88
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
    89
  n1->GetIpv4 ()->AddHostRouteTo (addr2, index1);
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
    90
  n2->GetIpv4 ()->AddHostRouteTo (addr1, index2);
368
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    91
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    92
  return channel;
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    93
}
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
    94
376
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
    95
#if 0
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
    96
// Get the channel connecting node n1 to node n2
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
    97
Channel* Topology::GetChannel(Node* n1, Node* n2)
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
    98
{
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
    99
  NetDevice* nd = GetNetDevice(n1, n2);
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
   100
  if (!nd) return 0; // No net device, so no channel
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
   101
  return nd->GetChannel();
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
   102
}
368
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   103
376
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
   104
Queue* Topology::GetQueue(Node* n1, Node* n2)
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
   105
{
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
   106
  NetDevice* nd = GetNetDevice(n1, n2);
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
   107
  if (!nd) return 0; // No net device, so in queue
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
   108
  return nd->GetQueue();
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
   109
}
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
   110
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
   111
Queue* Topology::SetQueue(Node* n1, Node* n2, const Queue& q)
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
   112
{
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
   113
  NetDevice* nd = GetNetDevice(n1, n2);
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
   114
  if (!nd) return 0; // No net device, can't set queue
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
   115
  // Add the specified queue to the netdevice
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
   116
  return nd->SetQueue(q);
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
   117
}
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
   118
5801e09f82bf Add net devices to net-device-list in topology
Tom Henderson <tomh@tomh.org>
parents: 375
diff changeset
   119
368
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   120
P2PChannel* Topology::AddDuplexLink(Node* n1, const IPAddr& ip1, 
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   121
                                    Node* n2, const IPAddr& ip2,
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   122
                                    const Rate& rate, const Time& delay)
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   123
{
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   124
  // First get the NetDeviceList capability from each node
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   125
  NetDeviceList* ndl1 = n1->GetNetDeviceList();
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   126
  NetDeviceList* ndl2 = n2->GetNetDeviceList();
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   127
  if (!ndl1 || !ndl2) return nil;  // Both ends must have NetDeviceList
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   128
  // Get the net devices
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   129
  P2PNetDevice* nd1 = ndl1->Add(P2PNetDevice(n1, rate, nil));
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   130
  P2PNetDevice* nd2 = ndl2->Add(P2PNetDevice(n1, rate, nd1->GetChannel()));
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   131
  // Not implemented yet.  Add appropriate layer 2 protocol for
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   132
  // the net devices.
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   133
  // Get the L3 proto for node 1 and configure it with this device
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   134
  L3Demux*    l3demux1 = n1->GetL3Demux();
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   135
  L3Protocol* l3proto1 = nil;
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   136
  // If the node 1 l3 demux exists, find the coresponding l3 protocol
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   137
  if (l3demux1) l3proto1 = l3demux1->Lookup(ip1.L3Proto());
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   138
  // If the l3 protocol exists, configure this net device.  Use a mask
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   139
  // of all ones, since there is only one device on the remote end
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   140
  // of this link
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   141
  if (l3proto1) l3proto1->AddNetDevice(nd1, ip1, ip1.GetMask(ip1.Size()*8));
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   142
  // Same for node 2
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   143
  L3Demux*    l3demux2 = n2->GetL3Demux();
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   144
  L3Protocol* l3proto2 = nil;
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   145
  // If the node 2 l3 demux exists, find the coresponding l3 protocol
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   146
  if (l3demux2) l3proto2 = l3demux2->Lookup(ip2.L3Proto());
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   147
  if (l3proto2) l3proto2->AddNetDevice(nd2, ip2, ip2.GetMask(ip2.Size()*8));
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   148
  return dynamic_cast<P2PChannel*>(nd1->GetChannel());  // Always succeeds
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   149
}
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   150
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   151
// Get the net device connecting node n1 to n2.  For topologies where
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   152
// there are possibly multiple devices connecting n1 and n2 (for example
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   153
// wireless with two devices on different channels) this will return
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   154
// the first one found.
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   155
NetDevice* Topology::GetNetDevice(Node* n1, Node* n2)
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   156
{
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   157
  // First get the NetDeviceList capability from node 1
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   158
  NetDeviceList* ndl1 = n1->GetNetDeviceList();
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   159
  if (!ndl1) return 0; // No devices, return nil
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   160
  // Get the list of devices
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   161
  const NetDeviceList::NetDevices_t& dlist = ndl1->GetAll();
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   162
  for (NetDeviceList::NetDevices_t::const_iterator i = dlist.Begin();
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   163
       i != dlist.End(); ++i)
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   164
    { // Check each device
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   165
      NetDevice* nd = *i; // next device
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   166
      Channel* c = nd->GetChannel();
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   167
      if (!c) continue; // No channel
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   168
      if (c->NodeIsPeer(n2)) return nd; // found it
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   169
    }
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   170
  return 0; // None found
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   171
}
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   172
  
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   173
// Get the channel connecting node n1 to node n2
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   174
Channel* Topology::GetChannel(Node* n1, Node* n2)
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   175
{
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   176
  NetDevice* nd = GetNetDevice(n1, n2);
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   177
  if (!nd) return 0; // No net device, so no channel
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   178
  return nd->GetChannel();
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   179
}
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   180
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   181
Queue* Topology::GetQueue(Node* n1, Node* n2)
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   182
{
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   183
  NetDevice* nd = GetNetDevice(n1, n2);
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   184
  if (!nd) return 0; // No net device, so in queue
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   185
  return nd->GetQueue();
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   186
}
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   187
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   188
Queue* Topology::SetQueue(Node* n1, Node* n2, const Queue& q)
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   189
{
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   190
  NetDevice* nd = GetNetDevice(n1, n2);
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   191
  if (!nd) return 0; // No net device, can't set queue
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   192
  // Add the specified queue to the netdevice
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   193
  return nd->SetQueue(q);
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   194
}
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   195
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   196
#endif
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   197
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   198
} // namespace ns3
1df1165d6a68 Rename file names from serial to p2p
Tom Henderson <tomh@tomh.org>
parents:
diff changeset
   199