| /* |
| * Copyright 2019, 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. |
| */ |
| |
| #pragma once |
| |
| #include "result.h" |
| |
| struct nl_cb; |
| struct nl_msg; |
| struct nl_sock; |
| struct nlmsgerr; |
| struct sockaddr_nl; |
| |
| class NetlinkMessage; |
| |
| class NetlinkSocket { |
| public: |
| NetlinkSocket(); |
| ~NetlinkSocket(); |
| |
| Result init(); |
| |
| /* Set the size of the receive buffer to |rxBufferSize| bytes and the |
| * transmit buffer to |txBufferSize| bytes. |
| */ |
| Result setBufferSizes(int rxBufferSize, int txBufferSize); |
| |
| Result setOnMsgInCallback(int (*callback)(struct nl_msg*, void*), |
| void* context); |
| Result setOnMsgOutCallback(int (*callback)(struct nl_msg*, void*), |
| void* context); |
| Result setOnSeqCheckCallback(int (*callback)(struct nl_msg*, void*), |
| void* context); |
| Result setOnAckCallback(int (*callback)(struct nl_msg*, void*), |
| void* context); |
| Result setOnErrorCallback(int (*callback)(struct sockaddr_nl*, |
| struct nlmsgerr*, |
| void*), |
| void* context); |
| |
| /* Connect socket to generic netlink. This needs to be done before generic |
| * netlink messages can be sent. After this is done the caller should use |
| * @resolveGenericNetlinkFamily to determine the generic family id to use. |
| * Then create NetlinkMessage's with that family id. |
| */ |
| Result connectGeneric(); |
| |
| /* Resolve a generic family name to a family identifier. This is used when |
| * sending generic netlink messages to indicate where the message should go. |
| * Examples of family names are "mac80211_hwsim" or "nl80211". |
| */ |
| int resolveNetlinkFamily(const char* familyName); |
| |
| /* Send a netlink message on this socket. */ |
| bool send(NetlinkMessage& message); |
| |
| /* Receive all pending message. This method does not return any messages, |
| * instead they will be provided through the callback set with |
| * setOnMsgInCallback. This callback will be called on the same thread as |
| * this method while this method is running. */ |
| bool receive(); |
| |
| int getFd() const; |
| |
| private: |
| struct nl_cb* mCallback = nullptr; |
| struct nl_sock* mSocket = nullptr; |
| }; |
| |