/* vim: set expandtab ts=4 sw=4: */
/*
* You may redistribute this program and/or modify it under the terms of
* the GNU General Public License as published by the Free Software Foundation,
* either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#ifndef PeerLink_H
#define PeerLink_H
#include "wire/Message.h"
#include "memory/Allocator.h"
#include "util/events/EventBase.h"
#include "util/Linker.h"
Linker_require("net/PeerLink.c")
#include
/**
* The PeerLink adds a PeerHeader to outgoing messages and removes it from incoming messages while
* checking clock skew to detect latency and react by sending congestion notifications to the peer.
* In response to congestion notifications, this module will detect an optimal flow rate and buffer
* packets to avoid sending faster than this rate. In the event that the buffer is over-filled,
* packets will be dropped or replaced depending on highest penalty.
*/
struct PeerLink
{
int queueLength;
int linkMTU;
bool peerHeaderEnabled;
};
struct PeerLink_Kbps
{
uint32_t sendKbps;
uint32_t recvKbps;
};
/**
* Attempt to get a message from the peerlink to send, if it is time to send one.
* If there are no messages in the queue or the link is already at capacity, NULL will be returned.
*/
struct Message* PeerLink_poll(struct PeerLink* pl);
/**
* Enqueue a message to be sent.
* @return the number of messages which are ready to be encrypted and written to the device.
* Call PeerLink_poll() to get these messages for actual sending.
*/
int PeerLink_send(struct Message* msg, struct PeerLink* pl);
/**
* Receive (check the PeerHeader on) a message which has come in from the wire.
* PeerHeader_SIZE bytes will be popped from the message if peerHeaders are enabled for this
* peerLink.
*/
void PeerLink_recv(struct Message* msg, struct PeerLink* pl);
void PeerLink_kbps(struct PeerLink* peerLink, struct PeerLink_Kbps* output);
struct PeerLink* PeerLink_new(struct EventBase* base, struct Allocator* alloc);
#endif