aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilipp Maier <pmaier@sysmocom.de>2017-07-17 11:06:57 +0200
committerPhilipp Maier <pmaier@sysmocom.de>2017-07-20 12:38:37 +0200
commit9fc351de69a2f3f451a2c44145fbabb156ef410a (patch)
treecc718052245fdd473a5580c02f6518996b734680
parent2b74a5fdc0bbcb5b6df71e1dd542dd1ffbb3b9f6 (diff)
sccp: global addressbook search + api fix
The sccp-addressbook only allows defining addresses for a specific ss7 instance. It is not possible to use an sscp-address, that is defined in the one ss7 instance in another ss7 instance. Add a second global list where all sscp-addresses are added, regardless on which instance they are defined. Fixup the search functions so that they always search the global list. Change the API, so that the address data is written to a destination pointer. This protects the stored address from unintentional changes. Also return the ss7 instance, where the address is associated with. Change-Id: I5acc1e5abc3b3081149a9f476038e4e53d23b763
-rw-r--r--include/osmocom/sigtran/sccp_sap.h8
-rw-r--r--src/osmo_ss7_vty.c70
2 files changed, 54 insertions, 24 deletions
diff --git a/include/osmocom/sigtran/sccp_sap.h b/include/osmocom/sigtran/sccp_sap.h
index 2258b0d..24d64d9 100644
--- a/include/osmocom/sigtran/sccp_sap.h
+++ b/include/osmocom/sigtran/sccp_sap.h
@@ -248,8 +248,8 @@ osmo_sccp_user_bind(struct osmo_sccp_instance *inst, const char *name,
int osmo_sccp_user_sap_down(struct osmo_sccp_user *scu, struct osmo_prim_hdr *oph);
-struct osmo_sccp_addr *
-osmo_sccp_addr_by_name(const char *name, const struct osmo_ss7_instance *ss7);
+struct osmo_ss7_instance *
+osmo_sccp_addr_by_name(struct osmo_sccp_addr *dest_addr,
+ const char *name);
-char * osmo_sccp_name_by_addr(const struct osmo_sccp_addr *addr,
- const struct osmo_ss7_instance *ss7);
+const char *osmo_sccp_name_by_addr(const struct osmo_sccp_addr *addr);
diff --git a/src/osmo_ss7_vty.c b/src/osmo_ss7_vty.c
index 7e6f9ee..8a03303 100644
--- a/src/osmo_ss7_vty.c
+++ b/src/osmo_ss7_vty.c
@@ -934,6 +934,7 @@ DEFUN(show_cs7_as, show_cs7_as_cmd,
/* SCCP addressbook */
struct osmo_sccp_addr_entry {
struct llist_head list;
+ struct llist_head list_global;
struct osmo_ss7_instance *inst;
char name[512];
struct osmo_sccp_addr addr;
@@ -951,45 +952,72 @@ static struct cmd_node sccpaddr_gt_node = {
1,
};
-/* Pick an SCCP address entry from the addressbook by its name */
-struct osmo_sccp_addr_entry *addr_entry_by_name(const char *name,
- const struct osmo_ss7_instance
- *inst)
+/* A global list that holds all addressbook entries at once
+ * (see also .cfg in struct osmo_ss7_instance) */
+LLIST_HEAD(sccp_address_book_global);
+
+/* Pick an SCCP address entry from the addressbook list by its name */
+static struct osmo_sccp_addr_entry
+*addr_entry_by_name_local(const char *name,
+ const struct osmo_ss7_instance *inst)
{
struct osmo_sccp_addr_entry *entry;
+
llist_for_each_entry(entry, &inst->cfg.sccp_address_book, list) {
+ if (strcmp(entry->name, name) == 0) {
+ OSMO_ASSERT(entry->inst == inst);
+ return entry;
+ }
+ }
+
+ return NULL;
+}
+
+/* Pick an SCCP address entry from the global addressbook
+ * list by its name */
+static struct osmo_sccp_addr_entry
+*addr_entry_by_name_global(const char *name)
+{
+ struct osmo_sccp_addr_entry *entry;
+
+ llist_for_each_entry(entry, &sccp_address_book_global,
+ list_global) {
if (strcmp(entry->name, name) == 0)
return entry;
}
+
return NULL;
}
/*! \brief Lookup an SCCP address from the addressbook by its name.
- * \param[in] lookup-name of the address to lookup
- * \param[in] ss7 instance
- * \returns SCCP address; NULL on error */
-struct osmo_sccp_addr *osmo_sccp_addr_by_name(const char *name,
- const struct osmo_ss7_instance
- *ss7)
+ * \param[out] dest_addr pointer to output the resulting sccp-address;
+ * (set to NULL if not interested)
+ * \param[in] name of the address to lookup
+ * \returns SS7 instance; NULL on error */
+struct osmo_ss7_instance *
+osmo_sccp_addr_by_name(struct osmo_sccp_addr *dest_addr,
+ const char *name)
{
struct osmo_sccp_addr_entry *entry;
- entry = addr_entry_by_name(name, ss7);
- if (entry)
- return &entry->addr;
+ entry = addr_entry_by_name_global(name);
+ if (!entry)
+ return NULL;
- return NULL;
+ if (dest_addr)
+ *dest_addr = entry->addr;
+
+ return entry->inst;
}
/*! \brief Reverse lookup the lookup-name of a specified SCCP address.
* \param[in] name of the address to lookup
- * \param[in] ss7 instance
* \returns char pointer to the lookup-name; NULL on error */
-char *osmo_sccp_name_by_addr(const struct osmo_sccp_addr *addr,
- const struct osmo_ss7_instance *ss7)
+const char *osmo_sccp_name_by_addr(const struct osmo_sccp_addr *addr)
{
struct osmo_sccp_addr_entry *entry;
- llist_for_each_entry(entry, &ss7->cfg.sccp_address_book, list) {
+
+ llist_for_each_entry(entry, &sccp_address_book_global, list_global) {
if (memcmp(&entry->addr, addr, sizeof(*addr)) == 0)
return entry->name;
}
@@ -1177,7 +1205,7 @@ DEFUN(cs7_sccpaddr, cs7_sccpaddr_cmd,
return CMD_WARNING;
}
- entry = addr_entry_by_name(name, inst);
+ entry = addr_entry_by_name_local(name, inst);
/* Create a new addressbook entry if we can not find an
* already existing entry */
@@ -1185,6 +1213,7 @@ DEFUN(cs7_sccpaddr, cs7_sccpaddr_cmd,
entry = talloc_zero(inst, struct osmo_sccp_addr_entry);
osmo_strlcpy(entry->name, name, sizeof(entry->name));
llist_add_tail(&entry->list, &inst->cfg.sccp_address_book);
+ llist_add_tail(&entry->list_global, &sccp_address_book_global);
entry->addr.ri = OSMO_SCCP_RI_SSN_PC;
}
@@ -1203,9 +1232,10 @@ DEFUN(cs7_sccpaddr_del, cs7_sccpaddr_del_cmd,
struct osmo_sccp_addr_entry *entry;
const char *name = argv[0];
- entry = addr_entry_by_name(name, inst);
+ entry = addr_entry_by_name_local(name, inst);
if (entry) {
llist_del(&entry->list);
+ llist_del(&entry->list_global);
talloc_free(entry);
} else {
vty_out(vty, "Addressbook entry not found!%s", VTY_NEWLINE);