esp8266ndn
NDN Arduino library for ESP8266 and more
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
uplink.hpp
Go to the documentation of this file.
1#ifndef NDNPH_CLI_UPLINK_HPP
2#define NDNPH_CLI_UPLINK_HPP
3
4#include "../face/face.hpp"
5#include "../port/transport/port.hpp"
6
7namespace ndnph {
8namespace cli {
9namespace detail {
10
11inline Face*
12openMemif(const char* socketName, int* mtu) {
13#ifdef NDNPH_PORT_TRANSPORT_MEMIF
14 static MemifTransport transport;
15 uint16_t dataroom = static_cast<uint16_t>(std::max(0, *mtu));
16 if (!transport.begin(socketName, 0, dataroom)) {
17 return nullptr;
18 }
19 *mtu = static_cast<int>(transport.getDataroom());
20 static Face face(transport);
21 return &face;
22#else
23 (void)socketName;
24 (void)mtu;
25 return nullptr;
26#endif // NDNPH_PORT_TRANSPORT_MEMIF
27}
28
29inline Face*
31 int port = 6363;
32 const char* env = getenv("NDNPH_UPLINK_UDP_PORT");
33 if (env != nullptr) {
34 port = atoi(env);
35 if (port <= 0 || port > UINT16_MAX) {
36 return nullptr;
37 }
38 }
39
40 static UdpUnicastTransport transport;
41 env = getenv("NDNPH_UPLINK_UDP_LISTEN");
42 if (env != nullptr && env[0] == '1') {
43 transport.beginListen(port);
44 } else {
45 sockaddr_in raddr4{};
46 raddr4.sin_family = AF_INET;
47 raddr4.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
48 raddr4.sin_port = htons(port);
49
50 sockaddr_in6 raddr6{};
51 raddr6.sin6_family = AF_INET6;
52 raddr6.sin6_port = raddr4.sin_port;
53
54 bool useV6 = false;
55
56 env = getenv("NDNPH_UPLINK_UDP");
57 if (env != nullptr) {
58 if (inet_pton(raddr6.sin6_family, env, &raddr6.sin6_addr)) {
59 useV6 = true;
60 } else if (!inet_pton(raddr4.sin_family, env, &raddr4.sin_addr)) {
61 return nullptr;
62 }
63 }
64
65 if (!(useV6 ? transport.beginTunnel(&raddr6) : transport.beginTunnel(&raddr4))) {
66 return nullptr;
67 }
68 }
69
70 static Face face(transport);
71 return &face;
72}
73
74inline void
75enableFragReass(Face& face, int mtu) {
76 static DynamicRegion region(9200);
77 static lp::Fragmenter fragmenter(region, mtu);
78 static lp::Reassembler reassembler(region);
79 face.setFragmenter(fragmenter);
80 face.setReassembler(reassembler);
81}
82
83} // namespace detail
84
86inline Face&
88 static Face* face = nullptr;
89 if (face == nullptr) {
90 int mtu = -1;
91 const char* envMtu = getenv("NDNPH_UPLINK_MTU");
92 if (envMtu != nullptr) {
93 mtu = atoi(envMtu);
94 if (mtu < 64 || mtu > 9000) {
95 fprintf(stderr, "ndnph::cli::openUplink invalid or out-of-range NDNPH_UPLINK_MTU\n");
96 exit(1);
97 }
98 }
99
100 const char* envMemif = getenv("NDNPH_UPLINK_MEMIF");
101 if (envMemif == nullptr) {
102 face = detail::openUdp();
103 } else {
104 face = detail::openMemif(envMemif, &mtu);
105 }
106
107 if (face == nullptr) {
108 fprintf(stderr, "ndnph::cli::openUplink error\n");
109 exit(1);
110 }
111
112 if (mtu >= 0) {
113 detail::enableFragReass(*face, mtu);
114 }
115 }
116 return *face;
117}
118
119} // namespace cli
120} // namespace ndnph
121
122#endif // NDNPH_CLI_UPLINK_HPP
Region with dynamically allocated memory.
Definition region.hpp:155
Network layer face.
Definition face.hpp:12
void setReassembler(lp::Reassembler &reass)
Enable NDNLPv2 reassembly.
Definition face.hpp:64
void setFragmenter(lp::Fragmenter &frag)
Enable NDNLPv2 fragmentation.
Definition face.hpp:53
NDNLPv2 fragmenter.
Definition lp.hpp:196
NDNLPv2 fragmenter.
Definition lp.hpp:471
A transport that communicates via libmemif.
Definition memif.hpp:35
uint16_t getDataroom() const
Return actual dataroom.
Definition memif.hpp:135
bool begin(const char *socketName, uint32_t id, uint16_t dataroom=0)
Start transport.
Definition memif.hpp:58
A transport that communicates over IPv4 unicast UDP tunnel.
Definition udp-unicast.hpp:19
bool beginListen(const sockaddr_in *laddr)
Start listening on given local IPv4 address.
Definition udp-unicast.hpp:33
bool beginTunnel(const sockaddr_in *raddr)
Connect to given remote IPv4 address.
Definition udp-unicast.hpp:68
void enableFragReass(Face &face, int mtu)
Definition uplink.hpp:75
Face * openMemif(const char *socketName, int *mtu)
Definition uplink.hpp:12
Face * openUdp()
Definition uplink.hpp:30
Face & openUplink()
Open uplink face.
Definition uplink.hpp:87
Definition fs.hpp:33