| /* |
| * Copyright 2017, 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" |
| |
| #include <arpa/inet.h> |
| |
| class Message; |
| |
| class Socket { |
| public: |
| Socket(); |
| Socket(const Socket&) = delete; |
| ~Socket(); |
| |
| Socket& operator=(const Socket&) = delete; |
| |
| int get() const { return mSocketFd; } |
| // Open a socket, |domain|, |type| and |protocol| are as described in the |
| // man pages for socket. |
| Result open(int domain, int type, int protocol); |
| // Bind to a generic |sockaddr| of size |sockaddrLength| |
| Result bind(const void* sockaddr, size_t sockaddrLength); |
| // Bind to an IP |address| and |port| |
| Result bindIp(in_addr_t address, uint16_t port); |
| // Bind a raw socket to the interface with index |interfaceIndex|. |
| Result bindRaw(unsigned int interfaceIndex); |
| // Send data in |message| on an IP socket to |
| // |destinationAddress|:|destinationPort|, the message will egress on the |
| // interface specified by |interfaceIndex| |
| Result sendOnInterface(unsigned int interfaceIndex, |
| in_addr_t destinationAddress, |
| uint16_t destinationPort, |
| const Message& message); |
| // Send |message| as a UDP datagram on a raw socket. The source address of |
| // the message will be |source|:|sourcePort| and the destination will be |
| // |destination|:|destinationPort|. The message will be sent on the |
| // interface indicated by |interfaceIndex|. |
| Result sendRawUdp(in_addr_t source, |
| uint16_t sourcePort, |
| in_addr_t destination, |
| uint16_t destinationPort, |
| unsigned int interfaceIndex, |
| const Message& message); |
| // Receive data on the socket and indicate which interface the data was |
| // received on in |interfaceIndex|. The received data is placed in |message| |
| Result receiveFromInterface(Message* message, unsigned int* interfaceIndex); |
| // Receive UDP data on a raw socket. Expect that the protocol in the IP |
| // header is UDP and that the port in the UDP header is |expectedPort|. If |
| // the received data is valid then |isValid| will be set to true, otherwise |
| // false. The validity check includes the expected values as well as basic |
| // size requirements to fit the expected protocol headers. The method will |
| // only return an error result if the actual receiving fails. |
| Result receiveRawUdp(uint16_t expectedPort, |
| Message* message, |
| bool* isValid); |
| // Enable |optionName| on option |level|. These values are the same as used |
| // in setsockopt calls. |
| Result enableOption(int level, int optionName); |
| private: |
| int mSocketFd; |
| }; |
| |