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// 16633ac6f0d56a62f8fd21ba7d9a15818fe080fb2fDarin Petkov 178d6b59704591ba9fad57751858835dc332dbdd37Peter Qiu#ifndef SHILL_NET_SOCKETS_H_ 188d6b59704591ba9fad57751858835dc332dbdd37Peter Qiu#define SHILL_NET_SOCKETS_H_ 19633ac6f0d56a62f8fd21ba7d9a15818fe080fb2fDarin Petkov 20ac1328e5143f6ee0054d5cb2f7d17754c16a3814Paul Stewart#include <linux/filter.h> 217a791fd9e1f011ab9ce17630d7c799eab497b246Timothy Jennison#include <netinet/in.h> 22ef34f18b77b5e5f0c9f36f78b65513fcc7acb41eDarin Petkov#include <sys/socket.h> 23633ac6f0d56a62f8fd21ba7d9a15818fe080fb2fDarin Petkov#include <sys/types.h> 24633ac6f0d56a62f8fd21ba7d9a15818fe080fb2fDarin Petkov 25fa2100e878bb51d2c51b68a2f5b34124e73b4aa0Wade Guthrie#include <string> 26fa2100e878bb51d2c51b68a2f5b34124e73b4aa0Wade Guthrie 276a8de0eb674bb93b98addc9b9edf00c077326549Christopher Grant#include <base/compiler_specific.h> 28cc67c52a2c00f90e877971d552208dd99825d84eBen Chan#include <base/macros.h> 29e0a312e2f3b4e213c8872b86a9f3117a066d2e91Darin Petkov 301da9419d10a1a617cc634e79772335fa08b3420fPeter Qiu#include "shill/net/shill_export.h" 31ba24e6fd0f0f2b974e0e73039d7d92bb475f6857Peter Qiu 32633ac6f0d56a62f8fd21ba7d9a15818fe080fb2fDarin Petkovnamespace shill { 33633ac6f0d56a62f8fd21ba7d9a15818fe080fb2fDarin Petkov 34633ac6f0d56a62f8fd21ba7d9a15818fe080fb2fDarin Petkov// A "sys/socket.h" abstraction allowing mocking in tests. 35ba24e6fd0f0f2b974e0e73039d7d92bb475f6857Peter Qiuclass SHILL_EXPORT Sockets { 36633ac6f0d56a62f8fd21ba7d9a15818fe080fb2fDarin Petkov public: 37fa2100e878bb51d2c51b68a2f5b34124e73b4aa0Wade Guthrie Sockets(); 38633ac6f0d56a62f8fd21ba7d9a15818fe080fb2fDarin Petkov virtual ~Sockets(); 39633ac6f0d56a62f8fd21ba7d9a15818fe080fb2fDarin Petkov 4016f98260d5f69c2c4b5a7284756c6e7b8a19239aPaul Stewart static const int kInvalidFileDescriptor = -1; 4116f98260d5f69c2c4b5a7284756c6e7b8a19239aPaul Stewart 42f65320cc1c04ea9e09cc8656e87fe9912c601e9aPaul Stewart // accept 439f62cd1aedc909d42ffa6fee3d37d1370222f62aWade Guthrie virtual int Accept(int sockfd, 44e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart struct sockaddr* addr, 45e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart socklen_t* addrlen) const; 46f65320cc1c04ea9e09cc8656e87fe9912c601e9aPaul Stewart 47ac1328e5143f6ee0054d5cb2f7d17754c16a3814Paul Stewart // getsockopt(sockfd, SOL_SOCKET, SO_ATTACH_FILTER, ...) 48e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart virtual int AttachFilter(int sockfd, struct sock_fprog* pf) const; 49ac1328e5143f6ee0054d5cb2f7d17754c16a3814Paul Stewart 50633ac6f0d56a62f8fd21ba7d9a15818fe080fb2fDarin Petkov // bind 519f62cd1aedc909d42ffa6fee3d37d1370222f62aWade Guthrie virtual int Bind(int sockfd, 52e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart const struct sockaddr* addr, 539f62cd1aedc909d42ffa6fee3d37d1370222f62aWade Guthrie socklen_t addrlen) const; 54633ac6f0d56a62f8fd21ba7d9a15818fe080fb2fDarin Petkov 55f65320cc1c04ea9e09cc8656e87fe9912c601e9aPaul Stewart // setsockopt(s, SOL_SOCKET, SO_BINDTODEVICE ...) 56e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart virtual int BindToDevice(int sockfd, const std::string& device) const; 57f65320cc1c04ea9e09cc8656e87fe9912c601e9aPaul Stewart 587a791fd9e1f011ab9ce17630d7c799eab497b246Timothy Jennison // setsockopt(s, SOL_SOCKET, SO_REUSEADDR, ...) 597a791fd9e1f011ab9ce17630d7c799eab497b246Timothy Jennison virtual int ReuseAddress(int sockfd) const; 607a791fd9e1f011ab9ce17630d7c799eab497b246Timothy Jennison 617a791fd9e1f011ab9ce17630d7c799eab497b246Timothy Jennison // setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, ...) 627a791fd9e1f011ab9ce17630d7c799eab497b246Timothy Jennison virtual int AddMulticastMembership(int sockfd, in_addr_t addr) const; 637a791fd9e1f011ab9ce17630d7c799eab497b246Timothy Jennison 64633ac6f0d56a62f8fd21ba7d9a15818fe080fb2fDarin Petkov // close 659f62cd1aedc909d42ffa6fee3d37d1370222f62aWade Guthrie virtual int Close(int fd) const; 66633ac6f0d56a62f8fd21ba7d9a15818fe080fb2fDarin Petkov 67f65320cc1c04ea9e09cc8656e87fe9912c601e9aPaul Stewart // connect 689f62cd1aedc909d42ffa6fee3d37d1370222f62aWade Guthrie virtual int Connect(int sockfd, 69e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart const struct sockaddr* addr, 709f62cd1aedc909d42ffa6fee3d37d1370222f62aWade Guthrie socklen_t addrlen) const; 71f65320cc1c04ea9e09cc8656e87fe9912c601e9aPaul Stewart 72f65320cc1c04ea9e09cc8656e87fe9912c601e9aPaul Stewart // errno 739f62cd1aedc909d42ffa6fee3d37d1370222f62aWade Guthrie virtual int Error() const; 74f65320cc1c04ea9e09cc8656e87fe9912c601e9aPaul Stewart 75f65320cc1c04ea9e09cc8656e87fe9912c601e9aPaul Stewart // errno 769f62cd1aedc909d42ffa6fee3d37d1370222f62aWade Guthrie virtual std::string ErrorString() const; 77f65320cc1c04ea9e09cc8656e87fe9912c601e9aPaul Stewart 78f65320cc1c04ea9e09cc8656e87fe9912c601e9aPaul Stewart // getsockname 799f62cd1aedc909d42ffa6fee3d37d1370222f62aWade Guthrie virtual int GetSockName(int sockfd, 80e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart struct sockaddr* addr, 81e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart socklen_t* addrlen) const; 82f65320cc1c04ea9e09cc8656e87fe9912c601e9aPaul Stewart 83f65320cc1c04ea9e09cc8656e87fe9912c601e9aPaul Stewart // getsockopt(sockfd, SOL_SOCKET, SO_ERROR, ...) 849f62cd1aedc909d42ffa6fee3d37d1370222f62aWade Guthrie virtual int GetSocketError(int sockfd) const; 85f65320cc1c04ea9e09cc8656e87fe9912c601e9aPaul Stewart 86e0a312e2f3b4e213c8872b86a9f3117a066d2e91Darin Petkov // ioctl 87e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart virtual int Ioctl(int d, int request, void* argp) const; 88e0a312e2f3b4e213c8872b86a9f3117a066d2e91Darin Petkov 89f65320cc1c04ea9e09cc8656e87fe9912c601e9aPaul Stewart // listen 909f62cd1aedc909d42ffa6fee3d37d1370222f62aWade Guthrie virtual int Listen(int sockfd, int backlog) const; 91f65320cc1c04ea9e09cc8656e87fe9912c601e9aPaul Stewart 92ac1328e5143f6ee0054d5cb2f7d17754c16a3814Paul Stewart // recvfrom 93e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart virtual ssize_t RecvFrom(int sockfd, void* buf, size_t len, int flags, 94e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart struct sockaddr* src_addr, socklen_t* addrlen) const; 95ac1328e5143f6ee0054d5cb2f7d17754c16a3814Paul Stewart 96fa2100e878bb51d2c51b68a2f5b34124e73b4aa0Wade Guthrie // select 97fa2100e878bb51d2c51b68a2f5b34124e73b4aa0Wade Guthrie virtual int Select(int nfds, 98e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart fd_set* readfds, 99e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart fd_set* writefds, 100e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart fd_set* exceptfds, 101e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart struct timeval* timeout) const; 102fa2100e878bb51d2c51b68a2f5b34124e73b4aa0Wade Guthrie 103633ac6f0d56a62f8fd21ba7d9a15818fe080fb2fDarin Petkov // send 1049f62cd1aedc909d42ffa6fee3d37d1370222f62aWade Guthrie virtual ssize_t Send(int sockfd, 105e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart const void* buf, 1069f62cd1aedc909d42ffa6fee3d37d1370222f62aWade Guthrie size_t len, 1079f62cd1aedc909d42ffa6fee3d37d1370222f62aWade Guthrie int flags) const; 108633ac6f0d56a62f8fd21ba7d9a15818fe080fb2fDarin Petkov 109633ac6f0d56a62f8fd21ba7d9a15818fe080fb2fDarin Petkov // sendto 1109f62cd1aedc909d42ffa6fee3d37d1370222f62aWade Guthrie virtual ssize_t SendTo(int sockfd, 111e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart const void* buf, 1129f62cd1aedc909d42ffa6fee3d37d1370222f62aWade Guthrie size_t len, 1139f62cd1aedc909d42ffa6fee3d37d1370222f62aWade Guthrie int flags, 114e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart const struct sockaddr* dest_addr, 1159f62cd1aedc909d42ffa6fee3d37d1370222f62aWade Guthrie socklen_t addrlen) const; 116633ac6f0d56a62f8fd21ba7d9a15818fe080fb2fDarin Petkov 117f65320cc1c04ea9e09cc8656e87fe9912c601e9aPaul Stewart // fcntl(sk, F_SETFL, fcntl(sk, F_GETFL) | O_NONBLOCK) 1189f62cd1aedc909d42ffa6fee3d37d1370222f62aWade Guthrie virtual int SetNonBlocking(int sockfd) const; 119f65320cc1c04ea9e09cc8656e87fe9912c601e9aPaul Stewart 120f253c849c733489aa39df8039886ed1fd3101b37Julius Werner // setsockopt(SO_RCVBUFFORCE) 1219f62cd1aedc909d42ffa6fee3d37d1370222f62aWade Guthrie virtual int SetReceiveBuffer(int sockfd, int size) const; 122f253c849c733489aa39df8039886ed1fd3101b37Julius Werner 12340daa01c4c8d772889d9c4167dee312869152174Prathmesh Prabhu // shutdown 1249f62cd1aedc909d42ffa6fee3d37d1370222f62aWade Guthrie virtual int ShutDown(int sockfd, int how) const; 12540daa01c4c8d772889d9c4167dee312869152174Prathmesh Prabhu 126633ac6f0d56a62f8fd21ba7d9a15818fe080fb2fDarin Petkov // socket 1279f62cd1aedc909d42ffa6fee3d37d1370222f62aWade Guthrie virtual int Socket(int domain, int type, int protocol) const; 128fa2100e878bb51d2c51b68a2f5b34124e73b4aa0Wade Guthrie 129fa2100e878bb51d2c51b68a2f5b34124e73b4aa0Wade Guthrie private: 130fa2100e878bb51d2c51b68a2f5b34124e73b4aa0Wade Guthrie DISALLOW_COPY_AND_ASSIGN(Sockets); 131633ac6f0d56a62f8fd21ba7d9a15818fe080fb2fDarin Petkov}; 132633ac6f0d56a62f8fd21ba7d9a15818fe080fb2fDarin Petkov 133ba24e6fd0f0f2b974e0e73039d7d92bb475f6857Peter Qiuclass SHILL_EXPORT ScopedSocketCloser { 134e0a312e2f3b4e213c8872b86a9f3117a066d2e91Darin Petkov public: 135e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart ScopedSocketCloser(Sockets* sockets, int fd); 136e0a312e2f3b4e213c8872b86a9f3117a066d2e91Darin Petkov ~ScopedSocketCloser(); 137e0a312e2f3b4e213c8872b86a9f3117a066d2e91Darin Petkov 1386a8de0eb674bb93b98addc9b9edf00c077326549Christopher Grant // Release and return the socket file descriptor, allowing the socket to 1396a8de0eb674bb93b98addc9b9edf00c077326549Christopher Grant // remain open as the ScopedSocketCloser is destroyed. 1406a8de0eb674bb93b98addc9b9edf00c077326549Christopher Grant int Release() WARN_UNUSED_RESULT; 1416a8de0eb674bb93b98addc9b9edf00c077326549Christopher Grant 142e0a312e2f3b4e213c8872b86a9f3117a066d2e91Darin Petkov private: 143e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart Sockets* sockets_; 144e0a312e2f3b4e213c8872b86a9f3117a066d2e91Darin Petkov int fd_; 145e0a312e2f3b4e213c8872b86a9f3117a066d2e91Darin Petkov 146e0a312e2f3b4e213c8872b86a9f3117a066d2e91Darin Petkov DISALLOW_COPY_AND_ASSIGN(ScopedSocketCloser); 147e0a312e2f3b4e213c8872b86a9f3117a066d2e91Darin Petkov}; 148e0a312e2f3b4e213c8872b86a9f3117a066d2e91Darin Petkov 149633ac6f0d56a62f8fd21ba7d9a15818fe080fb2fDarin Petkov} // namespace shill 150633ac6f0d56a62f8fd21ba7d9a15818fe080fb2fDarin Petkov 1518d6b59704591ba9fad57751858835dc332dbdd37Peter Qiu#endif // SHILL_NET_SOCKETS_H_ 152