Skip to content

Commit e508d40

Browse files
tcp: Add support to bind for a given IP
1 parent eb44ec0 commit e508d40

8 files changed

Lines changed: 102 additions & 75 deletions

File tree

api/net/tcp/connection.hpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ class Connection : public std::enable_shared_from_this<Connection> {
5050

5151
public:
5252
/** Connection identifier */
53-
using Tuple = std::pair<port_t, Socket>;
53+
using Tuple = std::pair<Socket, Socket>;
5454
/** Interface for TCP states */
5555
class State;
5656
/** Disconnect event */
@@ -517,7 +517,7 @@ class Connection : public std::enable_shared_from_this<Connection> {
517517
* @return A "tuple" of [[local port], [remote ip, remote port]]
518518
*/
519519
Connection::Tuple tuple() const noexcept
520-
{ return {local_port_, remote_}; }
520+
{ return {local_, remote_}; }
521521

522522
/// --- State checks --- ///
523523

@@ -610,14 +610,15 @@ class Connection : public std::enable_shared_from_this<Connection> {
610610
* @return A 16 bit unsigned port number
611611
*/
612612
port_t local_port() const noexcept
613-
{ return local_port_; }
613+
{ return local_.port(); }
614614

615615
/**
616616
* @brief The local Socket bound to this connection.
617617
*
618618
* @return A TCP Socket
619619
*/
620-
Socket local() const noexcept;
620+
Socket local() const noexcept
621+
{ return local_; }
621622

622623
/**
623624
* @brief The remote Socket bound to this connection.
@@ -777,7 +778,7 @@ class Connection : public std::enable_shared_from_this<Connection> {
777778
* @param[in] remote The remote socket
778779
* @param[in] callback The connection callback
779780
*/
780-
Connection(TCP& host, port_t local_port, Socket remote, ConnectCallback callback = nullptr);
781+
Connection(TCP& host, Socket local, Socket remote, ConnectCallback callback = nullptr);
781782

782783
Connection(const Connection&) = delete;
783784
Connection(Connection&&) = delete;
@@ -819,7 +820,7 @@ class Connection : public std::enable_shared_from_this<Connection> {
819820
TCP& host_;
820821

821822
/* End points. */
822-
port_t local_port_;
823+
Socket local_;
823824
Socket remote_;
824825

825826
/** The current state the Connection is in. Handles most of the logic. */

api/net/tcp/listener.hpp

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ class Listener {
4141

4242
public:
4343

44-
Listener(TCP& host, port_t port, ConnectCallback cb = nullptr);
44+
Listener(TCP& host, Socket local, ConnectCallback cb = nullptr);
4545

4646
Listener& on_accept(AcceptCallback cb)
4747
{
@@ -59,14 +59,14 @@ class Listener {
5959

6060
/**
6161
* @brief Returns the local socket identified with this Listener
62-
* @details Creates a temporary identifier for the Listener,
63-
* in form of Address to the current stack (TCP) and the port_
64-
* @return The local Socket
62+
*
63+
* @return The local Socket the listener is bound to
6564
*/
66-
Socket local() const;
65+
Socket local() const noexcept
66+
{ return local_; }
6767

68-
constexpr port_t port() const
69-
{ return port_; }
68+
port_t port() const noexcept
69+
{ return local_.port(); }
7070

7171
auto syn_queue_size() const
7272
{ return syn_queue_.size(); }
@@ -88,17 +88,13 @@ class Listener {
8888

8989
private:
9090
friend class net::TCP;
91-
TCP& host_;
92-
const port_t port_;
93-
SynQueue syn_queue_;
91+
TCP& host_;
92+
Socket local_;
93+
SynQueue syn_queue_;
9494

95-
/** */
96-
AcceptCallback on_accept_;
97-
98-
/** */
95+
AcceptCallback on_accept_;
9996
ConnectCallback on_connect_;
100-
101-
CloseCallback _on_close_;
97+
CloseCallback _on_close_;
10298

10399
bool default_on_accept(Socket);
104100

api/net/tcp/tcp.hpp

Lines changed: 44 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ namespace net {
4646
friend class tcp::Listener;
4747

4848
private:
49-
using Listeners = std::map<tcp::port_t, std::unique_ptr<tcp::Listener>>;
49+
using Listeners = std::map<tcp::Socket, std::unique_ptr<tcp::Listener>>;
5050
using Connections = std::map<tcp::Connection::Tuple, tcp::Connection_ptr>;
5151

5252
public:
@@ -70,7 +70,10 @@ namespace net {
7070
*
7171
* @return a TCP Listener
7272
*/
73-
tcp::Listener& bind(const tcp::port_t port, ConnectCallback cb = nullptr);
73+
tcp::Listener& bind(const tcp::port_t port, ConnectCallback cb = nullptr)
74+
{ return bind({0, port}, std::move(cb)); }
75+
76+
tcp::Listener& bind(tcp::Socket socket, ConnectCallback cb = nullptr);
7477

7578
/**
7679
* @brief Unbind (and close) a Listener
@@ -80,7 +83,7 @@ namespace net {
8083
* @param port listening port
8184
* @return whether the listener had a port
8285
*/
83-
bool unbind(const tcp::port_t port);
86+
bool unbind(tcp::Socket socket);
8487

8588
/**
8689
* @brief Make an outgoing connection to a TCP remote (IP:port).
@@ -341,7 +344,7 @@ namespace net {
341344
*
342345
* @return An IP4 address
343346
*/
344-
tcp::Address address()
347+
tcp::Address address() const noexcept
345348
{ return inet_.ip_addr(); }
346349

347350
/**
@@ -446,6 +449,38 @@ namespace net {
446449

447450
// INTERNALS - Handling of collections
448451

452+
/**
453+
* @brief Try to find the listener bound to socket.
454+
* If none is found directly, try any address (0).
455+
*
456+
* @param[in] socket The socket the listener is bound to
457+
*
458+
* @return A listener iterator
459+
*/
460+
Listeners::iterator find_listener(const tcp::Socket socket)
461+
{
462+
Listeners::iterator it = listeners_.find(socket);
463+
if(it == listeners_.end())
464+
it = listeners_.find({0, socket.port()});
465+
return it;
466+
}
467+
468+
/**
469+
* @brief Try to find the listener bound to socket.
470+
* If none is found directly, try any address (0).
471+
*
472+
* @param[in] socket The socket the listener is bound to
473+
*
474+
* @return A listener const iterator
475+
*/
476+
Listeners::const_iterator cfind_listener(const tcp::Socket socket)
477+
{
478+
Listeners::const_iterator it = listeners_.find(socket);
479+
if(it == listeners_.cend())
480+
it = listeners_.find({0, socket.port()});
481+
return it;
482+
}
483+
449484
/**
450485
* @brief Adds a connection.
451486
*
@@ -456,13 +491,13 @@ namespace net {
456491
/**
457492
* @brief Creates a connection.
458493
*
459-
* @param[in] local_port The local port
460-
* @param[in] remote The remote
461-
* @param[in] cb Connect callback
494+
* @param[in] local The local socket
495+
* @param[in] remote The remote socket
496+
* @param[in] cb Connect callback
462497
*
463498
* @return A ptr to the Connection whos created
464499
*/
465-
tcp::Connection_ptr create_connection(tcp::port_t local_port,
500+
tcp::Connection_ptr create_connection(tcp::Socket local,
466501
tcp::Socket remote,
467502
ConnectCallback cb = nullptr);
468503

@@ -480,7 +515,7 @@ namespace net {
480515
* @param[in] listener A Listener
481516
*/
482517
void close_listener(tcp::Listener& listener)
483-
{ listeners_.erase(listener.port()); }
518+
{ listeners_.erase(listener.local()); }
484519

485520

486521
// WRITEQ HANDLING

src/net/tcp/connection.cpp

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ using namespace std;
3131
/*
3232
This is most likely used in a ACTIVE open
3333
*/
34-
Connection::Connection(TCP& host, port_t local_port, Socket remote, ConnectCallback callback)
34+
Connection::Connection(TCP& host, Socket local, Socket remote, ConnectCallback callback)
3535
: host_(host),
36-
local_port_(local_port),
36+
local_(local),
3737
remote_(remote),
3838
state_(&Connection::Closed::instance()),
3939
prev_state_(state_),
@@ -89,10 +89,6 @@ void Connection::reset_callbacks()
8989
read_request.clean_up();
9090
}
9191

92-
Socket Connection::local() const noexcept {
93-
return {host_.address(), local_port_};
94-
}
95-
9692
uint16_t Connection::MSDS() const noexcept {
9793
return std::min(host_.MSS(), cb.SND.MSS) + sizeof(Header);
9894
}

src/net/tcp/listener.cpp

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@
2323

2424
using namespace net::tcp;
2525

26-
Listener::Listener(TCP& host, port_t port, ConnectCallback cb)
27-
: host_(host), port_(port), syn_queue_(),
26+
Listener::Listener(TCP& host, Socket local, ConnectCallback cb)
27+
: host_(host), local_(local), syn_queue_(),
2828
on_accept_({this, &Listener::default_on_accept}),
2929
on_connect_{std::move(cb)},
3030
_on_close_({host_, &TCP::close_listener})
@@ -38,9 +38,6 @@ bool Listener::default_on_accept(Socket) {
3838
bool Listener::syn_queue_full() const
3939
{ return syn_queue_.size() >= host_.max_syn_backlog(); }
4040

41-
Socket Listener::local() const {
42-
return {host_.address(), port_};
43-
}
4441

4542
void Listener::segment_arrived(Packet_ptr packet) {
4643
debug2("<Listener::segment_arrived> Received packet: %s\n",
@@ -87,7 +84,7 @@ void Listener::segment_arrived(Packet_ptr packet) {
8784

8885
auto& conn = *(syn_queue_.emplace(
8986
syn_queue_.cbegin(),
90-
std::make_shared<Connection>(host_, port_, packet->source(), ConnectCallback{this, &Listener::connected})
87+
std::make_shared<Connection>(host_, packet->destination(), packet->source(), ConnectCallback{this, &Listener::connected})
9188
)
9289
);
9390
conn->_on_cleanup({this, &Listener::remove});
@@ -143,7 +140,7 @@ void Listener::close() {
143140

144141
std::string Listener::to_string() const {
145142
std::stringstream ss;
146-
ss << "Port [ " << port_ << " ] " << " SynQueue ( " << syn_queue_.size() << " ) ";
143+
ss << "[ " << local_.to_string() << " ] " << " SynQueue ( " << syn_queue_.size() << " ) ";
147144

148145
for(auto& conn : syn_queue_)
149146
ss << "\n\t" << conn->to_string();

0 commit comments

Comments
 (0)