mirror of https://github.com/sipwise/sems.git
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.
140 lines
3.8 KiB
140 lines
3.8 KiB
|
|
diameter client (C) 2007 iptego GmbH
|
|
---------------
|
|
|
|
this is a very simple DIAMETER client implementation. it does
|
|
implement only parts of the base protocol, and is not a complete
|
|
DIAMETER implementation.
|
|
|
|
it is used from other modules with the DI API - i.e. other modules
|
|
can execute DI functions to add a server connection, or send a
|
|
DIAMETER request.
|
|
|
|
the DIAMETER base implementation is based on ser-0.9.6 diameter_auth
|
|
module by Elena-Ramona Modroiu, Copyright © 2003, 2004 FhG FOKUS.
|
|
connection pool and asynchronous message handling has been added,
|
|
together with the CER/CEA handshake and other things.
|
|
|
|
be prepared that you will need to look into the source to see how this
|
|
works, and you will need to build up your request AVPs by hand by
|
|
assembling an AmArg with the AVPs as ArgBlobs, and also unpack the
|
|
results/a received event from an AmArg array yourself.
|
|
|
|
WHY?
|
|
----
|
|
It seems that there is no simple to use free DIAMETER client implementation
|
|
available.
|
|
- OpenDIAMETER is probably a complete solution, but seems to
|
|
be very complex to use.
|
|
- DISC (http://developer.berlios.de/projects/disc/) is of 2003, seems to
|
|
be quite complete but assumes to be a complete server
|
|
- openimscore cdp module would probably have been a better basis
|
|
than ser 0.9.6's auth diameter. well...
|
|
|
|
BUGS/TODO
|
|
---------
|
|
o CEA needs probably be fixed to specific AVP set
|
|
o mandatory AVP checking in compund AVP not implemented
|
|
|
|
|
|
API
|
|
---
|
|
o connections are added with new_connection; connections are pooled for
|
|
an application, and are retried periodically if broken. only active
|
|
connections are used when sending a request (obviously)
|
|
|
|
o replies to requests are posted as event to the session/module
|
|
(identified by sess_link)
|
|
|
|
new_connection
|
|
string app_name
|
|
string server_ip
|
|
unsigned int server_port
|
|
string origin_host
|
|
string origin_realm
|
|
string origin_ip
|
|
unsigned int app_id
|
|
unsigned int vendor_id
|
|
string product_name
|
|
|
|
send_request
|
|
string app_name
|
|
unsigned int command_code
|
|
unsigned int app_id
|
|
arg val
|
|
string sess_link
|
|
|
|
args: array
|
|
[int avp_id, int flags, int vendor, blob data]
|
|
|
|
returns :
|
|
DIA_OK
|
|
DIA_ERR_NOAPP
|
|
DIA_ERR_NOCONN
|
|
|
|
reply events :
|
|
...
|
|
|
|
|
|
some testing code
|
|
----------------
|
|
|
|
else if(method == "test1"){
|
|
AmArg a;
|
|
a.push(AmArg("vtm"));
|
|
a.push(AmArg("10.1.0.196"));
|
|
a.push(AmArg(8080));
|
|
a.push(AmArg("vtm01"));
|
|
a.push(AmArg("vtm.t-online.de"));
|
|
a.push(AmArg("10.42.32.13"));
|
|
a.push(AmArg(16777241));
|
|
a.push(AmArg(29631));
|
|
a.push(AmArg("vtm"));
|
|
a.assertArrayFmt("ssisssiis");
|
|
newConnection(a, ret);
|
|
} else if(method == "test2"){
|
|
AmArg a;
|
|
#define AAA_APP_USPI 16777241
|
|
#define AVP_E164_NUMBER 1024
|
|
#define AAA_VENDOR_IPTEGO 29631
|
|
#define AAA_LAR 16777214
|
|
|
|
a.push(AmArg("vtm"));
|
|
a.push(AmArg(AAA_LAR));
|
|
a.push(AmArg(AAA_APP_USPI));
|
|
DBG("x pushin \n");
|
|
AmArg avps;
|
|
|
|
AmArg e164;
|
|
e164.push((int)AVP_E164_NUMBER);
|
|
e164.push((int)AAA_AVP_FLAG_VENDOR_SPECIFIC | AAA_AVP_FLAG_MANDATORY);
|
|
e164.push((int)AAA_VENDOR_IPTEGO);
|
|
string e164_number = "+49331600001";
|
|
e164.push(ArgBlob(e164_number.c_str(), e164_number.length()));
|
|
avps.push(e164);
|
|
|
|
AmArg drealm;
|
|
drealm.push((int)AVP_Destination_Realm);
|
|
drealm.push((int)AAA_AVP_FLAG_MANDATORY);
|
|
drealm.push((int)0);
|
|
string dest_realm = "iptego.de";
|
|
drealm.push(ArgBlob(dest_realm.c_str(), dest_realm.length()));
|
|
avps.push(drealm);
|
|
|
|
a.push(avps);
|
|
a.push(AmArg("bogus_link"));
|
|
|
|
// check...
|
|
a.assertArrayFmt("siias");
|
|
|
|
// check values
|
|
AmArg& vals = a.get(3);
|
|
for (size_t i=0;i<vals.size(); i++) {
|
|
AmArg& row = vals.get(i);
|
|
// [int avp_id, int flags, int vendor, blob data]
|
|
row.assertArrayFmt("iiib");
|
|
}
|
|
DBG("x sendrequest\n");
|
|
sendRequest(a, ret);
|
|
|