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