Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
119 changes: 119 additions & 0 deletions src/network/utils/sll-header.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2015 Université Pierre et Marie Curie
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation;
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Author: Matthieu Coudron <[email protected]>
*/
#include "sll-header.h"
#include "ns3/log.h"


namespace ns3 {

NS_LOG_COMPONENT_DEFINE ("SllHeader");

NS_OBJECT_ENSURE_REGISTERED (SllHeader);

SllHeader::SllHeader ()
: m_packetType (UNICAST_FROM_PEER_TO_ME),
m_arphdType (0),
m_addressLength (0),
m_address (0),
m_protocolType (0)
{
NS_LOG_FUNCTION (this);
}

SllHeader::~SllHeader ()
{
NS_LOG_FUNCTION (this);
}


TypeId
SllHeader::GetTypeId (void)
{
static TypeId tid = TypeId ("ns3::SllHeader")
.SetParent<Header> ()
.SetGroupName ("Network")
.AddConstructor<SllHeader> ()
;
return tid;
}

TypeId
SllHeader::GetInstanceTypeId (void) const
{
return GetTypeId ();
}

uint16_t
SllHeader::GetArpType () const
{
return m_arphdType;
}

void
SllHeader::SetArpType (uint16_t arphdType)
{
NS_LOG_FUNCTION (arphdType);
m_arphdType = arphdType;
}

void
SllHeader::SetPacketType (PacketType type)
{
NS_LOG_FUNCTION (type);
m_packetType = type;
}

void
SllHeader::Print (std::ostream &os) const
{
os << "SLLHeader packetType=" << m_packetType << " protocol=" << m_protocolType;
}

uint32_t
SllHeader::GetSerializedSize (void) const
{
return 2 + 2 + 2 + 8 + 2;
}

void
SllHeader::Serialize (Buffer::Iterator start) const
{
Buffer::Iterator i = start;
i.WriteHtonU16 (m_packetType);
i.WriteHtonU16 (m_arphdType);
i.WriteHtonU16 (m_addressLength);
i.WriteHtonU64 (m_address);
i.WriteHtonU16 (m_protocolType);
}

uint32_t
SllHeader::Deserialize (Buffer::Iterator start)
{
Buffer::Iterator i = start;
m_packetType = static_cast<PacketType> (i.ReadNtohU16 ());
m_arphdType = i.ReadNtohU16 ();
m_addressLength = i.ReadNtohU16 ();
m_address = i.ReadNtohU64 ();
m_protocolType = i.ReadNtohU16 ();

return GetSerializedSize ();
}

}
128 changes: 128 additions & 0 deletions src/network/utils/sll-header.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2015 Université Pierre et Marie Curie
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation;
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Author: Matthieu Coudron <[email protected]>
*/
#ifndef SLL_HEADER_H
#define SLL_HEADER_H

#include "ns3/buffer.h"
#include "ns3/header.h"
#include <stdint.h>

namespace ns3 {

/**
* \ingroup packet
*
* \brief Protocol header serialization and deserialization.
*
* Libpcap sometimes add an additional header to provide information that would be
* lost otherwise due to the link-layer/capture mechanism, for instance when capturing from
* "nlmon" device on linux
*
* \see http://www.tcpdump.org/linktypes/LINKTYPE_LINUX_SLL.html
* \see https://wiki.wireshark.org/SLL
*
* \verbatim
* +---------------------------+
* | Packet type |
* | (2 Octets) |
* +---------------------------+
* | ARPHRD_ type |
* | (2 Octets) |
* +---------------------------+
* | Link-layer address length |
* | (2 Octets) |
* +---------------------------+
* | Link-layer address |
* | (8 Octets) |
* +---------------------------+
* | Protocol type |
* | (2 Octets) |
* +---------------------------+
* | Payload |
* . .
* . .
* . .
* \endverbatim
*/
class SllHeader : public Header
{
public:
enum PacketType
{
UNICAST_FROM_PEER_TO_ME = 0, /**< the packet was specifically sent to us by somebody else */
BROADCAST_BY_PEER = 1, /**< packet was broadcast by somebody else */
MULTICAST_BY_PEER = 2, /**< packet was multicast, but not broadcast, by somebody else */
INTERCEPTED_PACKET = 3, /**< packet was sent to somebody else by somebody else **/
SENT_BY_US /**< the packet was sent by us */
};

/**
* \brief Get the type ID.
* \return the object TypeId
*/
static TypeId GetTypeId (void);
TypeId GetInstanceTypeId (void) const;

SllHeader ();
virtual ~SllHeader ();

/**
* The ARPHRD_ type field is in network byte order; it contains a Linux ARPHRD_ value for the link-layer device type.
*/
uint16_t GetArpType () const;

/**
* \return Packet type
*/
PacketType GetPacketType () const;

/**
* \param arphw ARP protocol hardware identifier
*/
void SetArpType (uint16_t arphdType);

/**
* \param type Depends on source and address of the packet
*/
void SetPacketType (PacketType type);

//! Inherited
virtual uint32_t GetSerializedSize (void) const;
virtual void Serialize (Buffer::Iterator start) const;
virtual uint32_t Deserialize (Buffer::Iterator start);

virtual void Print (std::ostream &os) const;

protected:
// declared in packet order
PacketType m_packetType;
uint16_t m_arphdType; /**< ARP protocol hardware identifier */
uint16_t m_addressLength;
uint64_t m_address;
uint16_t m_protocolType;
};



std::ostream & operator << (std::ostream &os, const SllHeader &header);

} // namespace ns3

#endif /* SLL_HEADER_H */
2 changes: 2 additions & 0 deletions src/network/wscript
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ def build(bld):
'utils/red-queue.cc',
'utils/simple-channel.cc',
'utils/simple-net-device.cc',
'utils/sll-header.cc',
'utils/packet-socket-client.cc',
'utils/packet-socket-server.cc',
'utils/packet-data-calculators.cc',
Expand Down Expand Up @@ -138,6 +139,7 @@ def build(bld):
'utils/sgi-hashmap.h',
'utils/simple-channel.h',
'utils/simple-net-device.h',
'utils/sll-header.h',
'utils/packet-socket-client.h',
'utils/packet-socket-server.h',
'utils/pcap-test.h',
Expand Down