1// 2// Copyright (C) 2012 The Android Open Source Project 3// 4// Licensed under the Apache License, Version 2.0 (the "License"); 5// you may not use this file except in compliance with the License. 6// You may obtain a copy of the License at 7// 8// http://www.apache.org/licenses/LICENSE-2.0 9// 10// Unless required by applicable law or agreed to in writing, software 11// distributed under the License is distributed on an "AS IS" BASIS, 12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13// See the License for the specific language governing permissions and 14// limitations under the License. 15// 16 17#ifndef SHILL_ARP_PACKET_H_ 18#define SHILL_ARP_PACKET_H_ 19 20#include "shill/net/byte_string.h" 21#include "shill/net/ip_address.h" 22 23namespace shill { 24 25// ArpPacket encapsulates the task of creating and parsing 26// Address Resolution Protocol (ARP) packets for IP and 27// IPv6 protocols on Ethernet (or Ethernet-like) networks. 28class ArpPacket { 29 public: 30 ArpPacket(); 31 ArpPacket(const IPAddress& local_ip, const IPAddress& remote_ip, 32 const ByteString& local_mac, const ByteString& remote_mac); 33 virtual ~ArpPacket(); 34 35 // Parse a payload and save to local parameters. 36 bool Parse(const ByteString& packet); 37 38 // Output a payload from local parameters. 39 bool FormatRequest(ByteString* packet) const; 40 41 // Returns true if this packet is an ARP response. 42 bool IsReply() const; 43 44 // Getters and seters. 45 const IPAddress& local_ip_address() const { return local_ip_address_; } 46 void set_local_ip_address(const IPAddress& address) { 47 local_ip_address_ = address; 48 } 49 50 const IPAddress& remote_ip_address() const { return remote_ip_address_; } 51 void set_remote_ip_address(const IPAddress& address) { 52 remote_ip_address_ = address; 53 } 54 55 const ByteString& local_mac_address() const { return local_mac_address_; } 56 void set_local_mac_address(const ByteString& address) { 57 local_mac_address_ = address; 58 } 59 60 const ByteString& remote_mac_address() const { return remote_mac_address_; } 61 void set_remote_mac_address(const ByteString& address) { 62 remote_mac_address_ = address; 63 } 64 65 uint16_t operation() const { return operation_; } 66 void set_operation(uint16_t operation) { 67 operation_ = operation; 68 } 69 70 private: 71 friend class ArpPacketTest; 72 73 // The minimum number of bytes of ARP payload which will produce the 74 // smallest valid Ethernet frame. 75 static const size_t kMinPayloadSize; 76 77 uint16_t operation_; 78 IPAddress local_ip_address_; 79 IPAddress remote_ip_address_; 80 ByteString local_mac_address_; 81 ByteString remote_mac_address_; 82 83 DISALLOW_COPY_AND_ASSIGN(ArpPacket); 84}; 85 86} // namespace shill 87 88#endif // SHILL_ARP_PACKET_H_ 89