1 /* 2 * Copyright (C) 2017 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 #pragma once 17 18 #include <netinet/icmp6.h> 19 #include <netinet/ip6.h> 20 21 #include <string> 22 #include <vector> 23 24 #include "message.h" 25 26 class Packet { 27 public: 28 enum class Type { 29 NeighborSolicitation, 30 NeighborAdvertisement, 31 RouterSolicitation, 32 RouterAdvertisement, 33 Other 34 }; 35 36 explicit Packet(Message& message); 37 38 // Create a string that can be used for debug purposes to describe 39 // what type of packet and potentially its target for certain types. 40 std::string description() const; 41 42 // Full size including IP header fullSize()43 size_t fullSize() const { 44 return mMessage.size(); 45 } 46 // Remaining size including ICMPv6 header but excluding IP header icmpSize()47 size_t icmpSize() const { 48 return mMessage.size() - sizeof(ip6_hdr); 49 } 50 type()51 Type type() const { 52 return mType; 53 } ip()54 const ip6_hdr* ip() const { 55 return mIp; 56 } icmp()57 const icmp6_hdr* icmp() const { 58 return mIcmp; 59 } 60 61 nd_opt_hdr* firstOpt(); 62 nd_opt_hdr* nextOpt(nd_opt_hdr* currentHeader); 63 64 private: 65 Message& mMessage; 66 Type mType; 67 68 const ip6_hdr* mIp; 69 const icmp6_hdr* mIcmp; 70 nd_opt_hdr* mFirstOpt; 71 }; 72 73