Megaco woes with ServiceChangeReason = ReasonToken EQUAL VALUE
Peter-Henry Mander
pete@REDACTED
Wed Feb 5 17:28:58 CET 2003
Hi Micael,
I have a "solution" which I believe fits the standard wrt.
serviceChangeReason. I've modified:
otp_src_R8B-2/lib/megaco/src/text/megaco_text_gen.hrl
with a change to enc_serviceChangeReason/2 thus:
enc_serviceChangeReason({reason, Val}, State) ->
case Val of
asn1_NOVALUE ->
[];
[List] when list(List) ->
[
?ReasonToken,
?EQUAL,
%%enc_Value(List, State) %%%%%%% replace this ...
enc_QUOTED_STRING(List,State) %% ... with this.
]
end.
Now the Service Change always uses a quoted string for
serviceChangeReason, as described in the IETF ABNF file comment.
Pete.
Peter-Henry Mander wrote:
> Hi Micael,
>
> Yes, this is what I expect too. Allow me to elaborate. Below is the
> function I
> use to issue the service change, with a small modification to match the
> Reason
> field in your example:
>
> service_change(ConnHandle, Method, Reason) ->
> megaco:call(
> ConnHandle,
> [#'ActionRequest'{
> contextId = ?megaco_null_context_id,
> commandRequests = [
> #'CommandRequest'{
> command = {
> serviceChangeReq,
> #'ServiceChangeRequest'{
> terminationID = [?megaco_root_termination_id],
> serviceChangeParms = #'ServiceChangeParm'{
> serviceChangeMethod = Method,
> serviceChangeReason = ["901 mg cold boot"], %%%
> mod here
> serviceChangeVersion = 2
> }}}}]}],
> []
> ).
>
> This produces the following message. The serviceChangeReason field
> format has
> quotes, similar to your example:
>
> MEGACO/1 [10.1.0.200]:2944
> Transaction = 1 {
> Context = - {
> ServiceChange = root {
> Services {
> Method = Restart,
> Version = 2,
> Reason = "901 mg cold boot"
> }
> }
> }
> }
>
> But if I modify the serviceChangeReason to be a safeChar string, containing
> digits only, thus:
>
> service_change(ConnHandle, Method, Reason) ->
> megaco:call(
> ConnHandle,
> [#'ActionRequest'{
> contextId = ?megaco_null_context_id,
> commandRequests = [
> #'CommandRequest'{
> command = {
> serviceChangeReq,
> #'ServiceChangeRequest'{
> terminationID = [?megaco_root_termination_id],
> serviceChangeParms = #'ServiceChangeParm'{
> serviceChangeMethod = Method,
> serviceChangeReason = ["901"], %% using safeChar
> serviceChangeVersion = 2
> }}}}]}],
> []
> ).
>
> I get the following result where 901 appears without quotes:
>
> MEGACO/1 [10.1.0.200]:2944
> Transaction = 1 {
> Context = - {
> ServiceChange = root {
> Services {
> Method = Restart,
> Version = 2,
> Reason = 901
> }
> }
> }
> }
>
> So I conjecture that if you change line 32 from ["901 mg col boot"] to
> ["901"]
> you too will have a similar result. I think that the comment in the ABNF
> suggests that even a safeChar string should be formatted with quotes.
>
> <rant importance=low>
> I humbly believe that the comment about serviceChangeReason should have
> been rewritten as a rule in the IETF's ABNF file to avoid ambiguity, and
> that Note 1 in Annex B.2 has allowed the IETF to be less than rigourous
> with their own ABNF code.
> </rant>
>
> Pete.
>
> P.s. I modified line 9 in your listing 'cos Mozilla didn't like copying the
> binary string in ip4Address.
>
> Micael Karlberg wrote:
> 1 Hi,
> 2
> 3 I would like to see your erlang message, because when I try,
> 4 it works just fine. Here's an example:
> 5
> 6 Erlang megaco (service change) message
> 7 {'MegacoMessage',asn1_NOVALUE,
> 8 {'Message',1,
> 9 {ip4Address,{'IP4Address',"********",asn1_NOVALUE}},
> 10 {transactions,
> 11 [{transactionRequest,
> 12 {'TransactionRequest',
> 13 9998,
> 14 [{'ActionRequest',
> 15 0,
> 16 asn1_NOVALUE,
> 17 asn1_NOVALUE,
> 18 [{'CommandRequest',
> 19 {serviceChangeReq,
> 20 {'ServiceChangeRequest',
> 21 [{megaco_term_id,
> 22 false,
> 23 ["root"]}],
> 24 {'ServiceChangeParm',
> 25 restart,
> 26 {portNumber,
> 27 55555},
> 28 asn1_NOVALUE,
> 29 {'ServiceChangeProfile',
> 30 "resgw",
> 31 1},
> 32 ["901 mg col boot"],
> 33 asn1_NOVALUE,
> 34 asn1_NOVALUE,
> 35 asn1_NOVALUE,
> 36 asn1_NOVALUE}}},
> 37 asn1_NOVALUE,
> 38 asn1_NOVALUE}]}]}}]}}}
> 39
> 40 And this is what it looks like pretty-encoded:
> 41
> 42 MEGACO/1 [124.124.124.222]
> 43 Transaction = 9998 {
> 44 Context = - {
> 45 ServiceChange = root {
> 46 Services {
> 47 Method = Restart,
> 48 ServiceChangeAddress = 55555,
> 49 Profile = resgw/1,
> 50 Reason = "901 mg col boot"
> 51 }
> 52 }
> 53 }
> 54 }
> 55
> 56 And this is what it looks like compact-encoded:
> 57
> 58 !/1 [124.124.124.222]
> 59 T=9998{C=-{SC=root{SV{MT=RS,AD=55555,PF=resgw/1,RE="901 mg col
> boot"}}}}
> 60
> 61
> 62 Regards,
> 63 /BMK
> 64
> 65 Peter-Henry Mander writes:
> 66 > Good evening Erlang Megaco gurus,
> 67 >
> 68 > I have a question concerning the interpretation of the
> 69 > serviceChangeReason ABNF description (versions one and two *), which
> 70 > quotes (**):
> 71 >
> 72 > ; A serviceChangeReason consists of a numeric reason code
> 73 > ; and an optional text description.
> 74 > ; A serviceChangeReason MUST be encoded using the quotedString
> 75 > ; form of VALUE.
> 76 > ; The quotedString SHALL contain a decimal reason code,
> 77 > ; optionally followed by a single space character and a
> 78 > ; textual description string.
> 79 >
> 80 > serviceChangeReason = ReasonToken EQUAL VALUE
> 81 >
> 82 > ... and a little further down we have (***):
> 83 >
> 84 > VALUE = quotedString / 1*(SafeChar)
> 85 >
> 86 > The Erlang Megaco implementation follows the VALUE spec, not the
> 87 > quotedString requirement as described in the comment. i.e.
> 88 >
> 89 > MEGACO/1 [10.1.0.200]:2944
> 90 > Transaction = 1 {
> 91 > Context = - {
> 92 > ServiceChange = root {
> 93 > Services {
> 94 > Method = Restart,
> 95 > Version = 2,
> 96 > Reason = 901 <------- 1*(SafeChar)
> 97 > }
> 98 > }
> 99 > }
> 100 > }
> 101 >
> 102 > -OR-
> 103 >
> 104 > MEGACO/1 [10.1.0.200]:2944
> 105 > Transaction = 1 {
> 106 > Context = - {
> 107 > ServiceChange = root {
> 108 > Services {
> 109 > Method = Restart,
> 110 > Version = 2,
> 111 > Reason = "901 Cold Boot" <------- quotedString
> 112 > }
> 113 > }
> 114 > }
> 115 > }
> 116 >
> 117 > But if the comments are followed to the letter (and I understood
> 118 > correctly) the Reason should be quoted every time, thus:
> 119 >
> 120 > MEGACO/1 [10.1.0.200]:2944
> 121 > Transaction = 1 {
> 122 > Context = - {
> 123 > ServiceChange = root {
> 124 > Services {
> 125 > Method = Restart,
> 126 > Version = 2,
> 127 > Reason = "901" <------- quotedString even when
> 128 > 1*(SafeChar) matches.
> 129 > }
> 130 > }
> 131 > }
> 132 > }
> 133 >
> 134 > Erlang Megaco is technically correct if the ABNF is stripped of
> comments
> 135 > (which is what happens when building the Erlang Megaco stack from the
> 136 > spec, the ABNF/ASN.1 compiler won't read comments, or am I
> 137 > underestimating Erlang? :-). It looks as if those knowledgable
> fellows
> 138 > of the IETF should have specified:
> 139 >
> 140 > serviceChangeReason = ReasonToken EQUAL quotedString (instead of
> VALUE)
> 141 >
> 142 > Am I correct? How do I force Erlang Megaco to _always_ send
> 143 > quotedString, not just when there are unSafeChars in the string?
> Is it
> 144 > strictly necessary to enforce quotedString?
> 145 >
> 146 > Help!
> 147 >
> 148 > Pete.
> 149 >
> 150 > * Versions 1.03 as in draft-ietf-megaco-3015corr-03.txt and 2.03
> as in
> 151 > draft-ietf-megaco-h248v2-03.txt
> 152 >
> 153 > ** line 6557 in v1.03 and line 7275 in v2.03
> 154 >
> 155 > *** line 6623 in v1.03 and 7531in v2.03
> 156 >
>
>
>
>
>
More information about the erlang-questions
mailing list