#![allow(deref_nullptr, non_snake_case)]
include!(concat!(env!("OUT_DIR"), "/libccp.rs"));
use super::DatapathObj;
#[unsafe(no_mangle)]
pub extern "C" fn send_msg(
dp: *mut ccp_datapath,
msg: *mut ::std::os::raw::c_char,
msg_size: ::std::os::raw::c_int,
) -> std::os::raw::c_int {
let mut dp: Box<DatapathObj> = unsafe {
use std::mem;
let dp = mem::transmute((*dp).impl_);
Box::from_raw(dp)
};
use std::slice;
let buf = unsafe { slice::from_raw_parts(msg as *mut u8, msg_size as usize) };
dp.0.send_msg(buf);
Box::leak(dp);
return 0;
}
#[unsafe(no_mangle)]
pub extern "C" fn log(
dp: *mut ccp_datapath,
level: ccp_log_level,
msg: *const std::os::raw::c_char,
len: i32,
) {
let mut dp: Box<DatapathObj> = unsafe {
use std::mem;
let dp = mem::transmute((*dp).impl_);
Box::from_raw(dp)
};
use std::slice;
let buf = unsafe { slice::from_raw_parts(msg as *mut u8, len as usize) };
let msg: &'static str = match std::str::from_utf8(buf) {
Ok(s) => s,
Err(_) => return,
};
dp.0.log(level, msg);
Box::leak(dp);
}
use super::ConnectionObj;
#[unsafe(no_mangle)]
pub extern "C" fn set_cwnd(conn: *mut ccp_connection, cwnd: u32) {
let mut conn: Box<ConnectionObj> = unsafe {
use std::mem;
let conn = mem::transmute((*conn).impl_);
Box::from_raw(conn)
};
conn.0.set_cwnd(cwnd);
Box::leak(conn);
}
#[unsafe(no_mangle)]
pub extern "C" fn set_rate_abs(conn: *mut ccp_connection, rate: u32) {
let mut conn: Box<ConnectionObj> = unsafe {
use std::mem;
let conn = mem::transmute((*conn).impl_);
Box::from_raw(conn)
};
conn.0.set_rate_abs(rate);
Box::leak(conn);
}
#[unsafe(no_mangle)]
pub extern "C" fn now() -> u64 {
time::precise_time_ns()
}
#[unsafe(no_mangle)]
pub extern "C" fn since_usecs(then: u64) -> u64 {
(time::precise_time_ns() - then) / 1_000
}
#[unsafe(no_mangle)]
pub extern "C" fn after_usecs(usecs: u64) -> u64 {
time::precise_time_ns() + usecs * 1_000
}