libptpmgmt 2.0
libptpmgmt library that provides the functionality of linuxptp pmc
Loading...
Searching...
No Matches
sock.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: LGPL-3.0-or-later
2 SPDX-FileCopyrightText: Copyright © 2021 Erez Geva <ErezGeva2@gmail.com> */
3
19#ifndef __PTPMGMT_SOCK_H
20#define __PTPMGMT_SOCK_H
21
22#ifdef __cplusplus
23#include "buf.h"
24#ifdef __PTPMGMT_HAVE_SYS_UN_H
25#include <sys/un.h>
26#endif
27#ifdef __PTPMGMT_HAVE_NETINET_IN_H
28#include <netinet/in.h>
29#endif
30#ifdef __linux__
31#include <linux/if_packet.h>
32#endif
33#include "cfg.h"
34#include "ptp.h"
35
36__PTPMGMT_NAMESPACE_BEGIN
37
44{
45 protected:
47 int m_fd = -1;
48 bool m_isInit = false;
49 SockBase() = default;
50 bool sendReply(ssize_t cnt, size_t len) const;
51 virtual bool sendBase(const void *msg, size_t len) const = 0;
52 virtual ssize_t rcvBase(void *buf, size_t bufSize, bool block) const = 0;
53 virtual bool initBase() = 0;
54 virtual void closeChild() {}
55 void closeBase();
58 public:
59 virtual ~SockBase();
60
64 void close();
69 bool init();
78 bool send(const void *msg, size_t len) const;
87 bool send(const Buf &buf, size_t len) const;
97 bool sendBuf(const Buf &buf, size_t len) const;
107 ssize_t rcv(void *buf, size_t bufSize, bool block = false) const;
116 ssize_t rcv(Buf &buf, bool block = false) const;
126 ssize_t rcvBuf(Buf &buf, bool block = false) const;
134 int getFd() const;
142 int fileno() const;
143 #ifdef __PTPMGMT_SWIG_THREAD_START
144 __PTPMGMT_SWIG_THREAD_START;
145 #endif
160 bool poll(uint64_t timeout_ms = 0) const;
178 bool tpoll(uint64_t &timeout_ms) const; /* poll with timeout update */
179 #ifdef __PTPMGMT_SWIG_THREAD_END
180 __PTPMGMT_SWIG_THREAD_END;
181 #endif
182};
183
190class SockUnix : public SockBase
191{
192 private:
193 static std::string m_homeDir;
194 std::string m_me, m_peer, m_lastFrom;
195 sockaddr_un m_peerAddr;
196 bool setPeerInternal(const std::string &str, bool useAbstract);
197 bool sendAny(const void *msg, size_t len, const sockaddr_un &addr) const;
198 static void setUnixAddr(sockaddr_un &addr, const std::string &str);
199
200 bool sendBase(const void *msg, size_t len) const override final;
201 ssize_t rcvBase(void *buf, size_t bufSize, bool block) const override final;
202 bool initBase() override final;
203 void closeChild() override final;
204
205 public:
206 SockUnix();
211 const std::string &getPeerAddress() const;
216 const char *getPeerAddress_c() const;
230 bool setPeerAddress(const std::string &string, bool useAbstract = false);
238 bool setPeerAddress(const ConfigFile &cfg, const std::string &section = "");
243 const std::string &getSelfAddress() const;
248 const char *getSelfAddress_c() const;
265 bool setSelfAddress(const std::string &string, bool useAbstract = false);
275 bool setDefSelfAddress(const std::string &rootBase = "",
276 const std::string &useDef = "");
281 static const std::string &getHomeDir();
286 static const char *getHomeDir_c();
299 bool sendTo(const void *msg, size_t len, const std::string &addrStr,
300 bool useAbstract = false) const;
313 bool sendTo(const Buf &buf, size_t len, const std::string &addrStr,
314 bool useAbstract = false) const;
326 ssize_t rcvFrom(void *buf, size_t bufSize, std::string &from,
327 bool block = false) const;
338 ssize_t rcvFrom(Buf &buf, std::string &from, bool block = false) const;
349 ssize_t rcvFrom(void *buf, size_t bufSize, bool block = false);
359 ssize_t rcvFrom(Buf &buf, bool block = false);
370 ssize_t rcvBufFrom(Buf &buf, bool block = false);
378 const std::string &getLastFrom() const;
386 const char *getLastFrom_c() const;
391 bool isLastFromAbstract() const;
397 static bool isAddressAbstract(const std::string &addr);
398};
399
405class SockBaseIf : public SockBase
406{
407 protected:
409 std::string m_ifName; /* interface to use */
410 Binary m_mac;
411 int m_ifIndex;
412 bool m_have_if = false;
413 bool setInt(const IfInfo &ifObj);
414 SockBaseIf() = default;
415 virtual bool setAllBase(const ConfigFile &cfg, const std::string &section) = 0;
418 public:
427 bool setIfUsingName(const std::string &ifName);
436 bool setIfUsingIndex(int ifIndex);
445 bool setIf(const IfInfo &ifObj);
458 bool setAll(const IfInfo &ifObj, const ConfigFile &cfg,
459 const std::string &section = "");
472 bool setAllInit(const IfInfo &ifObj, const ConfigFile &cfg,
473 const std::string &section = "");
474};
475
482class SockIp : public SockBaseIf
483{
484 protected:
486 int m_domain, m_udp_ttl = -1;
487 /* First for bind then for send */
488 sockaddr *m_addr;
489 size_t m_addr_len;
490 const char *m_mcast_str; /* string form */
491 Binary m_mcast;
492 SockIp(int domain, const char *mcast, sockaddr *addr, size_t len);
493 virtual bool initIp() = 0;
494 bool sendBase(const void *msg, size_t len) const override final;
495 ssize_t rcvBase(void *buf, size_t bufSize, bool block) const override final;
496 bool initBase() override final;
499 public:
509 bool setUdpTtl(uint8_t udp_ttl);
521 bool setUdpTtl(const ConfigFile &cfg, const std::string &section = "");
522};
523
527class SockIp4 : public SockIp
528{
529 private:
530 sockaddr_in m_addr4;
531
532 bool initIp() override final;
533 bool setAllBase(const ConfigFile &cfg,
534 const std::string &section) override final;
535
536 public:
537 SockIp4();
538};
539
543class SockIp6 : public SockIp
544{
545 private:
546 sockaddr_in6 m_addr6;
547 int m_udp6_scope = -1;
548
549 bool initIp() override final;
550 bool setAllBase(const ConfigFile &cfg,
551 const std::string &section) override final;
552
553 public:
554 SockIp6();
555
564 bool setScope(uint8_t udp6_scope);
575 bool setScope(const ConfigFile &cfg, const std::string &section = "");
576};
577
582class SockRaw : public SockBaseIf
583{
584 private:
585 Binary m_ptp_dst_mac;
586 int m_socket_priority = -1;
587 sockaddr_ll m_addr = {0};
588 ethhdr m_hdr;
589
590 bool setAllBase(const ConfigFile &cfg,
591 const std::string &section) override final;
592 bool sendBase(const void *msg, size_t len) const override final;
593 ssize_t rcvBase(void *buf, size_t bufSize, bool block) const override final;
594 bool initBase() override final;
595
596 public:
597 SockRaw();
608 bool setPtpDstMacStr(const std::string &string);
617 bool setPtpDstMac(const Binary &ptp_dst_mac);
627 bool setPtpDstMac(const void *ptp_dst_mac, size_t len);
638 bool setPtpDstMac(const ConfigFile &cfg, const std::string &section = "");
649 bool setSocketPriority(uint8_t socket_priority);
660 bool setSocketPriority(const ConfigFile &cfg, const std::string &section = "");
661};
662
663__PTPMGMT_NAMESPACE_END
664#else /* __cplusplus */
665#include "c/sock.h"
666#endif /* __cplusplus */
667
668#endif /* __PTPMGMT_SOCK_H */
Buffer for send, receive, build, and parse.
C interface to sockets classes.
Read ptp4l Configuration file.
Definition bin.h:27
Definition buf.h:26
Hold configuration parameters.
Definition cfg.h:34
Definition ptp.h:44
Base for socket that uses network interface directly.
Definition sock.h:406
bool setIfUsingIndex(int ifIndex)
bool setIf(const IfInfo &ifObj)
bool setIfUsingName(const std::string &ifName)
bool setAllInit(const IfInfo &ifObj, const ConfigFile &cfg, const std::string &section="")
bool setAll(const IfInfo &ifObj, const ConfigFile &cfg, const std::string &section="")
Base class for all sockets.
Definition sock.h:44
int fileno() const
bool sendBuf(const Buf &buf, size_t len) const
bool init()
ssize_t rcv(Buf &buf, bool block=false) const
int getFd() const
virtual ~SockBase()
bool send(const void *msg, size_t len) const
bool tpoll(uint64_t &timeout_ms) const
ssize_t rcv(void *buf, size_t bufSize, bool block=false) const
bool send(const Buf &buf, size_t len) const
bool poll(uint64_t timeout_ms=0) const
void close()
ssize_t rcvBuf(Buf &buf, bool block=false) const
Definition sock.h:528
Definition sock.h:544
bool setScope(const ConfigFile &cfg, const std::string &section="")
bool setScope(uint8_t udp6_scope)
Base for UDP sockets.
Definition sock.h:483
bool setUdpTtl(const ConfigFile &cfg, const std::string &section="")
bool setUdpTtl(uint8_t udp_ttl)
Definition sock.h:583
bool setPtpDstMac(const void *ptp_dst_mac, size_t len)
bool setPtpDstMac(const ConfigFile &cfg, const std::string &section="")
bool setSocketPriority(const ConfigFile &cfg, const std::string &section="")
bool setPtpDstMacStr(const std::string &string)
bool setPtpDstMac(const Binary &ptp_dst_mac)
bool setSocketPriority(uint8_t socket_priority)
Unix socket.
Definition sock.h:191
ssize_t rcvFrom(void *buf, size_t bufSize, std::string &from, bool block=false) const
bool sendTo(const Buf &buf, size_t len, const std::string &addrStr, bool useAbstract=false) const
bool setPeerAddress(const ConfigFile &cfg, const std::string &section="")
const char * getLastFrom_c() const
ssize_t rcvFrom(Buf &buf, bool block=false)
static bool isAddressAbstract(const std::string &addr)
const std::string & getPeerAddress() const
bool setDefSelfAddress(const std::string &rootBase="", const std::string &useDef="")
ssize_t rcvBufFrom(Buf &buf, bool block=false)
bool setSelfAddress(const std::string &string, bool useAbstract=false)
const std::string & getLastFrom() const
const char * getPeerAddress_c() const
bool isPeerAddressAbstract() const
ssize_t rcvFrom(void *buf, size_t bufSize, bool block=false)
const std::string & getSelfAddress() const
bool sendTo(const void *msg, size_t len, const std::string &addrStr, bool useAbstract=false) const
bool isSelfAddressAbstract() const
bool isLastFromAbstract() const
ssize_t rcvFrom(Buf &buf, std::string &from, bool block=false) const
static const char * getHomeDir_c()
bool setPeerAddress(const std::string &string, bool useAbstract=false)
static const std::string & getHomeDir()
const char * getSelfAddress_c() const
Read network interface information and retrieve the PTP information.