[erlang-questions] erlang diameter dictionary

Samuel X <>
Fri Jan 24 21:40:37 CET 2014


Hello Anders,

How are you?

I have a question about modifying diameter dictionary. For example, for
diameter CCR message, if I want to change "Service-Context-Id" from
mandatory to non mandatory property so I don't have to fill this property
in the CCR message, I changed the file rfc4006_cc.dia as following:

1. Service-Context-Id                461    UTF8String    -
2. Change from {Service-Context-id} to [Service-Context-Id] and move it
below {CC-Request-Number} in CCR message definition

Then I used diameterc to generate new erlang files accordingly. The files
look good and I was able to compile. By the way, I include the diameter
library source code from OTP release R16B03 into the project, just in order
to debug the diameter easily.

I filled the CCR message as below:
    CCR = #diameter_rfc4006_cc_CCR{
        'Session-Id' = diameter:session_id(?L(who)),
        'Auth-Application-Id' = 16777238,
        'CC-Request-Type' =
?'DIAMETER_RFC4006_CC_CC-REQUEST-TYPE_INITIAL_REQUEST',
        'CC-Request-Number' = 0

        },
    diameter:call(Name, ?APP_CCR_ALIAS, CCR, []).

When I run from the erlang shell R16B03, I got the encoding error like this:

    why: {diameter_codec,encode,
             {{mandatory_avp_missing,'CC-Request-Type','CCR'},
              [{diameter_gen_rfc4006_cc,encode_avps,2,
                   [{file,

"/usr/lib/erlang/lib/diameter-1.5/include/diameter_gen.hrl"},
                    {line,59}]},
               {diameter_codec,e,2,
                   [{file,"src/diameter_codec.erl"},{line,120}]},
               {diameter_codec,encode,2,
                   [{file,"src/diameter_codec.erl"},{line,71}]},
               {diameter_traffic,encode,3,
                   [{file,"src/diameter_traffic.erl"},{line,1481}]},
               {diameter_traffic,send_R,6,
                   [{file,"src/diameter_traffic.erl"},{line,1320}]},
               {diameter_traffic,'-send_request/4-fun-0-',6,
                   [{file,"src/diameter_traffic.erl"},{line,1094}]}]}}
    who: <0.62.0>
    what: {diameter_codec,encode,
              [diameter_gen_rfc4006_cc,
               {diameter_packet,
                   {diameter_header,1,undefined,undefined,undefined,
                       398339147,398339147,undefined,undefined,undefined,
                       undefined},
                   undefined,
                   {diameter_rfc4006_cc_CCR,
                       ["who",";","1452024187",";","1",";",""],
                       "centos","example.com","example.com",16777238,
                       undefined,1,0,
                       ["centos"],

[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],
                       []},
                   undefined,[],undefined}]}
{error,encode}

I don't really understand why getting this error or the error information
is a little bit confusing me.
Am I doing right to modify the dictionary file? What is the proper way to
do that?

What is best way of debugging the diameter library? Can you give me some
hints?

Thanks a lot!

Samuel


On Sat, Mar 23, 2013 at 7:11 AM, Anders Svensson <>wrote:

> On Fri, Mar 22, 2013 at 7:52 PM, S X <> wrote:
> > Hi Anders,
> >
> > Sorry, I think I understand now. You told me the solution. Just use '[
> ]'.
> >
> > Anyhow, many thanks!
> >
> > By the way, since 3588 is obsolete, can I use 6733 while compile other
> > dictionaries?
>
> Yes. /Anders
>
>
> >
> > Thanks!
> >
> > Samuel
> >
> >
> > On Fri, Mar 22, 2013 at 2:46 PM, S X <> wrote:
> >>
> >> Hi Anders,
> >>
> >> Thanks for your quick response. But I still don't get why the DH is
> being
> >> interpreted as a list of Destination-Host values ( Is it because the
> define
> >> "avp_arity('CCR', 'Destination-Host') -> {0, 1};").
> >>
> >> And if it is treated as a list, how come it has a length greater than
> 1, I
> >> just set it once in prepare_request.
> >>
> >> What should I do to correct it? Or which document should I read more
> >> carefully to understand this properly?
> >>
> >> Thanks a lot!
> >>
> >> Samuel
> >>
> >>
> >> On Fri, Mar 22, 2013 at 1:27 PM, Anders Svensson <>
> >> wrote:
> >>>
> >>> Hi Samuel
> >>>
> >>> On Fri, Mar 22, 2013 at 5:55 PM, S X <> wrote:
> >>> > Thanks a lot, Anders,
> >>> >
> >>> > I think I overlooked what the meaning of the configurable ID tag (4)
> in
> >>> > the
> >>> > dia file is , which is supposed to be the important application ID to
> >>> > be
> >>> > used in the configuration. Your suggestion about the prefix is also
> >>> > right.
> >>> > But now I am just learning erlang diameter library.
> >>> >
> >>> > I just try to follow the sample RAR message style, and am still
> having
> >>> > issue
> >>> > with sending CCR message. The client configuration now is:
> >>> >
> >>> > -define(SERVICE(Name), [{'Origin-Host', ?L(Name) ++ ".example.com"},
> >>> >                         {'Origin-Realm', "example.com"},
> >>> >                         {'Vendor-Id', 193},
> >>> >                         {'Product-Name', "Client"},
> >>> >                         {'Auth-Application-Id',
> >>> > [?DIAMETER_APP_ID_CCRA]},
> >>> >                         {application, [{alias, ?APP_CCR_ALIAS},
> >>> >                                        {dictionary,
> >>> > ?DIAMETER_DICT_CCRA},
> >>> >                                        {module, client_cb_ccra}]}]).
> >>> >
> >>> > Try to send CCR message:
> >>> >
> >>> > call(Name) ->
> >>> >     SId = diameter:session_id(?L(Name)),
> >>> >     CCR = #diameter_base_rfc4006_cc_CCR{
> >>> >         'Session-Id' = SId,
> >>> >         'Service-Context-Id' = "Test",
> >>> >         'CC-Request-Type' =
> >>> > ?'DIAMETER_BASE_RFC4006_CC_CC-REQUEST-TYPE_INITIAL_REQUEST',
> >>> >         'CC-Request-Number' = 0,
> >>> >         'Auth-Application-Id' = ?DIAMETER_APP_ID_CCRA,
> >>> >         'User-Name' = "Me"},
> >>> >     diameter:call(Name, ?APP_CCR_ALIAS, CCR, []).
> >>> >
> >>> >
> >>> > In the client callback module:
> >>> >
> >>> > prepare_request(#diameter_packet{msg = Rec}, _, {_, Caps}) ->
> >>> >     #diameter_caps{origin_host = {OH, DH},
> >>> >                    origin_realm = {OR, DR}}
> >>> >         = Caps,
> >>> >
> >>> >     {send, Rec#diameter_base_rfc4006_cc_CCR{'Origin-Host' = OH,
> >>> >                                  'Origin-Realm' = OR,
> >>> >                                  'Destination-Host' = DH,
> >>> >                                  'Destination-Realm' = DR}}.
> >>> >
> >>> > I got the error about AVP property:
> >>> >
> >>> > =ERROR REPORT==== 22-Mar-2013::00:17:31 ===
> >>> >     why: {diameter_codec,encode,
> >>> >              {{repeated_avp_excessive_arity,'Destination-Host',1,
> >>> >                   "server.example.com",'CCR'},
> >>>
> >>> This is because Destination-Host is optional in CCR and AVP's are
> >>> encoded differently in a message record depending on whether or not
> >>> there can be exactly one occurrence: if so then the field value should
> >>> be the AVP value, if not then a list of AVP values. That is, your CCR
> >>> record should have
> >>>
> >>>    'Destination-Host' = [DH],
> >>>
> >>> in this case.
> >>>
> >>> >               [{diameter_gen_base_rfc4006_cc,encode_avps,2,
> >>> >
> >>> > [{file,"diameter_gen_base_rfc4006_cc.erl"},{line,47}]},
> >>> >
> >>> > {diameter_codec,e,2,[{file,"diameter_codec.erl"},{line,112}]},
> >>> >                {diameter_codec,encode,2,
> >>> >                    [{file,"diameter_codec.erl"},{line,63}]},
> >>> >                {diameter_traffic,encode,3,
> >>> >                    [{file,"diameter_traffic.erl"},{line,1437}]},
> >>> >                {diameter_traffic,send_R,6,
> >>> >                    [{file,"diameter_traffic.erl"},{line,1276}]},
> >>> >                {diameter_traffic,'-send_request/4-fun-0-',4,
> >>> >                    [{file,"diameter_traffic.erl"},{line,1050}]}]}}
> >>> >     who: <0.180.0>
> >>> >     what: {diameter_codec,encode,
> >>> >               [diameter_gen_base_rfc4006_cc,
> >>> >                {diameter_packet,
> >>> >                    {diameter_header,1,undefined,undefined,undefined,
> >>> >
> >>> > 1330492780,1330492780,undefined,undefined,undefined,
> >>> >                        undefined},
> >>> >                    undefined,
> >>> >                    {diameter_base_rfc4006_cc_CCR,
> >>> >
> >>> > ["client",";","1425429748",";","2",";",""],
> >>> >
> >>> > "client.example.com","example.com","example.com",4,
> >>> >
> >>> > "Test",1,0,"server.example.com","Me",[],[],[],[],[],[],
> >>> >                        [],[],[],[],[],[],[],[],[],[],[],[]},
> >>> >                    undefined,[],undefined}]}
> >>> >
> >>> > My understanding is that the client callback prepare_request sets the
> >>> > "Destination-Host" (retrievd via the CER/A done at earilier stage) in
> >>> > the
> >>> > CCR message. So I should set it right. But seems I still
> misunderstand
> >>> > something. Does the error information "repeated_avp_excessive_arity"
> >>> > mean "
> >>> > 0-1 Zero or one instance of the AVP MAY be present in the message. It
> >>> > is
> >>>
> >>> Yes, exactly. In your case your DH is being interpreted as list of
> >>> Destination-Host values, and "excessive arity" is a result of that
> >>> list having length greater than 1.
> >>>
> >>> /Anders, Erlang/OTP
> >>>
> >>>
> >>> > considered an error if there is more than one instance of the AVP"
> >>> > according
> >>> > to rfc4006 spec? The erlang error message is not that
> straightforward,
> >>> > really confusing newbies:).
> >>> >
> >>> > Do you have any hints? (I hope I could provide some  ramp up steps
> for
> >>> > other
> >>> > people to learn with erlang diameter library after making it work^_^)
> >>> >
> >>> > Many thanks,
> >>> >
> >>> > Samuel
> >>> >
> >>> >
> >>> >
> >>> > On Thu, Mar 21, 2013 at 8:59 AM, Anders Svensson <
> >
> >>> > wrote:
> >>> >>
> >>> >> On Thu, Mar 21, 2013 at 2:55 AM, S X <>
> wrote:
> >>> >> > Hello,
> >>> >> >
> >>> >> > Sorry, I still have some problems with sending CCR/CCA messages.
>  I
> >>> >> > didn't
> >>> >> > quite get how to configure multiple diameter applications though
> it
> >>> >> > seems
> >>> >> > clear when I read the diameter protocol.
> >>> >> >
> >>> >> > Based on the sample diameter code, I made the following changes,
> >>> >> > diameter_gen_base_rfc4006_cc is the dictionary generated with
> >>> >> > rfc4006_cc.dia:
> >>> >> > $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ Client
> >>> >> > $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
> >>> >> >
> >>> >> > -define(SVC_NAME,     ?MODULE).
> >>> >> > -define(APP_ALIAS,    ?MODULE).
> >>> >> > -define(CALLBACK_MOD, client_cb).
> >>> >> > -define(DIAMETER_DICT_CCRA, diameter_gen_base_rfc4006_cc).
> >>> >> >
> >>> >> > -define(L, atom_to_list).
> >>> >> >
> >>> >> > -define(SERVICE(Name), [{'Origin-Host', ?L(Name) ++ ".example.com
> "},
> >>> >> >                         {'Origin-Realm', "example.com"},
> >>> >> >                         {'Vendor-Id', 0},
> >>> >> >                         {'Product-Name', "Client"},
> >>> >> >                         {'Auth-Application-Id',
> >>> >> > [?DIAMETER_APP_ID_COMMON]},
> >>> >> >                         {application, [{alias, ?APP_ALIAS},
> >>> >> >                                        {dictionary,
> >>> >> > ?DIAMETER_DICT_CCRA},
> >>> >> >                                        {module,
> ?CALLBACK_MOD}]}]).
> >>> >> >
> >>> >> >
> >>> >> >
> >>> >> > $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ Server
> >>> >> > $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
> >>> >> >
> >>> >> > -define(DIAMETER_DICT_CCRA, diameter_gen_base_rfc4006_cc).
> >>> >> >
> >>> >> > init(State) ->
> >>> >> >     SvcName = ?MODULE,
> >>> >> >     SvcOpts = [{'Origin-Host', atom_to_list(SvcName) ++
> >>> >> > ".example.com"},
> >>> >> >                 {'Origin-Realm', "example.com"},
> >>> >> >                 {'Vendor-Id', 193},
> >>> >> >                 {'Product-Name', "Server"},
> >>> >> >                 {'Auth-Application-Id',
> [?DIAMETER_APP_ID_COMMON]},
> >>> >> >                 {application, [{alias, ?MODULE},
> >>> >> >                                {dictionary, ?DIAMETER_DICT_CCRA},
> >>> >> >                                {module, server_cb}]}],
> >>> >> >     TransportOpts = [{transport_module, diameter_tcp},
> >>> >> >                         {transport_config, [{reuseaddr, true},
> >>> >> >                         {ip, {127,0,0,1}}, {port, 3868}]}],
> >>> >> >     diameter:start(),
> >>> >> >     diameter:start_service(SvcName, SvcOpts),
> >>> >> >     diameter:add_transport(SvcName, {listen, TransportOpts}),
> >>> >> >     erlang:display("Set up diameter server completed!"),
> >>> >> >     {ok, State}.
> >>> >> >
> >>> >> >
> >>> >> >
> >>> >> > I changed the callbacks client_cb and server_cb to handle CCR/CCA
> >>> >> > messages.
> >>> >> >
> >>> >> >
> >>> >> > However, I got the following errors "app_not_configured". It seems
> >>> >> > the
> >>> >> > configuration for applications is incorrect. How should I
> configure
> >>> >> > the
> >>> >> > service properly? My understanding is I want to reuse CER/CEA as
> >>> >> > default
> >>> >> > authorization application, but the erlang diameter doesn't explain
> >>> >> > how
> >>> >> > to do
> >>> >> > it. Or my understanding is incorrect at all.
> >>> >>
> >>> >> The problem is a mismatch between the application and capabilities
> >>> >> configuration in your SvcOpts:  the 'Auth-Application-Id' tuple
> >>> >> specifies the Application Id's that are advertised in the outgoing
> >>> >> CER/CEA (that diameter itself sends) while 'applications' specifies
> >>> >> corresponding dictionary modules. In your case, advertising the
> common
> >>> >> application (0) during capabilities exchange but backing it up with
> a
> >>> >> dictionary that implement CC (4) is what causes things to go south.
> >>> >>
> >>> >> What you want is something like this:
> >>> >>
> >>> >>   {'Auth-Application-Id', [0,4]},
> >>> >>   {application, [{alias, cc},
> >>> >>                      {dictionary, diameter_gen_base_rfc4006},
> >>> >>                      {module, [server_cb, cc]}],
> >>> >>   {application, [{alias, base},
> >>> >>                      {dictionary, diameter_gen_base_rfc6733},
> >>> >>                      {module, [server_cb, base]}]}
> >>> >>
> >>> >> That is, advertise both application with the Auth-Application-Id
> >>> >> config and configure corresponding dictionaries with 'application'
> >>> >> config. You might prefer two different callback modules (instead of
> an
> >>> >> extra argument) but the point is to match your advertised
> capabilities
> >>> >> with your configured dictionaries.
> >>> >>
> >>> >> On a side note, you shouldn't use a diameter prefix on your own
> >>> >> dictionaries, so as not to collide with something diameter does in
> the
> >>> >> future.
> >>> >>
> >>> >> /Anders, Erlang/OTP
> >>> >>
> >>> >> >
> >>> >> > =ERROR REPORT==== 20-Mar-2013::21:40:50 ===
> >>> >> > ** Generic server <0.3841.0> terminating
> >>> >> > ** Last message in was {diameter,
> >>> >> >                            {recv,
> >>> >> >
> >>> >> > <<1,0,0,124,128,0,1,1,0,0,0,0,101,222,1,72,
> >>> >> >
> >>> >> > 101,222,1,72,0,0,1,8,64,0,0,26,99,108,105,
> >>> >> >
> >>> >> > 101,110,116,46,101,120,97,109,112,108,101,
> >>> >> >
> >>> >> > 46,99,111,109,0,0,0,0,1,40,64,0,0,19,101,
> >>> >> >
> >>> >> > 120,97,109,112,108,101,46,99,111,109,0,0,0,
> >>> >> >
> >>> >> > 1,1,64,0,0,14,0,1,127,0,0,1,0,0,0,0,1,10,64,
> >>> >> >
> >>> >> > 0,0,12,0,0,0,193,0,0,1,13,0,0,0,14,67,108,
> >>> >> >
> >>> >> > 105,101,110,116,0,0,0,0,1,2,64,0,0,12,0,0,0,
> >>> >> >                                  0>>}}
> >>> >> > ** When Server state ==
> >>> >> > {state,recv_CER,accept,<0.3840.0>,<0.3842.0>,
> >>> >> >                             diameter_gen_base_rfc3588,
> >>> >> >                             {diameter_service,<0.50.0>,
> >>> >> >                                 {diameter_caps,"
> server.example.com",
> >>> >> >                                     "example.com",
> >>> >> >                                     [{127,0,0,1}],
> >>> >> >                                     193,"Server",[],[],
> >>> >> >                                     [0],
> >>> >> >                                     [],[],[],[],[]},
> >>> >> >                                 [{diameter_app,server,
> >>> >> >                                      diameter_gen_base_rfc4006_cc,
> >>> >> >                                      [server_cb],
> >>> >> >                                      server,4,false,
> >>> >> >                                      [{answer_errors,report},
> >>> >> >
> >>> >> > {request_errors,answer_3xxx}]}]},
> >>> >> >                             false,exit}
> >>> >> > ** Reason for termination ==
> >>> >> > ** {{badmatch,{error,{app_not_configured,0}}},
> >>> >> >     [{diameter_peer_fsm,recv_CER,2,
> >>> >> >
> >>> >> > [{file,"src/diameter_peer_fsm.erl"},{line,849}]},
> >>> >> >      {diameter_peer_fsm,build_answer,3,
> >>> >> >
> >>> >> > [{file,"src/diameter_peer_fsm.erl"},{line,680}]},
> >>> >> >      {diameter_peer_fsm,send_answer,3,
> >>> >> >
> >>> >> > [{file,"src/diameter_peer_fsm.erl"},{line,647}]},
> >>> >> >      {diameter_peer_fsm,handle_info,2,
> >>> >> >
> >>> >> > [{file,"src/diameter_peer_fsm.erl"},{line,292}]},
> >>> >> >
>  {gen_server,handle_msg,5,[{file,"gen_server.erl"},{line,607}]},
> >>> >> >
> >>> >> > {proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,239}]}]}
> >>> >> >
> >>> >> >
> >>> >> > Could you give me some hints on this issue? The erlang debugger is
> >>> >> > not
> >>> >> > easy
> >>> >> > to use and call stack information is hard to read (when I show the
> >>> >> > trace
> >>> >> > window, all the buttons for step/next/continue become invisible).
> >>> >> > The
> >>> >> > diameter guidance explains the concept but no clear steps about
> >>> >> > configuration.
> >>> >> >
> >>> >> >
> >>> >> > Many thanks!
> >>> >> >
> >>> >> > Samuel
> >>> >> >
> >>> >> >
> >>> >> >
> >>> >> > On Tue, Mar 12, 2013 at 12:10 PM, S X <>
> >>> >> > wrote:
> >>> >> >>
> >>> >> >> Hello, Anders & Andre,
> >>> >> >>
> >>> >> >> Thanks a lot for your quick responses and suggestions, which help
> >>> >> >> me
> >>> >> >> start
> >>> >> >> to exploring Erlang world ^_^
> >>> >> >>
> >>> >> >> I was able to generate based on the file rfc4006_cc.dia under the
> >>> >> >> diameter/examples/dict folders. And understand a bit why and how
> >>> >> >> Erlang
> >>> >> >> diameter protocol dictionaries are organized and maintained.
> >>> >> >>
> >>> >> >> Many thanks and talk to you later!
> >>> >> >>
> >>> >> >> Samuel
> >>> >> >>
> >>> >> >>
> >>> >> >> On Tue, Mar 12, 2013 at 7:44 AM, Anders Svensson
> >>> >> >> <>
> >>> >> >> wrote:
> >>> >> >>>
> >>> >> >>> Btw, there's an RFC 4006 dictionary (and a few more) under
> >>> >> >>> diameter/examples/dict in the repo.
> >>> >> >>>
> >>> >> >>> /Anders, Erlang/OTP
> >>> >> >>>
> >>> >> >>> On Tue, Mar 12, 2013 at 10:32 AM, André Graf <
> >
> >>> >> >>> wrote:
> >>> >> >>> > Hello S(?)
> >>> >> >>> >
> >>> >> >>> > You have to come up with your own .dia file if the message
> types
> >>> >> >>> > are
> >>> >> >>> > not covered in the .dia files provided by Erlang. Your own
> .dia
> >>> >> >>> > file
> >>> >> >>> > will typically include the  '@inherits
> >>> >> >>> > diameter_gen_base_rfc3588'
> >>> >> >>> > clause which imports the basic avp's from rfc3588. You then
> have
> >>> >> >>> > to
> >>> >> >>> > provide the missing avp's for your CCR/CCA message types, and
> >>> >> >>> > also
> >>> >> >>> > define these messages. Thanks to the format of a .dia file it
> is
> >>> >> >>> > pretty much copy-pasting from the rfc4006. Once your .dia file
> >>> >> >>> > is
> >>> >> >>> > ready, you use diameterc to generate the .erl and .hrl file.
> >>> >> >>> >
> >>> >> >>> > Hope that helped!
> >>> >> >>> >
> >>> >> >>> > BR/André
> >>> >> >>> >
> >>> >> >>> >
> >>> >> >>> >
> >>> >> >>> > On 12 March 2013 04:58, S X <> wrote:
> >>> >> >>> >> Hello,
> >>> >> >>> >>
> >>> >> >>> >> I am new to Erlang and Diameter protocol. Wish someone could
> >>> >> >>> >> provide
> >>> >> >>> >> some
> >>> >> >>> >> suggestions on how to utilize the diameter library properly
> in
> >>> >> >>> >> Erlang.
> >>> >> >>> >>
> >>> >> >>> >> For example, I want to send/receive some Gx messages, like
> CCR
> >>> >> >>> >> (Credit
> >>> >> >>> >> Control Request), CCA(Credit Control Answer messages. But I
> >>> >> >>> >> notice
> >>> >> >>> >> that
> >>> >> >>> >> there are some predefined messages in erlang diameter
> library.
> >>> >> >>> >> As
> >>> >> >>> >> my
> >>> >> >>> >> understanding, should use the utility diameterc to generate
> >>> >> >>> >> erlang
> >>> >> >>> >> header/source files based on dia files. There are few dia
> files
> >>> >> >>> >> under
> >>> >> >>> >> otp/lib/diameter/src/dict folder, like acct_rfc6733.dia,
> >>> >> >>> >> base_rfc3588.dia,
> >>> >> >>> >> relay.dia, base_accounting.dia,  base_rfc6733.dia. Those
> files
> >>> >> >>> >> don't
> >>> >> >>> >> have
> >>> >> >>> >> the definitions for Gx.
> >>> >> >>> >>
> >>> >> >>> >> How should I generate or where can I obtain dia files which
> >>> >> >>> >> have
> >>> >> >>> >> support for
> >>> >> >>> >> CCR/CCA message format? Are the dia files proprietary or
> >>> >> >>> >> manufacturer
> >>> >> >>> >> specific? Can I generate with the 3GPP spec? What are the
> >>> >> >>> >> proper
> >>> >> >>> >> steps?
> >>> >> >>> >>
> >>> >> >>> >> Thanks a lot!
> >>> >> >>> >>
> >>> >> >>> >> S
> >>> >> >>> >>
> >>> >> >>> >>
> >>> >> >>> >> _______________________________________________
> >>> >> >>> >> erlang-questions mailing list
> >>> >> >>> >> 
> >>> >> >>> >> http://erlang.org/mailman/listinfo/erlang-questions
> >>> >> >>> >>
> >>> >> >>> > _______________________________________________
> >>> >> >>> > erlang-questions mailing list
> >>> >> >>> > 
> >>> >> >>> > http://erlang.org/mailman/listinfo/erlang-questions
> >>> >> >>
> >>> >> >>
> >>> >> >
> >>> >
> >>> >
> >>
> >>
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20140124/2512529d/attachment-0001.html>


More information about the erlang-questions mailing list