sccp: add function to check sccp addresses

In order to catch invalid CS7 configurations, It is necessary
to check if sccp addresses contain plausible address data.

Change-Id: Ic6245288b0171eae10aa708403c1ddb584c92f38
This commit is contained in:
Philipp Maier 2017-08-01 15:07:20 +02:00 committed by Harald Welte
parent 41b6803fd5
commit 81a029a4e4
2 changed files with 44 additions and 0 deletions

View File

@ -257,3 +257,5 @@ const char *osmo_sccp_name_by_addr(const struct osmo_sccp_addr *addr);
void osmo_sccp_local_addr_by_instance(struct osmo_sccp_addr *dest_addr,
const struct osmo_sccp_instance *inst,
uint32_t ssn);
bool osmo_sccp_check_addr(struct osmo_sccp_addr *addr, uint32_t presence);

View File

@ -253,6 +253,48 @@ void osmo_sccp_local_addr_by_instance(struct osmo_sccp_addr *dest_addr,
osmo_sccp_make_addr_pc_ssn(dest_addr, ss7->cfg.primary_pc, ssn);
}
/*! \brief check whether a given SCCP-Address is consistent.
* \param[in] addr SCCP address to check
* \param[in] presence mask with minimum required address components
* \returns true when address data seems plausible */
bool osmo_sccp_check_addr(struct osmo_sccp_addr *addr, uint32_t presence)
{
/* Minimum requirements do not match */
if ((addr->presence & presence) != presence)
return false;
/* GT ranges */
if (addr->presence & OSMO_SCCP_ADDR_T_GT) {
if (addr->gt.gti > 15)
return false;
if (addr->gt.npi > 15)
return false;
if (addr->gt.nai > 127)
return false;
}
/* Routing by GT, but no GT present */
if (addr->ri == OSMO_SCCP_RI_GT
&& !(addr->presence & OSMO_SCCP_ADDR_T_GT))
return false;
/* Routing by PC/SSN, but no PC/SSN present */
if (addr->ri == OSMO_SCCP_RI_SSN_PC) {
if ((addr->presence & OSMO_SCCP_ADDR_T_PC) == 0)
return false;
if ((addr->presence & OSMO_SCCP_ADDR_T_SSN) == 0)
return false;
}
if (addr->ri == OSMO_SCCP_RI_SSN_IP) {
if ((addr->presence & OSMO_SCCP_ADDR_T_IPv4) == 0 &&
(addr->presence & OSMO_SCCP_ADDR_T_IPv6) == 0)
return false;
}
return true;
}
/***********************************************************************
* Convenience function for CLIENT
***********************************************************************/