| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef SRC_CONNECTIVITY_NETWORK_TOOLS_SOCKSCRIPTER_SOCKSCRIPTER_H_ |
| #define SRC_CONNECTIVITY_NETWORK_TOOLS_SOCKSCRIPTER_SOCKSCRIPTER_H_ |
| |
| #include <string> |
| |
| #include "api_abstraction.h" |
| #include "packet.h" |
| |
| // {sendto}N=3T=2 1.2.3.4:3445 |
| // "{<cmd>}[N=<n>][T=<t>]" |
| struct TestRepeatCfg { |
| std::string command; |
| int repeat_count = 1; |
| int delay_ms = 0; |
| |
| bool Parse(const std::string& cmd); |
| }; |
| |
| class SendBufferGenerator { |
| public: |
| enum Mode { STATIC_TEXT, COUNTER_TEXT }; |
| static constexpr const char* kCounterText = "Packet number %c."; |
| |
| SendBufferGenerator() : snd_str_(kCounterText), mode_(COUNTER_TEXT) {} |
| |
| std::string GetSndStr(); |
| bool SetSendBufHex(const char* arg); |
| bool SetSendBufText(const char* arg); |
| |
| private: |
| std::string snd_str_; |
| Mode mode_ = STATIC_TEXT; |
| uint32_t counter_ = 0; |
| }; |
| |
| class SockScripter { |
| public: |
| explicit SockScripter(ApiAbstraction* abstraction) : api_(abstraction) {} |
| |
| int Execute(int argc, char* const argv[]); |
| |
| struct sockaddr* GetSockAddrStorage(); |
| bool Open(int domain, int type, int proto); |
| bool Close(char* arg); |
| bool CloseListener(char* arg); |
| bool SetBroadcast(char* arg); |
| bool LogBroadcast(char* arg); |
| bool SetReuseaddr(char* arg); |
| bool LogReuseaddr(char* arg); |
| bool SetReuseport(char* arg); |
| bool LogReuseport(char* arg); |
| bool SetIpUnicastTTL(char* arg); |
| bool LogIpUnicastTTL(char* arg); |
| bool SetIpUnicastHops(char* arg); |
| bool LogIpUnicastHops(char* arg); |
| bool SetIpMcastTTL(char* arg); |
| bool LogIpMcastTTL(char* arg); |
| bool SetIpMcastLoop4(char* arg); |
| bool LogIpMcastLoop4(char* arg); |
| bool SetIpMcastHops(char* arg); |
| bool LogIpMcastHops(char* arg); |
| bool SetIpV6Only(char* arg); |
| bool LogIpV6Only(char* arg); |
| bool SetIpMcastLoop6(char* arg); |
| bool LogIpMcastLoop6(char* arg); |
| bool SetBindToDevice(char* arg); |
| bool LogBindToDevice(char* arg); |
| bool SetIpMcastIf4(char* arg); |
| bool LogIpMcastIf4(char* arg); |
| bool SetIpMcastIf6(char* arg); |
| bool LogIpMcastIf6(char* arg); |
| bool LogBoundToAddress(char* arg); |
| bool LogPeerAddress(char* arg); |
| bool SetIpRecvOrigDstAddr(char* arg); |
| bool LogIpRecvOrigDstAddr(char* arg); |
| bool SetIpv6RecvPktInfo(char* arg); |
| bool LogIpv6RecvPktInfo(char* arg); |
| bool SetIpTransparent(char* arg); |
| bool LogIpTransparent(char* arg); |
| bool SetIpHeaderInclude(char* arg); |
| bool LogIpHeaderInclude(char* arg); |
| bool Bind(char* arg); |
| bool Shutdown(char* arg); |
| bool Connect(char* arg); |
| bool Disconnect(char* arg); |
| bool Join4(char* arg); |
| bool Drop4(char* arg); |
| bool Block4(char* arg); |
| bool Join6(char* arg); |
| bool Drop6(char* arg); |
| bool Listen(char* arg); |
| bool Accept(char* arg); |
| bool SendTo(char* arg); |
| bool Send(char* arg); |
| bool RecvFromInternal(bool ping); |
| bool RecvFrom(char* arg); |
| bool RecvFromPing(char* arg); |
| int RecvInternal(bool ping); |
| bool Recv(char* arg); |
| bool RecvPing(char* arg); |
| bool SetSendBufHex(char* arg); |
| bool SetSendBufText(char* arg); |
| bool Sleep(char* arg); |
| |
| #if PACKET_SOCKETS |
| bool PacketBind(char* arg); |
| bool PacketSendTo(char* arg); |
| #endif |
| |
| private: |
| bool JoinOrDrop4(const char* func, char* arg, int optname, const char* optname_str); |
| bool JoinOrDrop6(const char* func, char* arg, int optname, const char* optname_str); |
| |
| int sockfd_ = -1; |
| int tcp_listen_socket_fd_ = -1; |
| int snd_flags_ = 0; |
| int recv_flags_ = 0; |
| SendBufferGenerator snd_buf_gen_; |
| char recv_buf_[1024]{}; |
| ApiAbstraction* api_; |
| bool continue_after_error_ = false; |
| }; |
| |
| #endif // SRC_CONNECTIVITY_NETWORK_TOOLS_SOCKSCRIPTER_SOCKSCRIPTER_H_ |