MT#62181 C++ sockaddr_storage

Use references instead of pointers.

Use object operators instead of memcpy and memset.

Remove redundant ctors.

Change-Id: I04440450070af17909efbd957f42a3c561e658ab
pull/8/head
Richard Fuchs 7 months ago
parent 9889ac83dc
commit 87f336631b

@ -732,14 +732,14 @@ sip_target::sip_target(const sip_target& target)
const sip_target& sip_target::operator = (const sip_target& target)
{
memcpy(&ss,&target.ss,sizeof(sockaddr_storage));
ss = target.ss;
memcpy(trsp,target.trsp,SIP_TRSP_SIZE_MAX+1);
return target;
}
void sip_target::clear()
{
memset(&ss,0,sizeof(sockaddr_storage));
ss = sockaddr_storage{};
memset(trsp,'\0',SIP_TRSP_SIZE_MAX+1);
}
@ -758,7 +758,7 @@ bool sip_target_set::has_next()
return dest_list_it != dest_list.end();
}
int sip_target_set::get_next(sockaddr_storage* ss, cstring& next_trsp,
int sip_target_set::get_next(sockaddr_storage& ss, cstring& next_trsp,
unsigned int flags)
{
do {
@ -766,7 +766,7 @@ int sip_target_set::get_next(sockaddr_storage* ss, cstring& next_trsp,
return -1;
sip_target& t = *dest_list_it;
memcpy(ss,&t.ss,sizeof(sockaddr_storage));
ss = t.ss;
next_trsp = cstring(t.trsp);
next();

@ -228,7 +228,7 @@ struct sip_target_set
void reset_iterator();
bool has_next();
int get_next(sockaddr_storage* ss, cstring& next_trsp,
int get_next(sockaddr_storage& ss, cstring& next_trsp,
unsigned int flags);
bool next();

@ -13,17 +13,7 @@ bl_addr::bl_addr()
ss_family = AF_INET;
}
bl_addr::bl_addr(const bl_addr& addr)
{
memcpy(this,&addr,SA_len(&addr));
}
bl_addr::bl_addr(const sockaddr_storage* p_addr)
{
memcpy((sockaddr_storage*)this,p_addr,SA_len(p_addr));
}
unsigned int bl_addr::hash()
unsigned int bl_addr::hash() const
{
return hashlittle((sockaddr_storage*)this, SA_len(this), 0)
& BLACKLIST_HT_MASK;
@ -33,7 +23,7 @@ void bl_timer::fire()
{
DBG_BL("blacklist: %s/%i expired",
am_inet_ntop(&addr).c_str(),am_get_port(&addr));
tr_blacklist::instance()->remove(&addr);
tr_blacklist::instance()->remove(addr);
}
bool blacklist_bucket::insert(const bl_addr& addr, uint64_t duration /* ms */,
@ -82,38 +72,41 @@ tr_blacklist::~tr_blacklist()
{
}
bool tr_blacklist::exist(const sockaddr_storage* addr)
bool tr_blacklist::exist(const sockaddr_storage& addr)
{
bool res;
blacklist_bucket* bucket = get_bucket(hashlittle(addr, SA_len(addr), 0)
& BLACKLIST_HT_MASK);
const bl_addr& bl_a = static_cast<const bl_addr&>(addr);
blacklist_bucket* bucket = get_bucket(bl_a.hash());
bucket->lock();
res = bucket->exist(*(const bl_addr*)addr);
res = bucket->exist(bl_a);
bucket->unlock();
return res;
}
void tr_blacklist::insert(const sockaddr_storage* addr, unsigned int duration,
void tr_blacklist::insert(const sockaddr_storage& addr, unsigned int duration,
const char* reason)
{
if(!duration)
return;
blacklist_bucket* bucket = get_bucket(hashlittle(addr, SA_len(addr), 0)
& BLACKLIST_HT_MASK);
const bl_addr& bl_a = static_cast<const bl_addr&>(addr);
blacklist_bucket* bucket = get_bucket(bl_a.hash());
bucket->lock();
if(!bucket->exist(*(const bl_addr*)addr)) {
bucket->insert(*(const bl_addr*)addr,duration,reason);
if(!bucket->exist(bl_a)) {
bucket->insert(bl_a,duration,reason);
}
bucket->unlock();
}
void tr_blacklist::remove(const sockaddr_storage* addr)
void tr_blacklist::remove(const sockaddr_storage& addr)
{
blacklist_bucket* bucket = get_bucket(hashlittle(addr, SA_len(addr), 0)
& BLACKLIST_HT_MASK);
const bl_addr& bl_a = static_cast<const bl_addr&>(addr);
blacklist_bucket* bucket = get_bucket(bl_a.hash());
bucket->lock();
bucket->remove(*(const bl_addr*)addr);
bucket->remove(bl_a);
bucket->unlock();
}

@ -15,10 +15,8 @@
struct bl_addr: public sockaddr_storage
{
bl_addr();
bl_addr(const bl_addr&);
bl_addr(const sockaddr_storage*);
unsigned int hash();
unsigned int hash() const;
};
template<> struct std::less<bl_addr> {
@ -122,10 +120,10 @@ protected:
public:
// public blacklist API:
bool exist(const sockaddr_storage* addr);
void insert(const sockaddr_storage* addr, unsigned int duration /* ms */,
bool exist(const sockaddr_storage& addr);
void insert(const sockaddr_storage& addr, unsigned int duration /* ms */,
const char* reason);
void remove(const sockaddr_storage* addr);
void remove(const sockaddr_storage& addr);
};
#endif

@ -1270,7 +1270,7 @@ int trans_layer::send_request(sip_msg* msg, trans_ticket* tt,
tt->_t = 0;
try_next_dest:
if(targets->get_next(&msg->remote_ip,next_trsp,flags) < 0) {
if(targets->get_next(msg->remote_ip, next_trsp, flags) < 0) {
DBG("next_ip(): no more destinations! reply 500");
sip_msg err;
set_err_reply_from_req(&err,msg,500,
@ -1305,7 +1305,7 @@ int trans_layer::send_request(sip_msg* msg, trans_ticket* tt,
ERROR("Error from transport layer\n");
if(default_bl_ttl) {
tr_blacklist::instance()->insert(&p_msg->remote_ip,
tr_blacklist::instance()->insert(p_msg->remote_ip,
default_bl_ttl,"503");
}
@ -1852,7 +1852,7 @@ int trans_layer::update_uac_reply(trans_bucket* bucket, sip_trans* t, sip_msg* m
t->state == TS_PROCEEDING)) {
if(!(t->flags & TR_FLAG_DISABLE_BL)) {
tr_blacklist::instance()->insert(&t->msg->remote_ip,
tr_blacklist::instance()->insert(t->msg->remote_ip,
default_bl_ttl,"503");
}
@ -1984,7 +1984,7 @@ int trans_layer::update_uac_reply(trans_bucket* bucket, sip_trans* t, sip_msg* m
if(reply_code == 503) {
if(default_bl_ttl) {
tr_blacklist::instance()->insert(&t->msg->remote_ip,
tr_blacklist::instance()->insert(t->msg->remote_ip,
default_bl_ttl,"503");
}
if(!try_next_ip(bucket,t,false))
@ -2521,7 +2521,7 @@ void trans_layer::timer_expired(trans_timer* t, trans_bucket* bucket,
if(!(tr->flags & TR_FLAG_DISABLE_BL)) {
// insert destination to blacklist
if(default_bl_ttl) {
tr_blacklist::instance()->insert(&tr->msg->remote_ip,
tr_blacklist::instance()->insert(tr->msg->remote_ip,
default_bl_ttl,
"timeout");
}
@ -2627,7 +2627,7 @@ int trans_layer::try_next_ip(trans_bucket* bucket, sip_trans* tr,
try_next_dest:
// get the next ip
if(!tr->targets ||
tr->targets->get_next(&sa,next_trsp,tr->flags) < 0){
tr->targets->get_next(sa, next_trsp, tr->flags) < 0){
DBG("no more destinations!");
return -1;
}
@ -2741,7 +2741,7 @@ int trans_layer::try_next_ip(trans_bucket* bucket, sip_trans* tr,
ERROR("Error from transport layer\n");
if(default_bl_ttl) {
tr_blacklist::instance()->insert(&tr->msg->remote_ip,
tr_blacklist::instance()->insert(tr->msg->remote_ip,
default_bl_ttl,"503");
}

Loading…
Cancel
Save