87 lines
2.6 KiB
C++
87 lines
2.6 KiB
C++
//
|
|
// Copyright (C) 2012 The Android Open Source Project
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
//
|
|
|
|
#ifndef SHILL_ARP_CLIENT_H_
|
|
#define SHILL_ARP_CLIENT_H_
|
|
|
|
#include <memory>
|
|
|
|
#include <base/macros.h>
|
|
|
|
namespace shill {
|
|
|
|
class ArpPacket;
|
|
class ByteString;
|
|
class Sockets;
|
|
class ScopedSocketCloser;
|
|
|
|
// ArpClient task of creating ARP-capable sockets, as well as
|
|
// transmitting requests on and receiving responses from such
|
|
// sockets.
|
|
class ArpClient {
|
|
public:
|
|
explicit ArpClient(int interface_index);
|
|
virtual ~ArpClient();
|
|
|
|
// Create a socket for reception of ARP replies, and packet trasmission.
|
|
// Returns true if successful, false otherwise.
|
|
virtual bool StartReplyListener();
|
|
|
|
// Create a socket for reception of ARP requests, and packet trasmission.
|
|
// Returns true if successful, false otherwise.
|
|
virtual bool StartRequestListener();
|
|
|
|
// Destroy the client socket.
|
|
virtual void Stop();
|
|
|
|
// Receive an ARP request or reply and parse its contents into |packet|.
|
|
// Also return the sender's MAC address (which may be different from the
|
|
// MAC address in the ARP response) in |sender|. Returns true on
|
|
// succes, false otherwise.
|
|
virtual bool ReceivePacket(ArpPacket* packet, ByteString* sender) const;
|
|
|
|
// Send a formatted ARP request from |packet|. Returns true on
|
|
// success, false otherwise.
|
|
virtual bool TransmitRequest(const ArpPacket& packet) const;
|
|
|
|
virtual int socket() const { return socket_; }
|
|
|
|
bool IsStarted() { return socket_closer_.get(); }
|
|
|
|
private:
|
|
friend class ArpClientTest;
|
|
|
|
// Offset of the ARP OpCode within a captured ARP packet.
|
|
static const size_t kArpOpOffset;
|
|
|
|
// The largest packet we expect to receive as an ARP client.
|
|
static const size_t kMaxArpPacketLength;
|
|
|
|
// Start an ARP listener that listens for |arp_opcode| ARP packets.
|
|
bool Start(uint16_t arp_opcode);
|
|
bool CreateSocket(uint16_t arp_opcode);
|
|
|
|
const int interface_index_;
|
|
std::unique_ptr<Sockets> sockets_;
|
|
std::unique_ptr<ScopedSocketCloser> socket_closer_;
|
|
int socket_;
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(ArpClient);
|
|
};
|
|
|
|
} // namespace shill
|
|
|
|
#endif // SHILL_ARP_CLIENT_H_
|