blob: f4c631c6a6d27bf382610ae2e154dd1ce8cd5950 [file] [log] [blame]
Garrick Evans3cbac7c2019-04-18 15:31:31 +09001// Copyright 2019 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Garrick Evans3388a032020-03-24 11:25:55 +09005#ifndef PATCHPANEL_SOCKET_FORWARDER_H_
6#define PATCHPANEL_SOCKET_FORWARDER_H_
Garrick Evans3cbac7c2019-04-18 15:31:31 +09007
8#include <netinet/ip.h>
9#include <sys/socket.h>
10
Garrick Evans7db0dda2019-05-20 11:50:06 +090011#include <atomic>
Garrick Evans3cbac7c2019-04-18 15:31:31 +090012#include <memory>
13#include <string>
14
15#include <base/macros.h>
16#include <base/memory/weak_ptr.h>
17#include <base/threading/simple_thread.h>
Andreea Costinas74f45d22020-03-13 10:29:31 +010018#include <brillo/brillo_export.h>
Garrick Evans3cbac7c2019-04-18 15:31:31 +090019
Garrick Evans3388a032020-03-24 11:25:55 +090020#include "patchpanel/socket.h"
Garrick Evans3cbac7c2019-04-18 15:31:31 +090021
Garrick Evans3388a032020-03-24 11:25:55 +090022namespace patchpanel {
Garrick Evans3cbac7c2019-04-18 15:31:31 +090023// Forwards data between a pair of sockets.
24// This is a simple implementation as a thread main function.
Andreea Costinas74f45d22020-03-13 10:29:31 +010025class BRILLO_EXPORT SocketForwarder : public base::SimpleThread {
Garrick Evans3cbac7c2019-04-18 15:31:31 +090026 public:
27 SocketForwarder(const std::string& name,
28 std::unique_ptr<Socket> sock0,
29 std::unique_ptr<Socket> sock1);
30 virtual ~SocketForwarder();
31
32 // Runs the forwarder. The sockets are closed and released on exit,
33 // so this can only be run once.
34 void Run() override;
Garrick Evans088cd0e2019-06-04 15:20:43 +090035 bool IsRunning() const;
Garrick Evans3cbac7c2019-04-18 15:31:31 +090036
37 private:
Garrick Evans7db0dda2019-05-20 11:50:06 +090038 static constexpr int kBufSize = 4096;
39
40 void Poll();
Garrick Evans7db0dda2019-05-20 11:50:06 +090041 bool ProcessEvents(uint32_t events, int efd, int cfd);
42
Garrick Evans3cbac7c2019-04-18 15:31:31 +090043 std::unique_ptr<Socket> sock0_;
44 std::unique_ptr<Socket> sock1_;
Garrick Evans7db0dda2019-05-20 11:50:06 +090045 char buf0_[kBufSize] = {0};
46 char buf1_[kBufSize] = {0};
47 ssize_t len0_;
48 ssize_t len1_;
49
50 std::atomic<bool> poll_;
51 std::atomic<bool> done_;
Garrick Evans3cbac7c2019-04-18 15:31:31 +090052
53 DISALLOW_COPY_AND_ASSIGN(SocketForwarder);
54};
55
Garrick Evans3388a032020-03-24 11:25:55 +090056} // namespace patchpanel
Garrick Evans3cbac7c2019-04-18 15:31:31 +090057
Garrick Evans3388a032020-03-24 11:25:55 +090058#endif // PATCHPANEL_SOCKET_FORWARDER_H_