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