You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
sems/core/sip/raw_sender.cpp

53 lines
1.1 KiB

#include "raw_sender.h"
#include "raw_sock.h"
#include "AmConfig.h"
#include "log.h"
#include <errno.h>
#include <string.h>
int raw_sender::rsock = -1;
int raw_sender::init()
{
if(rsock >= 0) {
return 0;
}
rsock = raw_udp_socket(1);
if(rsock < 0) {
if(errno == EPERM) {
ERROR("SEMS must be running as root to be able to use raw sockets.");
ERROR("-> raw socket usage will be deactivated.");
return -1;
}
else {
ERROR("raw_udp_socket(): %s",strerror(errno));
ERROR("-> raw socket usage will be deactivated.");
return -1;
}
}
return 0;
}
int raw_sender::send(const char* buf, unsigned int len, int sys_if_idx,
const sockaddr_storage* from, const sockaddr_storage* to)
{
//TODO: grab the MTU from the interface def
int ret = raw_iphdr_udp4_send(rsock,buf,len,from,to,
AmConfig::SysIfs[sys_if_idx].mtu);
if(ret < 0) {
ERROR("send(): %s",strerror(errno));
return ret;
}
// if((unsigned int)ret < len) {
// ERROR("incomplete udp send (%i instead of %i)",ret,len);
// return -1;
// }
return 0;
}