Megaco woes with ServiceChangeReason = ReasonToken EQUAL VALUE
Peter-Henry Mander
erlang@REDACTED
Wed Feb 5 09:45:54 CET 2003
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