18 #include <hicn/transport/interfaces/callbacks.h>
19 #include <hicn/transport/interfaces/socket_producer.h>
20 #include <hicn/transport/interfaces/statistics.h>
21 #include <hicn/transport/utils/object_pool.h>
22 #include <implementation/socket.h>
23 #include <protocols/fec_base.h>
24 #include <protocols/fec_utils.h>
25 #include <utils/content_store.h>
41 bool isRunning() {
return is_running_; }
47 virtual uint32_t produceStream(
const Name &content_name,
48 std::unique_ptr<utils::MemBuf> &&buffer,
50 uint32_t start_offset = 0) = 0;
51 virtual uint32_t produceStream(
const Name &content_name,
52 const uint8_t *buffer,
size_t buffer_size,
54 uint32_t start_offset = 0) = 0;
55 virtual uint32_t produceDatagram(
const Name &content_name,
56 std::unique_ptr<utils::MemBuf> &&buffer) = 0;
57 virtual uint32_t produceDatagram(
const Name &content_name,
58 const uint8_t *buffer,
59 size_t buffer_size) = 0;
61 void setOutputBufferSize(std::size_t size) { output_buffer_.setLimit(size); }
62 std::size_t getOutputBufferSize() {
return output_buffer_.getLimit(); }
64 virtual void registerNamespaceWithNetwork(
const Prefix &producer_namespace);
65 const std::list<Prefix> &getNamespaces()
const {
return served_namespaces_; }
70 virtual void onError(std::error_code ec)
override{};
72 template <
typename FECHandler,
typename AllocatorHandler>
73 void enableFEC(FECHandler &&fec_handler,
74 AllocatorHandler &&allocator_handler) {
77 if (
const char *fec_str = std::getenv(
"TRANSPORT_FEC_TYPE")) {
78 LOG(INFO) <<
"Using FEC " << fec_str;
79 fec_type_ = fec::FECUtils::fecTypeFromString(fec_str);
82 if (fec_type_ == fec::FECType::UNKNOWN) {
86 fec_encoder_ = fec::FECUtils::getEncoder(fec_type_, 1);
87 fec_encoder_->setFECCallback(std::forward<FECHandler>(fec_handler));
88 fec_encoder_->setBufferCallback(
89 std::forward<AllocatorHandler>(allocator_handler));
97 std::vector<utils::EventThread> io_threads_;
100 std::thread listening_thread_;
101 std::shared_ptr<Portal> portal_;
102 std::atomic<bool> is_running_;
104 std::unique_ptr<fec::ProducerFEC> fec_encoder_;
107 interface::ProducerInterestCallback *on_interest_input_;
108 interface::ProducerInterestCallback *on_interest_dropped_input_buffer_;
109 interface::ProducerInterestCallback *on_interest_inserted_input_buffer_;
110 interface::ProducerInterestCallback *on_interest_satisfied_output_buffer_;
111 interface::ProducerInterestCallback *on_interest_process_;
113 interface::ProducerContentObjectCallback *on_new_segment_;
114 interface::ProducerContentObjectCallback *on_content_object_to_sign_;
115 interface::ProducerContentObjectCallback *on_content_object_in_output_buffer_;
116 interface::ProducerContentObjectCallback *on_content_object_output_;
117 interface::ProducerContentObjectCallback
118 *on_content_object_evicted_from_output_buffer_;
120 interface::ProducerContentCallback *on_content_produced_;
126 std::list<Prefix> served_namespaces_;
129 std::shared_ptr<auth::Signer> signer_;
130 bool making_manifest_;
133 fec::FECType fec_type_;