aboutsummaryrefslogtreecommitdiffstats
path: root/libtransport/src/hicn/transport/interfaces/socket.h
blob: 7d50d0fbdc47dd2dcdc5e6f4b9a0fbb8ce553be2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/*
 * Copyright (c) 2017-2019 Cisco and/or its affiliates.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#pragma once

#include <hicn/transport/config.h>
#include <hicn/transport/core/content_object.h>
#include <hicn/transport/core/facade.h>
#include <hicn/transport/core/interest.h>
#include <hicn/transport/core/manifest_format_fixed.h>
#include <hicn/transport/core/manifest_inline.h>
#include <hicn/transport/core/name.h>
#include <hicn/transport/interfaces/socket_options_default_values.h>
#include <hicn/transport/interfaces/socket_options_keys.h>
#include <hicn/transport/protocols/statistics.h>
#include <hicn/transport/utils/crypto_suite.h>
#include <hicn/transport/utils/identity.h>
#include <hicn/transport/utils/verifier.h>

#define SOCKET_OPTION_GET 0
#define SOCKET_OPTION_NOT_GET 1
#define SOCKET_OPTION_SET 2
#define SOCKET_OPTION_NOT_SET 3
#define SOCKET_OPTION_DEFAULT 12345

#define VOID_HANDLER 0

namespace transport {

namespace protocol {
class IcnObserver;
class TransportStatistics;
}  // namespace protocol

namespace interface {

template <typename PortalType>
class Socket;
class ConsumerSocket;
class ProducerSocket;

// using Interest = core::Interest;
// using ContentObject = core::ContentObject;
// using Name = core::Name;
// using HashAlgorithm = core::HashAlgorithm;
// using CryptoSuite = utils::CryptoSuite;
// using Identity = utils::Identity;
// using Verifier = utils::Verifier;

using HicnForwarderPortal = core::HicnForwarderPortal;

#ifdef __linux__
#ifndef __ANDROID__
using RawSocketPortal = core::RawSocketPortal;
#endif
#endif

#ifdef __vpp__
using VPPForwarderPortal = core::VPPForwarderPortal;
using BaseSocket = Socket<VPPForwarderPortal>;
using BasePortal = VPPForwarderPortal;
#else
using BaseSocket = Socket<HicnForwarderPortal>;
using BasePortal = HicnForwarderPortal;
#endif

using PayloadType = core::PayloadType;
using Prefix = core::Prefix;
using Array = utils::Array<uint8_t>;
using ContentBuffer = std::shared_ptr<std::vector<uint8_t>>;

using ConsumerInterestCallback =
    std::function<void(ConsumerSocket &, const core::Interest &)>;

using ConsumerContentCallback =
    std::function<void(ConsumerSocket &, std::size_t, const std::error_code &)>;

using ConsumerTimerCallback = std::function<void(
    ConsumerSocket &, const protocol::TransportStatistics &stats)>;

using ProducerContentCallback = std::function<void(
    ProducerSocket &, const std::error_code &, uint64_t bytes_written)>;

using ConsumerContentObjectCallback =
    std::function<void(ConsumerSocket &, const core::ContentObject &)>;

using ConsumerContentObjectVerificationCallback =
    std::function<bool(ConsumerSocket &, const core::ContentObject &)>;

using ConsumerManifestCallback =
    std::function<void(ConsumerSocket &, const core::ContentObjectManifest &)>;

using ProducerContentObjectCallback =
    std::function<void(ProducerSocket &, core::ContentObject &)>;

using ProducerInterestCallback =
    std::function<void(ProducerSocket &, core::Interest &)>;

using namespace protocol;

template <typename PortalType>
class Socket {
  static_assert(std::is_same<PortalType, HicnForwarderPortal>::value
#ifdef __linux__
#ifndef __ANDROID__
                    || std::is_same<PortalType, RawSocketPortal>::value
#ifdef __vpp__
                    || std::is_same<PortalType, VPPForwarderPortal>::value
#endif
#endif
                ,
#else
                ,

#endif
                "This class is not allowed as Portal");

 public:
  using Portal = PortalType;

  virtual asio::io_service &getIoService() = 0;

  virtual void connect() = 0;

 protected:
  virtual ~Socket(){};

 protected:
  std::string output_interface_;
};

}  // namespace interface

}  // namespace transport