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.
|
|
18 years ago | |
|---|---|---|
| .. | ||
| lib_dbase | 18 years ago | |
| DiameterClient.cpp | 18 years ago | |
| DiameterClient.h | 18 years ago | |
| Makefile | 18 years ago | |
| Readme.diameter_client | 18 years ago | |
| ServerConnection.cpp | 18 years ago | |
| ServerConnection.h | 18 years ago | |
Readme.diameter_client
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);