Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement passthrough mod #2

Merged
merged 32 commits into from
Feb 8, 2019
Merged
Changes from 1 commit
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
8e9ef2c
passthrough implementation
bparli Jan 14, 2019
67fa75e
connection tracker size
bparli Jan 19, 2019
0821472
backend failures and RST replies
bparli Jan 21, 2019
4906fc5
fix update status bug
bparli Jan 23, 2019
72711a0
update stats page
bparli Jan 24, 2019
e4519d4
limit conn tracker lock
bparli Jan 25, 2019
ce96344
perf and dsr
bparli Jan 27, 2019
bfe5d2a
use multiple transmitters
bparli Jan 27, 2019
aed1ec8
test perf improvements
bparli Jan 27, 2019
83f788c
dsr testing
bparli Jan 30, 2019
a19074b
use to_owned for ethernetpacket
bparli Jan 30, 2019
f648537
update stats counters only every so often
bparli Jan 31, 2019
0fd1168
add unit tests passthrough backend
bparli Feb 1, 2019
bae92d5
add tx thread and channel
bparli Feb 2, 2019
ef6275a
unit tests and re-use tcp_header
bparli Feb 4, 2019
4c4d9a3
unit tests
bparli Feb 4, 2019
898334f
unit tests
bparli Feb 5, 2019
473499d
re-use tcp packet
bparli Feb 5, 2019
47efd00
perf tweaks
bparli Feb 6, 2019
141aa29
perf tweaks
bparli Feb 6, 2019
4818f5f
perf tweaks
bparli Feb 6, 2019
fe6c394
some clean up
bparli Feb 6, 2019
af8cb38
make port mapper a rw lock
bparli Feb 6, 2019
6fd7f22
improve health checking
bparli Feb 7, 2019
d78a16c
more perf tweaking
bparli Feb 8, 2019
87739c4
fix tests
bparli Feb 8, 2019
cf39025
bump version
bparli Feb 8, 2019
036c8f5
fix cmd line opts
bparli Feb 8, 2019
84bf410
Update README.md
bparli Feb 8, 2019
4d66145
update samples
bparli Feb 8, 2019
0c96373
update readme with samples
bparli Feb 8, 2019
394cc18
extra spaces
bparli Feb 8, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
perf tweaks
  • Loading branch information
bparli committed Feb 6, 2019
commit 47efd00796c7445ec68f8c6243af00ed48f95982
21 changes: 12 additions & 9 deletions src/passthrough/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -240,7 +240,7 @@ impl LB {
}

// handle repsonse packets from a backend server passing back through the loadbalancer
fn server_response_handler(&mut self, tcp_header: &mut MutableTcpPacket, client_addr: &SocketAddr, tx: Sender<MutableIpv4Packet>) -> Option<StatsMssg> {
fn server_response_handler(&mut self, ip_header: &Ipv4Packet, tcp_header: &mut MutableTcpPacket, client_addr: &SocketAddr, tx: Sender<MutableIpv4Packet>) -> Option<StatsMssg> {
match client_addr.ip() {
IpAddr::V4(client_ipv4) => {
let mut mssg = StatsMssg{frontend: None,
Expand All @@ -250,8 +250,10 @@ impl LB {
bytes_rx: 0,
servers: None};

let ipbuf: Vec<u8> = vec!(0; tcp_header.packet().len() + IPV4_HEADER_LEN);
let mut new_ipv4 = MutableIpv4Packet::owned(ipbuf).unwrap();
// let ipbuf: Vec<u8> = vec!(0; tcp_header.packet().len() + IPV4_HEADER_LEN);
// let mut new_ipv4 = MutableIpv4Packet::owned(ipbuf).unwrap();

let mut new_ipv4 = MutableIpv4Packet::owned(ip_header.packet().to_vec()).unwrap();
tcp_header.set_destination(client_addr.port());
tcp_header.set_source(self.listen_port);
tcp_header.set_checksum(tcp::ipv4_checksum(&tcp_header.to_immutable(), &self.listen_ip, &client_ipv4));
Expand Down Expand Up @@ -297,8 +299,9 @@ impl LB {
bytes_rx: 0,
servers: None};

let ipbuf: Vec<u8> = vec!(0; tcp_header.packet().len() + IPV4_HEADER_LEN);
let mut new_ipv4 = MutableIpv4Packet::owned(ipbuf).unwrap();
// let ipbuf: Vec<u8> = vec!(0; tcp_header.packet().len() + IPV4_HEADER_LEN);
// let mut new_ipv4 = MutableIpv4Packet::owned(ipbuf).unwrap();
let mut new_ipv4 = MutableIpv4Packet::owned(ip_header.packet().to_vec()).unwrap();

new_ipv4.set_total_length(tcp_header.packet().len() as u16 + IPV4_HEADER_LEN as u16);
new_ipv4.set_version(4);
Expand Down Expand Up @@ -495,7 +498,7 @@ fn process_packets(lb: &mut LB, rx: crossbeam_channel::Receiver<EthernetPacket>,
Some(mut ip_header) => {
let ip_addr = ip_header.get_destination();
if ip_addr == lb.listen_ip {
match MutableTcpPacket::new(&mut ip_header.payload().to_owned()) {
match MutableTcpPacket::new(&mut ip_header.payload().to_vec()) {
Some(mut tcp_header) => {
if tcp_header.get_destination() == lb.listen_port {
if let Some(stats_update) = lb.client_handler(&mut ip_header, &mut tcp_header, loop_tx.clone()) {
Expand All @@ -507,7 +510,7 @@ fn process_packets(lb: &mut LB, rx: crossbeam_channel::Receiver<EthernetPacket>,
// only handling server repsonses if not using dsr
if let Some(client_addr) = lb.port_mapper.lock().unwrap().get_mut(&tcp_header.get_destination()) {
// if true the client socketaddr is in portmapper and the connection/response from backend server is relevant
if let Some(stats_update) = lb.clone().server_response_handler(&mut tcp_header, &SocketAddr::new( client_addr.ip, client_addr.port), loop_tx.clone()) {
if let Some(stats_update) = lb.clone().server_response_handler(&mut ip_header, &mut tcp_header, &SocketAddr::new( client_addr.ip, client_addr.port), loop_tx.clone()) {
stats.connections += &stats_update.connections;
stats.bytes_rx += &stats_update.bytes_rx;
stats.bytes_tx += &stats_update.bytes_tx;
Expand Down Expand Up @@ -621,7 +624,7 @@ pub fn run_server(lb: LB, sender: Sender<StatsMssg>) {
loop {
match iface_rx.next() {
Ok(packet) => {
let ethernet = EthernetPacket::owned(packet.to_owned()).unwrap();
let ethernet = EthernetPacket::owned(packet.to_vec()).unwrap();
match ethernet.get_ethertype() {
EtherTypes::Ipv4 => {
match incoming_tx.send(ethernet) {
Expand Down Expand Up @@ -783,7 +786,7 @@ mod tests {
let resp_header = build_dummy_ip(backend_srv_ip, lb_ip, 80, 35000);
let mut tcp_header = MutableTcpPacket::owned(resp_header.payload().to_owned()).unwrap();
// server should respond to client ip at client's port
lb.server_response_handler(&mut tcp_header, &SocketAddr::new(IpAddr::V4(client_ip), 55000), tx);
lb.server_response_handler(&resp_header.to_immutable(), &mut tcp_header, &SocketAddr::new(IpAddr::V4(client_ip), 55000), tx);
let srv_resp: MutableIpv4Packet = rx.recv().unwrap();
assert_eq!(srv_resp.get_destination(), client_ip);
assert_eq!(srv_resp.get_source(), lb_ip);
Expand Down