aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMicael Karlberg <[email protected]>2011-04-20 10:44:46 +0200
committerMicael Karlberg <[email protected]>2011-04-20 10:44:46 +0200
commit5b15b32e2d1aec2716c58879f0ada02557c757f5 (patch)
tree737420605043fe2b123a7e7454638cb7b0536472
parentf404041f4ce1a94c5784fb2c39b2d5624d58f624 (diff)
downloadotp-5b15b32e2d1aec2716c58879f0ada02557c757f5.tar.gz
otp-5b15b32e2d1aec2716c58879f0ada02557c757f5.tar.bz2
otp-5b15b32e2d1aec2716c58879f0ada02557c757f5.zip
Just a save commit (I need to work on another branch...)
-rw-r--r--lib/snmp/src/misc/snmp_pdus.erl50
1 files changed, 41 insertions, 9 deletions
diff --git a/lib/snmp/src/misc/snmp_pdus.erl b/lib/snmp/src/misc/snmp_pdus.erl
index dc8900c8cd..9c273bc0e0 100644
--- a/lib/snmp/src/misc/snmp_pdus.erl
+++ b/lib/snmp/src/misc/snmp_pdus.erl
@@ -268,25 +268,42 @@ dec_value([4 | Bytes]) ->
dec_value([64 | Bytes]) ->
{Value, Rest} = dec_oct_str_notag(Bytes),
{{'IpAddress', Value}, Rest};
+%% dec_value([65 | Bytes]) ->
+%% {Value, Rest} = dec_integer_notag(Bytes),
+%% if
+%% (Value >= 0) andalso (Value =< 4294967295) ->
+%% {{'Counter32', Value}, Rest};
+%% true ->
+%% exit({error, {bad_counter32, Value}})
+%% end;
dec_value([65 | Bytes]) ->
+ %% Counter32 is an unsigned 32 but is actually encoded as
+ %% a signed integer 32 (INTEGER).
{Value, Rest} = dec_integer_notag(Bytes),
- if Value >= 0, Value =< 4294967295 ->
- {{'Counter32', Value}, Rest};
- true ->
- exit({error, {bad_counter32, Value}})
- end;
+ Value2 =
+ if
+ (Value >= 0) andalso (Value =< 16#ffffffff) ->
+ %% We accept value above 16#7fffffff
+ Value;
+ (Value < 0) ->
+ 16#ffffffff + Value + 1;
+ true ->
+ exit({error, {bad_counter32, Value}}) end,
+ {{'Counter64', Value2}, Rest};
dec_value([66 | Bytes]) ->
{Value, Rest} = dec_integer_notag(Bytes),
- if Value >= 0, Value =< 4294967295 ->
+ if
+ (Value >= 0) andalso (Value =< 4294967295) ->
{{'Unsigned32', Value}, Rest};
- true ->
+ true ->
exit({error, {bad_unsigned32, Value}})
end;
dec_value([67 | Bytes]) ->
{Value, Rest} = dec_integer_notag(Bytes),
- if Value >= 0, Value =< 4294967295 ->
+ if
+ (Value >= 0) andalso (Value =< 4294967295) ->
{{'TimeTicks', Value}, Rest};
- true ->
+ true ->
exit({error, {bad_timeticks, Value}})
end;
dec_value([68 | Bytes]) ->
@@ -642,6 +659,21 @@ enc_value(_Type, endOfMibView) ->
[130,0];
enc_value('NULL', _Val) ->
[5,0];
+enc_value('Counter32', Val) ->
+ Val2 =
+ if
+ Val > 16#ffffffff ->
+ exit({error, {bad_counter32, Val}});
+ Val >= 16#80000000 ->
+ (Val band 16#7fffffff) - 16#80000000;
+ Val >= 0 ->
+ Val;
+ true ->
+ exit({error, {bad_counter32, Val}})
+ end,
+ Bytes2 = enc_integer_notag(Val2),
+ Len2 = elength(length(Bytes2)),
+ lists:append([65 | Len2],Bytes2);
enc_value('Counter64', Val) ->
Val2 =
if