1c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 2c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Copyright (C) 2012 The Android Open Source Project 3c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 4c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Licensed under the Apache License, Version 2.0 (the "License"); 5c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// you may not use this file except in compliance with the License. 6c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// You may obtain a copy of the License at 7c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 8c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// http://www.apache.org/licenses/LICENSE-2.0 9c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 10c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Unless required by applicable law or agreed to in writing, software 11c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// distributed under the License is distributed on an "AS IS" BASIS, 12c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// See the License for the specific language governing permissions and 14c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// limitations under the License. 15c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 16dd7df792d2401741183a954f3f6e97d4c6de1e22Paul Stewart 178d6b59704591ba9fad57751858835dc332dbdd37Peter Qiu#ifndef SHILL_NET_RTNL_MESSAGE_H_ 188d6b59704591ba9fad57751858835dc332dbdd37Peter Qiu#define SHILL_NET_RTNL_MESSAGE_H_ 19dd7df792d2401741183a954f3f6e97d4c6de1e22Paul Stewart 208a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko#include <unordered_map> 213ef4f53096a10056a26ea38ad85b8a9a12845a9dPeter Qiu#include <vector> 228a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko 23cc67c52a2c00f90e877971d552208dd99825d84eBen Chan#include <base/macros.h> 243e20a2341d0aeb7681e4ee0f89eae6817ade2b3bEric Shienbrood#include <base/stl_util.h> 25dd7df792d2401741183a954f3f6e97d4c6de1e22Paul Stewart 268d6b59704591ba9fad57751858835dc332dbdd37Peter Qiu#include "shill/net/byte_string.h" 278d6b59704591ba9fad57751858835dc332dbdd37Peter Qiu#include "shill/net/ip_address.h" 281da9419d10a1a617cc634e79772335fa08b3420fPeter Qiu#include "shill/net/shill_export.h" 29dd7df792d2401741183a954f3f6e97d4c6de1e22Paul Stewart 30dd7df792d2401741183a954f3f6e97d4c6de1e22Paul Stewartstruct rtattr; 31dd7df792d2401741183a954f3f6e97d4c6de1e22Paul Stewart 32dd7df792d2401741183a954f3f6e97d4c6de1e22Paul Stewartnamespace shill { 33dd7df792d2401741183a954f3f6e97d4c6de1e22Paul Stewart 34dd7df792d2401741183a954f3f6e97d4c6de1e22Paul Stewartstruct RTNLHeader; 35dd7df792d2401741183a954f3f6e97d4c6de1e22Paul Stewart 36ba24e6fd0f0f2b974e0e73039d7d92bb475f6857Peter Qiuclass SHILL_EXPORT RTNLMessage { 378a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko public: 388a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko enum Type { 398a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko kTypeUnknown, 408a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko kTypeLink, 418a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko kTypeAddress, 423ef4f53096a10056a26ea38ad85b8a9a12845a9dPeter Qiu kTypeRoute, 433ef4f53096a10056a26ea38ad85b8a9a12845a9dPeter Qiu kTypeRdnss, 44ad576bffebd92b9adf42ea6b9e43515169787ceeGarret Kelly kTypeDnssl, 45ad576bffebd92b9adf42ea6b9e43515169787ceeGarret Kelly kTypeNeighbor, 468a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko }; 478a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko 488a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko enum Mode { 498a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko kModeUnknown, 508a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko kModeGet, 518a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko kModeAdd, 528a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko kModeDelete, 538a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko kModeQuery 548a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko }; 558a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko 568a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko struct LinkStatus { 578a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko LinkStatus() 588a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko : type(0), 598a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko flags(0), 608a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko change(0) {} 618a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko LinkStatus(unsigned int in_type, 628a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko unsigned int in_flags, 638a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko unsigned int in_change) 648a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko : type(in_type), 658a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko flags(in_flags), 668a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko change(in_change) {} 678a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko unsigned int type; 688a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko unsigned int flags; 698a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko unsigned int change; 708a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko }; 718a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko 728a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko struct AddressStatus { 738a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko AddressStatus() 748a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko : prefix_len(0), 758a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko flags(0), 768a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko scope(0) {} 778a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko AddressStatus(unsigned char prefix_len_in, 788a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko unsigned char flags_in, 798a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko unsigned char scope_in) 808a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko : prefix_len(prefix_len_in), 818a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko flags(flags_in), 828a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko scope(scope_in) {} 838a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko unsigned char prefix_len; 848a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko unsigned char flags; 858a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko unsigned char scope; 868a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko }; 878a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko 888a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko struct RouteStatus { 898a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko RouteStatus() 908a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko : dst_prefix(0), 918a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko src_prefix(0), 928a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko table(0), 938a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko protocol(0), 948a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko scope(0), 958a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko type(0), 968a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko flags(0) {} 978a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko RouteStatus(unsigned char dst_prefix_in, 988a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko unsigned char src_prefix_in, 998a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko unsigned char table_in, 1008a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko unsigned char protocol_in, 1018a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko unsigned char scope_in, 1028a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko unsigned char type_in, 1038a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko unsigned char flags_in) 1048a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko : dst_prefix(dst_prefix_in), 1058a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko src_prefix(src_prefix_in), 1068a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko table(table_in), 1078a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko protocol(protocol_in), 1088a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko scope(scope_in), 1098a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko type(type_in), 1108a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko flags(flags_in) {} 1118a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko unsigned char dst_prefix; 1128a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko unsigned char src_prefix; 1138a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko unsigned char table; 1148a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko unsigned char protocol; 1158a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko unsigned char scope; 1168a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko unsigned char type; 1178a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko unsigned char flags; 1188a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko }; 1198a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko 120ad576bffebd92b9adf42ea6b9e43515169787ceeGarret Kelly struct NeighborStatus { 121ad576bffebd92b9adf42ea6b9e43515169787ceeGarret Kelly NeighborStatus() 122ad576bffebd92b9adf42ea6b9e43515169787ceeGarret Kelly : state(0), 123ad576bffebd92b9adf42ea6b9e43515169787ceeGarret Kelly flags(0), 124ad576bffebd92b9adf42ea6b9e43515169787ceeGarret Kelly type(0) {} 125ad576bffebd92b9adf42ea6b9e43515169787ceeGarret Kelly NeighborStatus(uint16_t state_in, 126ad576bffebd92b9adf42ea6b9e43515169787ceeGarret Kelly uint8_t flags_in, 127ad576bffebd92b9adf42ea6b9e43515169787ceeGarret Kelly uint8_t type_in) 128ad576bffebd92b9adf42ea6b9e43515169787ceeGarret Kelly : state(state_in), 129ad576bffebd92b9adf42ea6b9e43515169787ceeGarret Kelly flags(flags_in), 130ad576bffebd92b9adf42ea6b9e43515169787ceeGarret Kelly type(type_in) {} 131ad576bffebd92b9adf42ea6b9e43515169787ceeGarret Kelly uint16_t state; 132ad576bffebd92b9adf42ea6b9e43515169787ceeGarret Kelly uint8_t flags; 133ad576bffebd92b9adf42ea6b9e43515169787ceeGarret Kelly uint8_t type; 134ad576bffebd92b9adf42ea6b9e43515169787ceeGarret Kelly }; 135ad576bffebd92b9adf42ea6b9e43515169787ceeGarret Kelly 1363ef4f53096a10056a26ea38ad85b8a9a12845a9dPeter Qiu struct RdnssOption { 1373ef4f53096a10056a26ea38ad85b8a9a12845a9dPeter Qiu RdnssOption() 1383ef4f53096a10056a26ea38ad85b8a9a12845a9dPeter Qiu : lifetime(0) {} 1397fab89734d88724a288e96a9996b15548c5294c7Ben Chan RdnssOption(uint32_t lifetime_in, 1403ef4f53096a10056a26ea38ad85b8a9a12845a9dPeter Qiu std::vector<IPAddress> addresses_in) 1413ef4f53096a10056a26ea38ad85b8a9a12845a9dPeter Qiu : lifetime(lifetime_in), 1423ef4f53096a10056a26ea38ad85b8a9a12845a9dPeter Qiu addresses(addresses_in) {} 1437fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint32_t lifetime; 1443ef4f53096a10056a26ea38ad85b8a9a12845a9dPeter Qiu std::vector<IPAddress> addresses; 1453ef4f53096a10056a26ea38ad85b8a9a12845a9dPeter Qiu }; 1463ef4f53096a10056a26ea38ad85b8a9a12845a9dPeter Qiu 1478a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko // Empty constructor 1488a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko RTNLMessage(); 1498a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko // Build an RTNL message from arguments 1508a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko RTNLMessage(Type type, 1518a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko Mode mode, 1528a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko unsigned int flags, 1537fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint32_t seq, 1547fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint32_t pid, 1558a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko int interface_index, 1568a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko IPAddress::Family family); 1578a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko 1588a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko // Parse an RTNL message. Returns true on success. 159e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart bool Decode(const ByteString& data); 1608a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko // Encode an RTNL message. Returns empty ByteString on failure. 1618a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko ByteString Encode() const; 1628a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko // Reset all fields. 1638a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko void Reset(); 1648a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko 1658a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko // Getters and setters 1668a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko Type type() const { return type_; } 1678a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko Mode mode() const { return mode_; } 1687fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint16_t flags() const { return flags_; } 1697fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint32_t seq() const { return seq_; } 1707fab89734d88724a288e96a9996b15548c5294c7Ben Chan void set_seq(uint32_t seq) { seq_ = seq; } 1717fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint32_t pid() const { return pid_; } 1727fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint32_t interface_index() const { return interface_index_; } 1738a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko IPAddress::Family family() const { return family_; } 1748a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko 175e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart const LinkStatus& link_status() const { return link_status_; } 176e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart void set_link_status(const LinkStatus& link_status) { 1778a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko link_status_ = link_status; 1788a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko } 179e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart const AddressStatus& address_status() const { return address_status_; } 180e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart void set_address_status(const AddressStatus& address_status) { 1818a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko address_status_ = address_status; 1828a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko } 183e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart const RouteStatus& route_status() const { return route_status_; } 184e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart void set_route_status(const RouteStatus& route_status) { 1858a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko route_status_ = route_status; 1868a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko } 187e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart const RdnssOption& rdnss_option() const { return rdnss_option_; } 188e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart void set_rdnss_option(const RdnssOption& rdnss_option) { 1893ef4f53096a10056a26ea38ad85b8a9a12845a9dPeter Qiu rdnss_option_ = rdnss_option; 1903ef4f53096a10056a26ea38ad85b8a9a12845a9dPeter Qiu } 191e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart const NeighborStatus& neighbor_status() const { return neighbor_status_; } 192e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart void set_neighbor_status(const NeighborStatus& neighbor_status) { 193ad576bffebd92b9adf42ea6b9e43515169787ceeGarret Kelly neighbor_status_ = neighbor_status; 194ad576bffebd92b9adf42ea6b9e43515169787ceeGarret Kelly } 1958a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko // GLint hates "unsigned short", and I don't blame it, but that's the 1967fab89734d88724a288e96a9996b15548c5294c7Ben Chan // type that's used in the system headers. Use uint16_t instead and hope 1978a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko // that the conversion never ends up truncating on some strange platform. 1987fab89734d88724a288e96a9996b15548c5294c7Ben Chan bool HasAttribute(uint16_t attr) const { 1998a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko return ContainsKey(attributes_, attr); 2008a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko } 2017fab89734d88724a288e96a9996b15548c5294c7Ben Chan const ByteString GetAttribute(uint16_t attr) const { 2028a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko return HasAttribute(attr) ? 2038a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko attributes_.find(attr)->second : ByteString(0); 2048a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko } 205e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart void SetAttribute(uint16_t attr, const ByteString& val) { 2068a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko attributes_[attr] = val; 2078a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko } 2088a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko 2098a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko private: 210e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart SHILL_PRIVATE bool DecodeInternal(const ByteString& msg); 211e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart SHILL_PRIVATE bool DecodeLink(const RTNLHeader* hdr, 212ba24e6fd0f0f2b974e0e73039d7d92bb475f6857Peter Qiu Mode mode, 213e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart rtattr** attr_data, 214e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart int* attr_length); 215e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart SHILL_PRIVATE bool DecodeAddress(const RTNLHeader* hdr, 216ba24e6fd0f0f2b974e0e73039d7d92bb475f6857Peter Qiu Mode mode, 217e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart rtattr** attr_data, 218e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart int* attr_length); 219e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart SHILL_PRIVATE bool DecodeRoute(const RTNLHeader* hdr, 220ba24e6fd0f0f2b974e0e73039d7d92bb475f6857Peter Qiu Mode mode, 221e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart rtattr** attr_data, 222e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart int* attr_length); 223e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart SHILL_PRIVATE bool DecodeNdUserOption(const RTNLHeader* hdr, 224ba24e6fd0f0f2b974e0e73039d7d92bb475f6857Peter Qiu Mode mode, 225e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart rtattr** attr_data, 226e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart int* attr_length); 227e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart SHILL_PRIVATE bool ParseRdnssOption(const uint8_t* data, 228ba24e6fd0f0f2b974e0e73039d7d92bb475f6857Peter Qiu int length, 229ba24e6fd0f0f2b974e0e73039d7d92bb475f6857Peter Qiu uint32_t lifetime); 230e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart SHILL_PRIVATE bool DecodeNeighbor(const RTNLHeader* hdr, 231ad576bffebd92b9adf42ea6b9e43515169787ceeGarret Kelly Mode mode, 232e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart rtattr** attr_data, 233e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart int* attr_length); 234e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart SHILL_PRIVATE bool EncodeLink(RTNLHeader* hdr) const; 235e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart SHILL_PRIVATE bool EncodeAddress(RTNLHeader* hdr) const; 236e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart SHILL_PRIVATE bool EncodeRoute(RTNLHeader* hdr) const; 237e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart SHILL_PRIVATE bool EncodeNeighbor(RTNLHeader* hdr) const; 2388a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko 2398a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko Type type_; 2408a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko Mode mode_; 2417fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint16_t flags_; 2427fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint32_t seq_; 2437fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint32_t pid_; 2448a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko unsigned int interface_index_; 2458a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko IPAddress::Family family_; 2468a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko LinkStatus link_status_; 2478a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko AddressStatus address_status_; 2488a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko RouteStatus route_status_; 249ad576bffebd92b9adf42ea6b9e43515169787ceeGarret Kelly NeighborStatus neighbor_status_; 2503ef4f53096a10056a26ea38ad85b8a9a12845a9dPeter Qiu RdnssOption rdnss_option_; 2517fab89734d88724a288e96a9996b15548c5294c7Ben Chan std::unordered_map<uint16_t, ByteString> attributes_; 2528a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko 2538a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko DISALLOW_COPY_AND_ASSIGN(RTNLMessage); 254dd7df792d2401741183a954f3f6e97d4c6de1e22Paul Stewart}; 255dd7df792d2401741183a954f3f6e97d4c6de1e22Paul Stewart 256dd7df792d2401741183a954f3f6e97d4c6de1e22Paul Stewart} // namespace shill 257dd7df792d2401741183a954f3f6e97d4c6de1e22Paul Stewart 2588d6b59704591ba9fad57751858835dc332dbdd37Peter Qiu#endif // SHILL_NET_RTNL_MESSAGE_H_ 259