@@ -73,7 +73,7 @@ func parseNextLayerFallback(data []byte) Layer {
7373 return nil
7474 }
7575 for _ , layer := range Layers {
76- next := GetNextLayer (layer )
76+ next := GetLayer (layer )
7777 if err := next .Parse (data ); err == nil {
7878 return next
7979 }
@@ -90,25 +90,25 @@ func parseNextLayerFromBytes(data []byte) Layer {
9090 var next Layer
9191 firstByte := buf [0 ]
9292 if firstByte >= 0x45 && firstByte <= 0x4F {
93- next = GetNextLayer (LayerIPv4 )
93+ next = GetLayer (LayerIPv4 )
9494 if err := next .Parse (buf ); err == nil {
9595 return next
9696 }
9797 }
9898 if firstByte >> 4 == 6 {
99- next = GetNextLayer (LayerIPv6 )
99+ next = GetLayer (LayerIPv6 )
100100 if err := next .Parse (buf ); err == nil {
101101 return next
102102 }
103103 }
104104 if firstByte == HandshakeTLSVal {
105- next = GetNextLayer (LayerTLS )
105+ next = GetLayer (LayerTLS )
106106 if err := next .Parse (buf ); err == nil {
107107 return next
108108 }
109109 }
110- if firstByte == 0x30 {
111- next = GetNextLayer ( LayerSNMP )
110+ if checkFTP ( buf ) {
111+ next = GetLayer ( LayerFTP )
112112 if err := next .Parse (buf ); err == nil {
113113 return next
114114 }
@@ -117,29 +117,35 @@ func parseNextLayerFromBytes(data []byte) Layer {
117117 b1 := binary .BigEndian .Uint16 (buf [0 :2 ])
118118 b2 := binary .BigEndian .Uint16 (buf [2 :4 ])
119119 if b1 == 1 && (b2 == 0x0800 || b2 == 0x86dd ) {
120- next = GetNextLayer (LayerARP )
120+ next = GetLayer (LayerARP )
121121 if err := next .Parse (buf ); err == nil {
122122 return next
123123 }
124124 }
125125 }
126+ if checkSNMP (buf ) {
127+ next = GetLayer (LayerSNMP )
128+ if err := next .Parse (buf ); err == nil {
129+ return next
130+ }
131+ }
126132 if len (buf ) > 15 {
127133 b1 := binary .BigEndian .Uint16 (buf [12 :14 ])
128134 if b1 == 0x0806 || b1 == 0x0800 || b1 == 0x86dd {
129- next = GetNextLayer (LayerETH )
135+ next = GetLayer (LayerETH )
130136 if err := next .Parse (buf ); err == nil {
131137 return next
132138 }
133139 }
134140 }
135141 if bytes .Contains (buf , protohttp10 ) || bytes .Contains (buf , protohttp11 ) {
136- next = GetNextLayer (LayerHTTP )
142+ next = GetLayer (LayerHTTP )
137143 if err := next .Parse (buf ); err == nil {
138144 return next
139145 }
140146 }
141147 if bytes .Contains (buf , protoSSH ) {
142- next = GetNextLayer (LayerSSH )
148+ next = GetLayer (LayerSSH )
143149 if err := next .Parse (buf ); err == nil {
144150 return next
145151 }
@@ -170,17 +176,17 @@ func parseNextLayerFromPorts(data []byte, src, dst *uint16) Layer {
170176 var next Layer
171177 switch {
172178 case addrMatch (src , dst , []uint16 {53 , 5353 , 853 , 5355 }):
173- next = GetNextLayer (LayerDNS )
179+ next = GetLayer (LayerDNS )
174180 case addrMatch (src , dst , []uint16 {80 , 8080 , 8000 , 8888 , 81 , 591 , 5911 }):
175- next = GetNextLayer (LayerHTTP )
181+ next = GetLayer (LayerHTTP )
176182 case addrMatch (src , dst , []uint16 {161 , 162 , 10161 , 10162 , 1161 , 2161 }):
177- next = GetNextLayer (LayerSNMP )
183+ next = GetLayer (LayerSNMP )
178184 case addrMatch (src , dst , []uint16 {21 , 20 , 2121 , 8021 }):
179- next = GetNextLayer (LayerFTP )
185+ next = GetLayer (LayerFTP )
180186 case addrMatch (src , dst , []uint16 {22 , 2222 , 2200 , 222 , 2022 }):
181- next = GetNextLayer (LayerSSH )
187+ next = GetLayer (LayerSSH )
182188 case addrMatch (src , dst , []uint16 {443 , 465 , 993 , 995 , 8443 , 9443 , 10443 , 8444 , 5228 }):
183- next = GetNextLayer (LayerTLS )
189+ next = GetLayer (LayerTLS )
184190 default :
185191 return nil
186192 }
@@ -206,7 +212,7 @@ func ParseNextLayer(data []byte, src, dst *uint16) Layer {
206212 return parseNextLayerFallback (buf )
207213}
208214
209- func GetNextLayer (layer LayerName ) Layer {
215+ func GetLayer (layer LayerName ) Layer {
210216 switch layer {
211217 case LayerETH :
212218 return & EthernetFrame {}
@@ -262,3 +268,11 @@ func add16WithCarryWrapAround(x, y uint16) uint16 {
262268 sum32 = (sum32 & 0xFFFF ) + (sum32 >> 16 )
263269 return uint16 (sum32 )
264270}
271+
272+ func isDigit (b byte ) bool {
273+ return b >= '0' && b <= '9'
274+ }
275+
276+ func isUpper (b byte ) bool {
277+ return b >= 'A' && b <= 'Z'
278+ }
0 commit comments