003 File Manager
Current Path:
/usr/src/contrib/tcpdump
usr
/
src
/
contrib
/
tcpdump
/
📁
..
📄
CHANGES
(57.87 KB)
📄
CONTRIBUTING
(5.93 KB)
📄
CREDITS
(14.57 KB)
📄
INSTALL.txt
(5.25 KB)
📄
LICENSE
(873 B)
📄
Makefile-devel-adds
(614 B)
📄
Makefile.in
(9.96 KB)
📄
PLATFORMS
(567 B)
📄
README
(9.04 KB)
📄
README.md
(9.04 KB)
📄
VERSION
(6 B)
📄
addrtoname.c
(33.19 KB)
📄
addrtoname.h
(2.78 KB)
📄
addrtostr.c
(5.64 KB)
📄
addrtostr.h
(2.03 KB)
📄
af.c
(1.96 KB)
📄
af.h
(1.81 KB)
📄
ah.h
(2.34 KB)
📄
appletalk.h
(4.06 KB)
📄
ascii_strcasecmp.c
(3.5 KB)
📄
ascii_strcasecmp.h
(1.49 KB)
📄
atime.awk
(529 B)
📄
atm.h
(1.14 KB)
📄
bpf_dump.c
(1.9 KB)
📄
chdlc.h
(1.31 KB)
📄
checksum.c
(5.25 KB)
📄
config.guess
(43.17 KB)
📄
config.h.in
(11.19 KB)
📄
config.sub
(34.93 KB)
📄
configure
(255.88 KB)
📄
configure.ac
(25.05 KB)
📄
configure.in
(25.66 KB)
📄
cpack.c
(3.92 KB)
📄
cpack.h
(2.37 KB)
📄
ether.h
(2.34 KB)
📄
ethertype.h
(5.58 KB)
📄
extract.h
(11.48 KB)
📄
funcattrs.h
(4.42 KB)
📄
getopt_long.h
(2.52 KB)
📄
gmpls.c
(5.82 KB)
📄
gmpls.h
(1.38 KB)
📄
gmt2local.c
(2.01 KB)
📄
gmt2local.h
(1.21 KB)
📄
in_cksum.c
(6.44 KB)
📄
install-sh
(5.45 KB)
📄
interface.h
(2.29 KB)
📄
ip.h
(5.75 KB)
📄
ip6.h
(7.6 KB)
📄
ipproto.c
(16.49 KB)
📄
ipproto.h
(4.72 KB)
📄
l2vpn.c
(3.36 KB)
📄
l2vpn.h
(781 B)
📁
lbl
📄
llc.h
(3.72 KB)
📄
machdep.c
(2.58 KB)
📄
machdep.h
(1.24 KB)
📄
makemib
(6.41 KB)
📄
mib.h
(26.33 KB)
📁
missing
📄
mkdep
(2.43 KB)
📄
mpls.h
(1.93 KB)
📄
nameser.h
(10.8 KB)
📄
netdissect-stdinc.h
(9.93 KB)
📄
netdissect.c
(3.38 KB)
📄
netdissect.h
(30.13 KB)
📄
nfs.h
(13.37 KB)
📄
nfsfh.h
(2.57 KB)
📄
nlpid.c
(1.27 KB)
📄
nlpid.h
(1.3 KB)
📄
openflow.h
(2.14 KB)
📄
ospf.h
(10.21 KB)
📄
oui.c
(3.83 KB)
📄
oui.h
(4.06 KB)
📄
packetdat.awk
(1.39 KB)
📄
parsenfsfh.c
(12.87 KB)
📄
pcap-missing.h
(1.8 KB)
📄
pcap_dump_ftell.c
(1.29 KB)
📄
ppp.h
(3.07 KB)
📄
print-802_11.c
(91.47 KB)
📄
print-802_15_4.c
(5.5 KB)
📄
print-ah.c
(2.02 KB)
📄
print-ahcp.c
(10.73 KB)
📄
print-aodv.c
(15.98 KB)
📄
print-aoe.c
(11.13 KB)
📄
print-ap1394.c
(4 KB)
📄
print-arcnet.c
(8.83 KB)
📄
print-arp.c
(14.57 KB)
📄
print-ascii.c
(6.23 KB)
📄
print-atalk.c
(16.76 KB)
📄
print-atm.c
(16.81 KB)
📄
print-babel.c
(23.79 KB)
📄
print-beep.c
(1.71 KB)
📄
print-bfd.c
(16.5 KB)
📄
print-bgp.c
(99.77 KB)
📄
print-bootp.c
(30.07 KB)
📄
print-bt.c
(2.21 KB)
📄
print-calm-fast.c
(1.81 KB)
📄
print-carp.c
(2.43 KB)
📄
print-cdp.c
(11.16 KB)
📄
print-cfm.c
(24.19 KB)
📄
print-chdlc.c
(5.88 KB)
📄
print-cip.c
(2.5 KB)
📄
print-cnfp.c
(13.69 KB)
📄
print-dccp.c
(17.75 KB)
📄
print-decnet.c
(37.63 KB)
📄
print-dhcp6.c
(23.22 KB)
📄
print-domain.c
(18.44 KB)
📄
print-dtp.c
(3.03 KB)
📄
print-dvmrp.c
(8.98 KB)
📄
print-eap.c
(9.26 KB)
📄
print-egp.c
(8.69 KB)
📄
print-eigrp.c
(19.49 KB)
📄
print-enc.c
(4.2 KB)
📄
print-esp.c
(21.46 KB)
📄
print-ether.c
(12.91 KB)
📄
print-fddi.c
(10.51 KB)
📄
print-forces.c
(45.01 KB)
📄
print-fr.c
(31.99 KB)
📄
print-frag6.c
(2.36 KB)
📄
print-ftp.c
(973 B)
📄
print-geneve.c
(6.13 KB)
📄
print-geonet.c
(6.72 KB)
📄
print-gre.c
(9.72 KB)
📄
print-hncp.c
(26.39 KB)
📄
print-hsrp.c
(4.57 KB)
📄
print-http.c
(1.51 KB)
📄
print-icmp.c
(22.7 KB)
📄
print-icmp6.c
(59.81 KB)
📄
print-igmp.c
(10.05 KB)
📄
print-igrp.c
(4.64 KB)
📄
print-ip.c
(17.04 KB)
📄
print-ip6.c
(10.57 KB)
📄
print-ip6opts.c
(5.53 KB)
📄
print-ipcomp.c
(2.32 KB)
📄
print-ipfc.c
(4.41 KB)
📄
print-ipnet.c
(2.78 KB)
📄
print-ipx.c
(6.42 KB)
📄
print-isakmp.c
(81.72 KB)
📄
print-isoclns.c
(107.61 KB)
📄
print-juniper.c
(48.42 KB)
📄
print-krb.c
(6.26 KB)
📄
print-l2tp.c
(23.94 KB)
📄
print-lane.c
(3.04 KB)
📄
print-ldp.c
(24.35 KB)
📄
print-lisp.c
(15.23 KB)
📄
print-llc.c
(16.68 KB)
📄
print-lldp.c
(57.26 KB)
📄
print-lmp.c
(38.11 KB)
📄
print-loopback.c
(3.63 KB)
📄
print-lspping.c
(51.64 KB)
📄
print-lwapp.c
(13.01 KB)
📄
print-lwres.c
(14.08 KB)
📄
print-m3ua.c
(10.92 KB)
📄
print-medsa.c
(5.57 KB)
📄
print-mobile.c
(3.28 KB)
📄
print-mobility.c
(9.74 KB)
📄
print-mpcp.c
(7.87 KB)
📄
print-mpls.c
(5.31 KB)
📄
print-mptcp.c
(13.68 KB)
📄
print-msdp.c
(2.69 KB)
📄
print-msnlb.c
(2.39 KB)
📄
print-nflog.c
(4.4 KB)
📄
print-nfs.c
(42.84 KB)
📄
print-nsh.c
(5.39 KB)
📄
print-ntp.c
(13.34 KB)
📄
print-null.c
(4.01 KB)
📄
print-olsr.c
(23.42 KB)
📄
print-openflow-1.0.c
(76.63 KB)
📄
print-openflow.c
(4.77 KB)
📄
print-ospf.c
(39.49 KB)
📄
print-ospf6.c
(29.86 KB)
📄
print-otv.c
(2.1 KB)
📄
print-pflog.c
(4.86 KB)
📄
print-pfsync.c
(12.53 KB)
📄
print-pgm.c
(22.17 KB)
📄
print-pim.c
(32.59 KB)
📄
print-pktap.c
(5.18 KB)
📄
print-ppi.c
(2.68 KB)
📄
print-ppp.c
(46.16 KB)
📄
print-pppoe.c
(5.65 KB)
📄
print-pptp.c
(25.9 KB)
📄
print-radius.c
(35.1 KB)
📄
print-raw.c
(1.52 KB)
📄
print-resp.c
(16.5 KB)
📄
print-rip.c
(9.19 KB)
📄
print-ripng.c
(6 KB)
📄
print-rpki-rtr.c
(10.83 KB)
📄
print-rrcp.c
(4.56 KB)
📄
print-rsvp.c
(78.61 KB)
📄
print-rt6.c
(2.66 KB)
📄
print-rtsp.c
(1.16 KB)
📄
print-rx.c
(66.92 KB)
📄
print-sctp.c
(23.13 KB)
📄
print-sflow.c
(31.91 KB)
📄
print-sip.c
(1.29 KB)
📄
print-sl.c
(6.95 KB)
📄
print-sll.c
(9.2 KB)
📄
print-slow.c
(25.17 KB)
📄
print-smb.c
(43.19 KB)
📄
print-smtp.c
(983 B)
📄
print-snmp.c
(43.17 KB)
📄
print-stp.c
(17.18 KB)
📄
print-sunatm.c
(3.27 KB)
📄
print-sunrpc.c
(7.85 KB)
📄
print-symantec.c
(3.78 KB)
📄
print-syslog.c
(3.96 KB)
📄
print-tcp.c
(35.84 KB)
📄
print-telnet.c
(15.02 KB)
📄
print-tftp.c
(5.2 KB)
📄
print-timed.c
(4.74 KB)
📄
print-tipc.c
(11.53 KB)
📄
print-token.c
(7.96 KB)
📄
print-udld.c
(5.47 KB)
📄
print-udp.c
(21.28 KB)
📄
print-usb.c
(4.18 KB)
📄
print-vjc.c
(4.45 KB)
📄
print-vqp.c
(6.8 KB)
📄
print-vrrp.c
(6.37 KB)
📄
print-vtp.c
(13.56 KB)
📄
print-vxlan-gpe.c
(3.46 KB)
📄
print-vxlan.c
(2.21 KB)
📄
print-wb.c
(10.93 KB)
📄
print-zephyr.c
(8.03 KB)
📄
print-zeromq.c
(7.5 KB)
📄
print.c
(11.54 KB)
📄
print.h
(1.78 KB)
📄
rpc_auth.h
(2.77 KB)
📄
rpc_msg.h
(3.19 KB)
📄
rpl.h
(4.88 KB)
📄
send-ack.awk
(1.56 KB)
📄
setsignal.c
(3.27 KB)
📄
setsignal.h
(1.24 KB)
📄
signature.c
(5.58 KB)
📄
signature.h
(1.12 KB)
📄
slcompress.h
(3.55 KB)
📄
smb.h
(5.38 KB)
📄
smbutil.c
(63.88 KB)
📄
stime.awk
(567 B)
📄
strtoaddr.c
(5.34 KB)
📄
strtoaddr.h
(992 B)
📄
tcp.h
(5.02 KB)
📄
tcpdump.1.in
(60.82 KB)
📄
tcpdump.c
(69.76 KB)
📄
timeval-operations.h
(3.19 KB)
📄
udp.h
(8.25 KB)
📄
util-print.c
(23.75 KB)
📄
vfprintf.c
(1.62 KB)
Editing: print-sflow.c
/* * Copyright (c) 1998-2007 The TCPDUMP project * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that: (1) source code * distributions retain the above copyright notice and this paragraph * in its entirety, and (2) distributions including binary code include * the above copyright notice and this paragraph in its entirety in * the documentation or other materials provided with the distribution. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE. * * Original code by Carles Kishimoto <carles.kishimoto@gmail.com> * * Expansion and refactoring by Rick Jones <rick.jones2@hp.com> */ /* \summary: sFlow protocol printer */ /* specification: http://www.sflow.org/developers/specifications.php */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include <netdissect-stdinc.h> #include "netdissect.h" #include "extract.h" #include "addrtoname.h" /* * sFlow datagram * * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Sflow version (2,4,5) | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | IP version (1 for IPv4 | 2 for IPv6) | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | IP Address AGENT (4 or 16 bytes) | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Sub agent ID | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Datagram sequence number | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Switch uptime in ms | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | num samples in datagram | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * */ struct sflow_datagram_t { uint8_t version[4]; uint8_t ip_version[4]; uint8_t agent[4]; uint8_t agent_id[4]; uint8_t seqnum[4]; uint8_t uptime[4]; uint8_t samples[4]; }; struct sflow_sample_header { uint8_t format[4]; uint8_t len[4]; }; #define SFLOW_FLOW_SAMPLE 1 #define SFLOW_COUNTER_SAMPLE 2 #define SFLOW_EXPANDED_FLOW_SAMPLE 3 #define SFLOW_EXPANDED_COUNTER_SAMPLE 4 static const struct tok sflow_format_values[] = { { SFLOW_FLOW_SAMPLE, "flow sample" }, { SFLOW_COUNTER_SAMPLE, "counter sample" }, { SFLOW_EXPANDED_FLOW_SAMPLE, "expanded flow sample" }, { SFLOW_EXPANDED_COUNTER_SAMPLE, "expanded counter sample" }, { 0, NULL} }; struct sflow_flow_sample_t { uint8_t seqnum[4]; uint8_t typesource[4]; uint8_t rate[4]; uint8_t pool[4]; uint8_t drops[4]; uint8_t in_interface[4]; uint8_t out_interface[4]; uint8_t records[4]; }; struct sflow_expanded_flow_sample_t { uint8_t seqnum[4]; uint8_t type[4]; uint8_t index[4]; uint8_t rate[4]; uint8_t pool[4]; uint8_t drops[4]; uint8_t in_interface_format[4]; uint8_t in_interface_value[4]; uint8_t out_interface_format[4]; uint8_t out_interface_value[4]; uint8_t records[4]; }; #define SFLOW_FLOW_RAW_PACKET 1 #define SFLOW_FLOW_ETHERNET_FRAME 2 #define SFLOW_FLOW_IPV4_DATA 3 #define SFLOW_FLOW_IPV6_DATA 4 #define SFLOW_FLOW_EXTENDED_SWITCH_DATA 1001 #define SFLOW_FLOW_EXTENDED_ROUTER_DATA 1002 #define SFLOW_FLOW_EXTENDED_GATEWAY_DATA 1003 #define SFLOW_FLOW_EXTENDED_USER_DATA 1004 #define SFLOW_FLOW_EXTENDED_URL_DATA 1005 #define SFLOW_FLOW_EXTENDED_MPLS_DATA 1006 #define SFLOW_FLOW_EXTENDED_NAT_DATA 1007 #define SFLOW_FLOW_EXTENDED_MPLS_TUNNEL 1008 #define SFLOW_FLOW_EXTENDED_MPLS_VC 1009 #define SFLOW_FLOW_EXTENDED_MPLS_FEC 1010 #define SFLOW_FLOW_EXTENDED_MPLS_LVP_FEC 1011 #define SFLOW_FLOW_EXTENDED_VLAN_TUNNEL 1012 static const struct tok sflow_flow_type_values[] = { { SFLOW_FLOW_RAW_PACKET, "Raw packet"}, { SFLOW_FLOW_ETHERNET_FRAME, "Ethernet frame"}, { SFLOW_FLOW_IPV4_DATA, "IPv4 Data"}, { SFLOW_FLOW_IPV6_DATA, "IPv6 Data"}, { SFLOW_FLOW_EXTENDED_SWITCH_DATA, "Extended Switch data"}, { SFLOW_FLOW_EXTENDED_ROUTER_DATA, "Extended Router data"}, { SFLOW_FLOW_EXTENDED_GATEWAY_DATA, "Extended Gateway data"}, { SFLOW_FLOW_EXTENDED_USER_DATA, "Extended User data"}, { SFLOW_FLOW_EXTENDED_URL_DATA, "Extended URL data"}, { SFLOW_FLOW_EXTENDED_MPLS_DATA, "Extended MPLS data"}, { SFLOW_FLOW_EXTENDED_NAT_DATA, "Extended NAT data"}, { SFLOW_FLOW_EXTENDED_MPLS_TUNNEL, "Extended MPLS tunnel"}, { SFLOW_FLOW_EXTENDED_MPLS_VC, "Extended MPLS VC"}, { SFLOW_FLOW_EXTENDED_MPLS_FEC, "Extended MPLS FEC"}, { SFLOW_FLOW_EXTENDED_MPLS_LVP_FEC, "Extended MPLS LVP FEC"}, { SFLOW_FLOW_EXTENDED_VLAN_TUNNEL, "Extended VLAN Tunnel"}, { 0, NULL} }; #define SFLOW_HEADER_PROTOCOL_ETHERNET 1 #define SFLOW_HEADER_PROTOCOL_IPV4 11 #define SFLOW_HEADER_PROTOCOL_IPV6 12 static const struct tok sflow_flow_raw_protocol_values[] = { { SFLOW_HEADER_PROTOCOL_ETHERNET, "Ethernet"}, { SFLOW_HEADER_PROTOCOL_IPV4, "IPv4"}, { SFLOW_HEADER_PROTOCOL_IPV6, "IPv6"}, { 0, NULL} }; struct sflow_expanded_flow_raw_t { uint8_t protocol[4]; uint8_t length[4]; uint8_t stripped_bytes[4]; uint8_t header_size[4]; }; struct sflow_ethernet_frame_t { uint8_t length[4]; uint8_t src_mac[8]; uint8_t dst_mac[8]; uint8_t type[4]; }; struct sflow_extended_switch_data_t { uint8_t src_vlan[4]; uint8_t src_pri[4]; uint8_t dst_vlan[4]; uint8_t dst_pri[4]; }; struct sflow_counter_record_t { uint8_t format[4]; uint8_t length[4]; }; struct sflow_flow_record_t { uint8_t format[4]; uint8_t length[4]; }; struct sflow_counter_sample_t { uint8_t seqnum[4]; uint8_t typesource[4]; uint8_t records[4]; }; struct sflow_expanded_counter_sample_t { uint8_t seqnum[4]; uint8_t type[4]; uint8_t index[4]; uint8_t records[4]; }; #define SFLOW_COUNTER_GENERIC 1 #define SFLOW_COUNTER_ETHERNET 2 #define SFLOW_COUNTER_TOKEN_RING 3 #define SFLOW_COUNTER_BASEVG 4 #define SFLOW_COUNTER_VLAN 5 #define SFLOW_COUNTER_PROCESSOR 1001 static const struct tok sflow_counter_type_values[] = { { SFLOW_COUNTER_GENERIC, "Generic counter"}, { SFLOW_COUNTER_ETHERNET, "Ethernet counter"}, { SFLOW_COUNTER_TOKEN_RING, "Token ring counter"}, { SFLOW_COUNTER_BASEVG, "100 BaseVG counter"}, { SFLOW_COUNTER_VLAN, "Vlan counter"}, { SFLOW_COUNTER_PROCESSOR, "Processor counter"}, { 0, NULL} }; #define SFLOW_IFACE_DIRECTION_UNKNOWN 0 #define SFLOW_IFACE_DIRECTION_FULLDUPLEX 1 #define SFLOW_IFACE_DIRECTION_HALFDUPLEX 2 #define SFLOW_IFACE_DIRECTION_IN 3 #define SFLOW_IFACE_DIRECTION_OUT 4 static const struct tok sflow_iface_direction_values[] = { { SFLOW_IFACE_DIRECTION_UNKNOWN, "unknown"}, { SFLOW_IFACE_DIRECTION_FULLDUPLEX, "full-duplex"}, { SFLOW_IFACE_DIRECTION_HALFDUPLEX, "half-duplex"}, { SFLOW_IFACE_DIRECTION_IN, "in"}, { SFLOW_IFACE_DIRECTION_OUT, "out"}, { 0, NULL} }; struct sflow_generic_counter_t { uint8_t ifindex[4]; uint8_t iftype[4]; uint8_t ifspeed[8]; uint8_t ifdirection[4]; uint8_t ifstatus[4]; uint8_t ifinoctets[8]; uint8_t ifinunicastpkts[4]; uint8_t ifinmulticastpkts[4]; uint8_t ifinbroadcastpkts[4]; uint8_t ifindiscards[4]; uint8_t ifinerrors[4]; uint8_t ifinunkownprotos[4]; uint8_t ifoutoctets[8]; uint8_t ifoutunicastpkts[4]; uint8_t ifoutmulticastpkts[4]; uint8_t ifoutbroadcastpkts[4]; uint8_t ifoutdiscards[4]; uint8_t ifouterrors[4]; uint8_t ifpromiscmode[4]; }; struct sflow_ethernet_counter_t { uint8_t alignerrors[4]; uint8_t fcserrors[4]; uint8_t single_collision_frames[4]; uint8_t multiple_collision_frames[4]; uint8_t test_errors[4]; uint8_t deferred_transmissions[4]; uint8_t late_collisions[4]; uint8_t excessive_collisions[4]; uint8_t mac_transmit_errors[4]; uint8_t carrier_sense_errors[4]; uint8_t frame_too_longs[4]; uint8_t mac_receive_errors[4]; uint8_t symbol_errors[4]; }; struct sflow_100basevg_counter_t { uint8_t in_highpriority_frames[4]; uint8_t in_highpriority_octets[8]; uint8_t in_normpriority_frames[4]; uint8_t in_normpriority_octets[8]; uint8_t in_ipmerrors[4]; uint8_t in_oversized[4]; uint8_t in_data_errors[4]; uint8_t in_null_addressed_frames[4]; uint8_t out_highpriority_frames[4]; uint8_t out_highpriority_octets[8]; uint8_t transitioninto_frames[4]; uint8_t hc_in_highpriority_octets[8]; uint8_t hc_in_normpriority_octets[8]; uint8_t hc_out_highpriority_octets[8]; }; struct sflow_vlan_counter_t { uint8_t vlan_id[4]; uint8_t octets[8]; uint8_t unicast_pkt[4]; uint8_t multicast_pkt[4]; uint8_t broadcast_pkt[4]; uint8_t discards[4]; }; static int print_sflow_counter_generic(netdissect_options *ndo, const u_char *pointer, u_int len) { const struct sflow_generic_counter_t *sflow_gen_counter; if (len < sizeof(struct sflow_generic_counter_t)) return 1; sflow_gen_counter = (const struct sflow_generic_counter_t *)pointer; ND_TCHECK(*sflow_gen_counter); ND_PRINT((ndo, "\n\t ifindex %u, iftype %u, ifspeed %" PRIu64 ", ifdirection %u (%s)", EXTRACT_32BITS(sflow_gen_counter->ifindex), EXTRACT_32BITS(sflow_gen_counter->iftype), EXTRACT_64BITS(sflow_gen_counter->ifspeed), EXTRACT_32BITS(sflow_gen_counter->ifdirection), tok2str(sflow_iface_direction_values, "Unknown", EXTRACT_32BITS(sflow_gen_counter->ifdirection)))); ND_PRINT((ndo, "\n\t ifstatus %u, adminstatus: %s, operstatus: %s", EXTRACT_32BITS(sflow_gen_counter->ifstatus), EXTRACT_32BITS(sflow_gen_counter->ifstatus)&1 ? "up" : "down", (EXTRACT_32BITS(sflow_gen_counter->ifstatus)>>1)&1 ? "up" : "down")); ND_PRINT((ndo, "\n\t In octets %" PRIu64 ", unicast pkts %u, multicast pkts %u, broadcast pkts %u, discards %u", EXTRACT_64BITS(sflow_gen_counter->ifinoctets), EXTRACT_32BITS(sflow_gen_counter->ifinunicastpkts), EXTRACT_32BITS(sflow_gen_counter->ifinmulticastpkts), EXTRACT_32BITS(sflow_gen_counter->ifinbroadcastpkts), EXTRACT_32BITS(sflow_gen_counter->ifindiscards))); ND_PRINT((ndo, "\n\t In errors %u, unknown protos %u", EXTRACT_32BITS(sflow_gen_counter->ifinerrors), EXTRACT_32BITS(sflow_gen_counter->ifinunkownprotos))); ND_PRINT((ndo, "\n\t Out octets %" PRIu64 ", unicast pkts %u, multicast pkts %u, broadcast pkts %u, discards %u", EXTRACT_64BITS(sflow_gen_counter->ifoutoctets), EXTRACT_32BITS(sflow_gen_counter->ifoutunicastpkts), EXTRACT_32BITS(sflow_gen_counter->ifoutmulticastpkts), EXTRACT_32BITS(sflow_gen_counter->ifoutbroadcastpkts), EXTRACT_32BITS(sflow_gen_counter->ifoutdiscards))); ND_PRINT((ndo, "\n\t Out errors %u, promisc mode %u", EXTRACT_32BITS(sflow_gen_counter->ifouterrors), EXTRACT_32BITS(sflow_gen_counter->ifpromiscmode))); return 0; trunc: return 1; } static int print_sflow_counter_ethernet(netdissect_options *ndo, const u_char *pointer, u_int len) { const struct sflow_ethernet_counter_t *sflow_eth_counter; if (len < sizeof(struct sflow_ethernet_counter_t)) return 1; sflow_eth_counter = (const struct sflow_ethernet_counter_t *)pointer; ND_TCHECK(*sflow_eth_counter); ND_PRINT((ndo, "\n\t align errors %u, fcs errors %u, single collision %u, multiple collision %u, test error %u", EXTRACT_32BITS(sflow_eth_counter->alignerrors), EXTRACT_32BITS(sflow_eth_counter->fcserrors), EXTRACT_32BITS(sflow_eth_counter->single_collision_frames), EXTRACT_32BITS(sflow_eth_counter->multiple_collision_frames), EXTRACT_32BITS(sflow_eth_counter->test_errors))); ND_PRINT((ndo, "\n\t deferred %u, late collision %u, excessive collision %u, mac trans error %u", EXTRACT_32BITS(sflow_eth_counter->deferred_transmissions), EXTRACT_32BITS(sflow_eth_counter->late_collisions), EXTRACT_32BITS(sflow_eth_counter->excessive_collisions), EXTRACT_32BITS(sflow_eth_counter->mac_transmit_errors))); ND_PRINT((ndo, "\n\t carrier error %u, frames too long %u, mac receive errors %u, symbol errors %u", EXTRACT_32BITS(sflow_eth_counter->carrier_sense_errors), EXTRACT_32BITS(sflow_eth_counter->frame_too_longs), EXTRACT_32BITS(sflow_eth_counter->mac_receive_errors), EXTRACT_32BITS(sflow_eth_counter->symbol_errors))); return 0; trunc: return 1; } static int print_sflow_counter_token_ring(netdissect_options *ndo _U_, const u_char *pointer _U_, u_int len _U_) { return 0; } static int print_sflow_counter_basevg(netdissect_options *ndo, const u_char *pointer, u_int len) { const struct sflow_100basevg_counter_t *sflow_100basevg_counter; if (len < sizeof(struct sflow_100basevg_counter_t)) return 1; sflow_100basevg_counter = (const struct sflow_100basevg_counter_t *)pointer; ND_TCHECK(*sflow_100basevg_counter); ND_PRINT((ndo, "\n\t in high prio frames %u, in high prio octets %" PRIu64, EXTRACT_32BITS(sflow_100basevg_counter->in_highpriority_frames), EXTRACT_64BITS(sflow_100basevg_counter->in_highpriority_octets))); ND_PRINT((ndo, "\n\t in norm prio frames %u, in norm prio octets %" PRIu64, EXTRACT_32BITS(sflow_100basevg_counter->in_normpriority_frames), EXTRACT_64BITS(sflow_100basevg_counter->in_normpriority_octets))); ND_PRINT((ndo, "\n\t in ipm errors %u, oversized %u, in data errors %u, null addressed frames %u", EXTRACT_32BITS(sflow_100basevg_counter->in_ipmerrors), EXTRACT_32BITS(sflow_100basevg_counter->in_oversized), EXTRACT_32BITS(sflow_100basevg_counter->in_data_errors), EXTRACT_32BITS(sflow_100basevg_counter->in_null_addressed_frames))); ND_PRINT((ndo, "\n\t out high prio frames %u, out high prio octets %" PRIu64 ", trans into frames %u", EXTRACT_32BITS(sflow_100basevg_counter->out_highpriority_frames), EXTRACT_64BITS(sflow_100basevg_counter->out_highpriority_octets), EXTRACT_32BITS(sflow_100basevg_counter->transitioninto_frames))); ND_PRINT((ndo, "\n\t in hc high prio octets %" PRIu64 ", in hc norm prio octets %" PRIu64 ", out hc high prio octets %" PRIu64, EXTRACT_64BITS(sflow_100basevg_counter->hc_in_highpriority_octets), EXTRACT_64BITS(sflow_100basevg_counter->hc_in_normpriority_octets), EXTRACT_64BITS(sflow_100basevg_counter->hc_out_highpriority_octets))); return 0; trunc: return 1; } static int print_sflow_counter_vlan(netdissect_options *ndo, const u_char *pointer, u_int len) { const struct sflow_vlan_counter_t *sflow_vlan_counter; if (len < sizeof(struct sflow_vlan_counter_t)) return 1; sflow_vlan_counter = (const struct sflow_vlan_counter_t *)pointer; ND_TCHECK(*sflow_vlan_counter); ND_PRINT((ndo, "\n\t vlan_id %u, octets %" PRIu64 ", unicast_pkt %u, multicast_pkt %u, broadcast_pkt %u, discards %u", EXTRACT_32BITS(sflow_vlan_counter->vlan_id), EXTRACT_64BITS(sflow_vlan_counter->octets), EXTRACT_32BITS(sflow_vlan_counter->unicast_pkt), EXTRACT_32BITS(sflow_vlan_counter->multicast_pkt), EXTRACT_32BITS(sflow_vlan_counter->broadcast_pkt), EXTRACT_32BITS(sflow_vlan_counter->discards))); return 0; trunc: return 1; } struct sflow_processor_counter_t { uint8_t five_sec_util[4]; uint8_t one_min_util[4]; uint8_t five_min_util[4]; uint8_t total_memory[8]; uint8_t free_memory[8]; }; static int print_sflow_counter_processor(netdissect_options *ndo, const u_char *pointer, u_int len) { const struct sflow_processor_counter_t *sflow_processor_counter; if (len < sizeof(struct sflow_processor_counter_t)) return 1; sflow_processor_counter = (const struct sflow_processor_counter_t *)pointer; ND_TCHECK(*sflow_processor_counter); ND_PRINT((ndo, "\n\t 5sec %u, 1min %u, 5min %u, total_mem %" PRIu64 ", total_mem %" PRIu64, EXTRACT_32BITS(sflow_processor_counter->five_sec_util), EXTRACT_32BITS(sflow_processor_counter->one_min_util), EXTRACT_32BITS(sflow_processor_counter->five_min_util), EXTRACT_64BITS(sflow_processor_counter->total_memory), EXTRACT_64BITS(sflow_processor_counter->free_memory))); return 0; trunc: return 1; } static int sflow_print_counter_records(netdissect_options *ndo, const u_char *pointer, u_int len, u_int records) { u_int nrecords; const u_char *tptr; u_int tlen; u_int counter_type; u_int counter_len; u_int enterprise; const struct sflow_counter_record_t *sflow_counter_record; nrecords = records; tptr = pointer; tlen = len; while (nrecords > 0) { /* do we have the "header?" */ if (tlen < sizeof(struct sflow_counter_record_t)) return 1; sflow_counter_record = (const struct sflow_counter_record_t *)tptr; ND_TCHECK(*sflow_counter_record); enterprise = EXTRACT_32BITS(sflow_counter_record->format); counter_type = enterprise & 0x0FFF; enterprise = enterprise >> 20; counter_len = EXTRACT_32BITS(sflow_counter_record->length); ND_PRINT((ndo, "\n\t enterprise %u, %s (%u) length %u", enterprise, (enterprise == 0) ? tok2str(sflow_counter_type_values,"Unknown",counter_type) : "Unknown", counter_type, counter_len)); tptr += sizeof(struct sflow_counter_record_t); tlen -= sizeof(struct sflow_counter_record_t); if (tlen < counter_len) return 1; if (enterprise == 0) { switch (counter_type) { case SFLOW_COUNTER_GENERIC: if (print_sflow_counter_generic(ndo, tptr, tlen)) return 1; break; case SFLOW_COUNTER_ETHERNET: if (print_sflow_counter_ethernet(ndo, tptr, tlen)) return 1; break; case SFLOW_COUNTER_TOKEN_RING: if (print_sflow_counter_token_ring(ndo, tptr,tlen)) return 1; break; case SFLOW_COUNTER_BASEVG: if (print_sflow_counter_basevg(ndo, tptr, tlen)) return 1; break; case SFLOW_COUNTER_VLAN: if (print_sflow_counter_vlan(ndo, tptr, tlen)) return 1; break; case SFLOW_COUNTER_PROCESSOR: if (print_sflow_counter_processor(ndo, tptr, tlen)) return 1; break; default: if (ndo->ndo_vflag <= 1) print_unknown_data(ndo, tptr, "\n\t\t", counter_len); break; } } tptr += counter_len; tlen -= counter_len; nrecords--; } return 0; trunc: return 1; } static int sflow_print_counter_sample(netdissect_options *ndo, const u_char *pointer, u_int len) { const struct sflow_counter_sample_t *sflow_counter_sample; u_int nrecords; u_int typesource; u_int type; u_int index; if (len < sizeof(struct sflow_counter_sample_t)) return 1; sflow_counter_sample = (const struct sflow_counter_sample_t *)pointer; ND_TCHECK(*sflow_counter_sample); typesource = EXTRACT_32BITS(sflow_counter_sample->typesource); nrecords = EXTRACT_32BITS(sflow_counter_sample->records); type = typesource >> 24; index = typesource & 0x0FFF; ND_PRINT((ndo, " seqnum %u, type %u, idx %u, records %u", EXTRACT_32BITS(sflow_counter_sample->seqnum), type, index, nrecords)); return sflow_print_counter_records(ndo, pointer + sizeof(struct sflow_counter_sample_t), len - sizeof(struct sflow_counter_sample_t), nrecords); trunc: return 1; } static int sflow_print_expanded_counter_sample(netdissect_options *ndo, const u_char *pointer, u_int len) { const struct sflow_expanded_counter_sample_t *sflow_expanded_counter_sample; u_int nrecords; if (len < sizeof(struct sflow_expanded_counter_sample_t)) return 1; sflow_expanded_counter_sample = (const struct sflow_expanded_counter_sample_t *)pointer; ND_TCHECK(*sflow_expanded_counter_sample); nrecords = EXTRACT_32BITS(sflow_expanded_counter_sample->records); ND_PRINT((ndo, " seqnum %u, type %u, idx %u, records %u", EXTRACT_32BITS(sflow_expanded_counter_sample->seqnum), EXTRACT_32BITS(sflow_expanded_counter_sample->type), EXTRACT_32BITS(sflow_expanded_counter_sample->index), nrecords)); return sflow_print_counter_records(ndo, pointer + sizeof(struct sflow_expanded_counter_sample_t), len - sizeof(struct sflow_expanded_counter_sample_t), nrecords); trunc: return 1; } static int print_sflow_raw_packet(netdissect_options *ndo, const u_char *pointer, u_int len) { const struct sflow_expanded_flow_raw_t *sflow_flow_raw; if (len < sizeof(struct sflow_expanded_flow_raw_t)) return 1; sflow_flow_raw = (const struct sflow_expanded_flow_raw_t *)pointer; ND_TCHECK(*sflow_flow_raw); ND_PRINT((ndo, "\n\t protocol %s (%u), length %u, stripped bytes %u, header_size %u", tok2str(sflow_flow_raw_protocol_values,"Unknown",EXTRACT_32BITS(sflow_flow_raw->protocol)), EXTRACT_32BITS(sflow_flow_raw->protocol), EXTRACT_32BITS(sflow_flow_raw->length), EXTRACT_32BITS(sflow_flow_raw->stripped_bytes), EXTRACT_32BITS(sflow_flow_raw->header_size))); /* QUESTION - should we attempt to print the raw header itself? assuming of course there is wnough data present to do so... */ return 0; trunc: return 1; } static int print_sflow_ethernet_frame(netdissect_options *ndo, const u_char *pointer, u_int len) { const struct sflow_ethernet_frame_t *sflow_ethernet_frame; if (len < sizeof(struct sflow_ethernet_frame_t)) return 1; sflow_ethernet_frame = (const struct sflow_ethernet_frame_t *)pointer; ND_TCHECK(*sflow_ethernet_frame); ND_PRINT((ndo, "\n\t frame len %u, type %u", EXTRACT_32BITS(sflow_ethernet_frame->length), EXTRACT_32BITS(sflow_ethernet_frame->type))); return 0; trunc: return 1; } static int print_sflow_extended_switch_data(netdissect_options *ndo, const u_char *pointer, u_int len) { const struct sflow_extended_switch_data_t *sflow_extended_sw_data; if (len < sizeof(struct sflow_extended_switch_data_t)) return 1; sflow_extended_sw_data = (const struct sflow_extended_switch_data_t *)pointer; ND_TCHECK(*sflow_extended_sw_data); ND_PRINT((ndo, "\n\t src vlan %u, src pri %u, dst vlan %u, dst pri %u", EXTRACT_32BITS(sflow_extended_sw_data->src_vlan), EXTRACT_32BITS(sflow_extended_sw_data->src_pri), EXTRACT_32BITS(sflow_extended_sw_data->dst_vlan), EXTRACT_32BITS(sflow_extended_sw_data->dst_pri))); return 0; trunc: return 1; } static int sflow_print_flow_records(netdissect_options *ndo, const u_char *pointer, u_int len, u_int records) { u_int nrecords; const u_char *tptr; u_int tlen; u_int flow_type; u_int enterprise; u_int flow_len; const struct sflow_flow_record_t *sflow_flow_record; nrecords = records; tptr = pointer; tlen = len; while (nrecords > 0) { /* do we have the "header?" */ if (tlen < sizeof(struct sflow_flow_record_t)) return 1; sflow_flow_record = (const struct sflow_flow_record_t *)tptr; ND_TCHECK(*sflow_flow_record); /* so, the funky encoding means we cannot blythly mask-off bits, we must also check the enterprise. */ enterprise = EXTRACT_32BITS(sflow_flow_record->format); flow_type = enterprise & 0x0FFF; enterprise = enterprise >> 12; flow_len = EXTRACT_32BITS(sflow_flow_record->length); ND_PRINT((ndo, "\n\t enterprise %u %s (%u) length %u", enterprise, (enterprise == 0) ? tok2str(sflow_flow_type_values,"Unknown",flow_type) : "Unknown", flow_type, flow_len)); tptr += sizeof(struct sflow_flow_record_t); tlen -= sizeof(struct sflow_flow_record_t); if (tlen < flow_len) return 1; if (enterprise == 0) { switch (flow_type) { case SFLOW_FLOW_RAW_PACKET: if (print_sflow_raw_packet(ndo, tptr, tlen)) return 1; break; case SFLOW_FLOW_EXTENDED_SWITCH_DATA: if (print_sflow_extended_switch_data(ndo, tptr, tlen)) return 1; break; case SFLOW_FLOW_ETHERNET_FRAME: if (print_sflow_ethernet_frame(ndo, tptr, tlen)) return 1; break; /* FIXME these need a decoder */ case SFLOW_FLOW_IPV4_DATA: case SFLOW_FLOW_IPV6_DATA: case SFLOW_FLOW_EXTENDED_ROUTER_DATA: case SFLOW_FLOW_EXTENDED_GATEWAY_DATA: case SFLOW_FLOW_EXTENDED_USER_DATA: case SFLOW_FLOW_EXTENDED_URL_DATA: case SFLOW_FLOW_EXTENDED_MPLS_DATA: case SFLOW_FLOW_EXTENDED_NAT_DATA: case SFLOW_FLOW_EXTENDED_MPLS_TUNNEL: case SFLOW_FLOW_EXTENDED_MPLS_VC: case SFLOW_FLOW_EXTENDED_MPLS_FEC: case SFLOW_FLOW_EXTENDED_MPLS_LVP_FEC: case SFLOW_FLOW_EXTENDED_VLAN_TUNNEL: break; default: if (ndo->ndo_vflag <= 1) print_unknown_data(ndo, tptr, "\n\t\t", flow_len); break; } } tptr += flow_len; tlen -= flow_len; nrecords--; } return 0; trunc: return 1; } static int sflow_print_flow_sample(netdissect_options *ndo, const u_char *pointer, u_int len) { const struct sflow_flow_sample_t *sflow_flow_sample; u_int nrecords; u_int typesource; u_int type; u_int index; if (len < sizeof(struct sflow_flow_sample_t)) return 1; sflow_flow_sample = (const struct sflow_flow_sample_t *)pointer; ND_TCHECK(*sflow_flow_sample); typesource = EXTRACT_32BITS(sflow_flow_sample->typesource); nrecords = EXTRACT_32BITS(sflow_flow_sample->records); type = typesource >> 24; index = typesource & 0x0FFF; ND_PRINT((ndo, " seqnum %u, type %u, idx %u, rate %u, pool %u, drops %u, input %u output %u records %u", EXTRACT_32BITS(sflow_flow_sample->seqnum), type, index, EXTRACT_32BITS(sflow_flow_sample->rate), EXTRACT_32BITS(sflow_flow_sample->pool), EXTRACT_32BITS(sflow_flow_sample->drops), EXTRACT_32BITS(sflow_flow_sample->in_interface), EXTRACT_32BITS(sflow_flow_sample->out_interface), nrecords)); return sflow_print_flow_records(ndo, pointer + sizeof(struct sflow_flow_sample_t), len - sizeof(struct sflow_flow_sample_t), nrecords); trunc: return 1; } static int sflow_print_expanded_flow_sample(netdissect_options *ndo, const u_char *pointer, u_int len) { const struct sflow_expanded_flow_sample_t *sflow_expanded_flow_sample; u_int nrecords; if (len < sizeof(struct sflow_expanded_flow_sample_t)) return 1; sflow_expanded_flow_sample = (const struct sflow_expanded_flow_sample_t *)pointer; ND_TCHECK(*sflow_expanded_flow_sample); nrecords = EXTRACT_32BITS(sflow_expanded_flow_sample->records); ND_PRINT((ndo, " seqnum %u, type %u, idx %u, rate %u, pool %u, drops %u, records %u", EXTRACT_32BITS(sflow_expanded_flow_sample->seqnum), EXTRACT_32BITS(sflow_expanded_flow_sample->type), EXTRACT_32BITS(sflow_expanded_flow_sample->index), EXTRACT_32BITS(sflow_expanded_flow_sample->rate), EXTRACT_32BITS(sflow_expanded_flow_sample->pool), EXTRACT_32BITS(sflow_expanded_flow_sample->drops), EXTRACT_32BITS(sflow_expanded_flow_sample->records))); return sflow_print_flow_records(ndo, pointer + sizeof(struct sflow_expanded_flow_sample_t), len - sizeof(struct sflow_expanded_flow_sample_t), nrecords); trunc: return 1; } void sflow_print(netdissect_options *ndo, const u_char *pptr, u_int len) { const struct sflow_datagram_t *sflow_datagram; const struct sflow_sample_header *sflow_sample; const u_char *tptr; u_int tlen; uint32_t sflow_sample_type, sflow_sample_len; uint32_t nsamples; tptr = pptr; tlen = len; sflow_datagram = (const struct sflow_datagram_t *)pptr; if (len < sizeof(struct sflow_datagram_t)) { ND_TCHECK(sflow_datagram->version); ND_PRINT((ndo, "sFlowv%u", EXTRACT_32BITS(sflow_datagram->version))); ND_PRINT((ndo, " [length %u < %zu]", len, sizeof(struct sflow_datagram_t))); ND_PRINT((ndo, " (invalid)")); return; } ND_TCHECK(*sflow_datagram); /* * Sanity checking of the header. */ if (EXTRACT_32BITS(sflow_datagram->version) != 5) { ND_PRINT((ndo, "sFlow version %u packet not supported", EXTRACT_32BITS(sflow_datagram->version))); return; } if (ndo->ndo_vflag < 1) { ND_PRINT((ndo, "sFlowv%u, %s agent %s, agent-id %u, length %u", EXTRACT_32BITS(sflow_datagram->version), EXTRACT_32BITS(sflow_datagram->ip_version) == 1 ? "IPv4" : "IPv6", ipaddr_string(ndo, sflow_datagram->agent), EXTRACT_32BITS(sflow_datagram->agent_id), len)); return; } /* ok they seem to want to know everything - lets fully decode it */ nsamples=EXTRACT_32BITS(sflow_datagram->samples); ND_PRINT((ndo, "sFlowv%u, %s agent %s, agent-id %u, seqnum %u, uptime %u, samples %u, length %u", EXTRACT_32BITS(sflow_datagram->version), EXTRACT_32BITS(sflow_datagram->ip_version) == 1 ? "IPv4" : "IPv6", ipaddr_string(ndo, sflow_datagram->agent), EXTRACT_32BITS(sflow_datagram->agent_id), EXTRACT_32BITS(sflow_datagram->seqnum), EXTRACT_32BITS(sflow_datagram->uptime), nsamples, len)); /* skip Common header */ tptr += sizeof(const struct sflow_datagram_t); if(tlen <= sizeof(const struct sflow_datagram_t)) goto trunc; tlen -= sizeof(const struct sflow_datagram_t); while (nsamples > 0 && tlen > 0) { sflow_sample = (const struct sflow_sample_header *)tptr; ND_TCHECK(*sflow_sample); sflow_sample_type = (EXTRACT_32BITS(sflow_sample->format)&0x0FFF); sflow_sample_len = EXTRACT_32BITS(sflow_sample->len); if (tlen < sizeof(struct sflow_sample_header)) goto trunc; tptr += sizeof(struct sflow_sample_header); tlen -= sizeof(struct sflow_sample_header); ND_PRINT((ndo, "\n\t%s (%u), length %u,", tok2str(sflow_format_values, "Unknown", sflow_sample_type), sflow_sample_type, sflow_sample_len)); /* basic sanity check */ if (sflow_sample_type == 0 || sflow_sample_len ==0) { return; } if (tlen < sflow_sample_len) goto trunc; /* did we capture enough for fully decoding the sample ? */ ND_TCHECK2(*tptr, sflow_sample_len); switch(sflow_sample_type) { case SFLOW_FLOW_SAMPLE: if (sflow_print_flow_sample(ndo, tptr, tlen)) goto trunc; break; case SFLOW_COUNTER_SAMPLE: if (sflow_print_counter_sample(ndo, tptr,tlen)) goto trunc; break; case SFLOW_EXPANDED_FLOW_SAMPLE: if (sflow_print_expanded_flow_sample(ndo, tptr, tlen)) goto trunc; break; case SFLOW_EXPANDED_COUNTER_SAMPLE: if (sflow_print_expanded_counter_sample(ndo, tptr,tlen)) goto trunc; break; default: if (ndo->ndo_vflag <= 1) print_unknown_data(ndo, tptr, "\n\t ", sflow_sample_len); break; } tptr += sflow_sample_len; tlen -= sflow_sample_len; nsamples--; } return; trunc: ND_PRINT((ndo, "[|SFLOW]")); } /* * Local Variables: * c-style: whitesmith * c-basic-offset: 4 * End: */
Upload File
Create Folder