aboutsummaryrefslogtreecommitdiffstats
path: root/Documentation/networking
diff options
context:
space:
mode:
Diffstat (limited to 'Documentation/networking')
-rw-r--r--Documentation/networking/bonding.txt31
-rw-r--r--Documentation/networking/filter.txt12
-rw-r--r--Documentation/networking/i40e.txt7
-rw-r--r--Documentation/networking/ip-sysctl.txt38
-rw-r--r--Documentation/networking/packet_mmap.txt18
-rw-r--r--Documentation/networking/phy.txt18
-rw-r--r--Documentation/networking/pktgen.txt28
-rw-r--r--Documentation/networking/timestamping.txt16
-rw-r--r--Documentation/networking/timestamping/timestamping.c7
9 files changed, 112 insertions, 63 deletions
diff --git a/Documentation/networking/bonding.txt b/Documentation/networking/bonding.txt
index 9c723ecd0025..eeb5b2e97bed 100644
--- a/Documentation/networking/bonding.txt
+++ b/Documentation/networking/bonding.txt
@@ -542,10 +542,10 @@ mode
542 542
543 XOR policy: Transmit based on the selected transmit 543 XOR policy: Transmit based on the selected transmit
544 hash policy. The default policy is a simple [(source 544 hash policy. The default policy is a simple [(source
545 MAC address XOR'd with destination MAC address) modulo 545 MAC address XOR'd with destination MAC address XOR
546 slave count]. Alternate transmit policies may be 546 packet type ID) modulo slave count]. Alternate transmit
547 selected via the xmit_hash_policy option, described 547 policies may be selected via the xmit_hash_policy option,
548 below. 548 described below.
549 549
550 This mode provides load balancing and fault tolerance. 550 This mode provides load balancing and fault tolerance.
551 551
@@ -801,10 +801,11 @@ xmit_hash_policy
801 801
802 layer2 802 layer2
803 803
804 Uses XOR of hardware MAC addresses to generate the 804 Uses XOR of hardware MAC addresses and packet type ID
805 hash. The formula is 805 field to generate the hash. The formula is
806 806
807 (source MAC XOR destination MAC) modulo slave count 807 hash = source MAC XOR destination MAC XOR packet type ID
808 slave number = hash modulo slave count
808 809
809 This algorithm will place all traffic to a particular 810 This algorithm will place all traffic to a particular
810 network peer on the same slave. 811 network peer on the same slave.
@@ -819,7 +820,7 @@ xmit_hash_policy
819 Uses XOR of hardware MAC addresses and IP addresses to 820 Uses XOR of hardware MAC addresses and IP addresses to
820 generate the hash. The formula is 821 generate the hash. The formula is
821 822
822 hash = source MAC XOR destination MAC 823 hash = source MAC XOR destination MAC XOR packet type ID
823 hash = hash XOR source IP XOR destination IP 824 hash = hash XOR source IP XOR destination IP
824 hash = hash XOR (hash RSHIFT 16) 825 hash = hash XOR (hash RSHIFT 16)
825 hash = hash XOR (hash RSHIFT 8) 826 hash = hash XOR (hash RSHIFT 8)
@@ -2301,13 +2302,13 @@ broadcast: Like active-backup, there is not much advantage to this
2301 bandwidth. 2302 bandwidth.
2302 2303
2303 Additionally, the linux bonding 802.3ad implementation 2304 Additionally, the linux bonding 802.3ad implementation
2304 distributes traffic by peer (using an XOR of MAC addresses), 2305 distributes traffic by peer (using an XOR of MAC addresses
2305 so in a "gatewayed" configuration, all outgoing traffic will 2306 and packet type ID), so in a "gatewayed" configuration, all
2306 generally use the same device. Incoming traffic may also end 2307 outgoing traffic will generally use the same device. Incoming
2307 up on a single device, but that is dependent upon the 2308 traffic may also end up on a single device, but that is
2308 balancing policy of the peer's 8023.ad implementation. In a 2309 dependent upon the balancing policy of the peer's 8023.ad
2309 "local" configuration, traffic will be distributed across the 2310 implementation. In a "local" configuration, traffic will be
2310 devices in the bond. 2311 distributed across the devices in the bond.
2311 2312
2312 Finally, the 802.3ad mode mandates the use of the MII monitor, 2313 Finally, the 802.3ad mode mandates the use of the MII monitor,
2313 therefore, the ARP monitor is not available in this mode. 2314 therefore, the ARP monitor is not available in this mode.
diff --git a/Documentation/networking/filter.txt b/Documentation/networking/filter.txt
index ee78eba78a9d..c48a9704bda8 100644
--- a/Documentation/networking/filter.txt
+++ b/Documentation/networking/filter.txt
@@ -586,12 +586,12 @@ team driver's classifier for its load-balancing mode, netfilter's xt_bpf
586extension, PTP dissector/classifier, and much more. They are all internally 586extension, PTP dissector/classifier, and much more. They are all internally
587converted by the kernel into the new instruction set representation and run 587converted by the kernel into the new instruction set representation and run
588in the eBPF interpreter. For in-kernel handlers, this all works transparently 588in the eBPF interpreter. For in-kernel handlers, this all works transparently
589by using sk_unattached_filter_create() for setting up the filter, resp. 589by using bpf_prog_create() for setting up the filter, resp.
590sk_unattached_filter_destroy() for destroying it. The macro 590bpf_prog_destroy() for destroying it. The macro
591SK_RUN_FILTER(filter, ctx) transparently invokes eBPF interpreter or JITed 591BPF_PROG_RUN(filter, ctx) transparently invokes eBPF interpreter or JITed
592code to run the filter. 'filter' is a pointer to struct sk_filter that we 592code to run the filter. 'filter' is a pointer to struct bpf_prog that we
593got from sk_unattached_filter_create(), and 'ctx' the given context (e.g. 593got from bpf_prog_create(), and 'ctx' the given context (e.g.
594skb pointer). All constraints and restrictions from sk_chk_filter() apply 594skb pointer). All constraints and restrictions from bpf_check_classic() apply
595before a conversion to the new layout is being done behind the scenes! 595before a conversion to the new layout is being done behind the scenes!
596 596
597Currently, the classic BPF format is being used for JITing on most of the 597Currently, the classic BPF format is being used for JITing on most of the
diff --git a/Documentation/networking/i40e.txt b/Documentation/networking/i40e.txt
index f737273c6dc1..a251bf4fe9c9 100644
--- a/Documentation/networking/i40e.txt
+++ b/Documentation/networking/i40e.txt
@@ -69,8 +69,11 @@ Additional Configurations
69 69
70 FCoE 70 FCoE
71 ---- 71 ----
72 Fiber Channel over Ethernet (FCoE) hardware offload is not currently 72 The driver supports Fiber Channel over Ethernet (FCoE) and Data Center
73 supported. 73 Bridging (DCB) functionality. Configuring DCB and FCoE is outside the scope
74 of this driver doc. Refer to http://www.open-fcoe.org/ for FCoE project
75 information and http://www.open-lldp.org/ or email list
76 e1000-eedc@lists.sourceforge.net for DCB information.
74 77
75 MAC and VLAN anti-spoofing feature 78 MAC and VLAN anti-spoofing feature
76 ---------------------------------- 79 ----------------------------------
diff --git a/Documentation/networking/ip-sysctl.txt b/Documentation/networking/ip-sysctl.txt
index ab42c95f9985..29a93518bf18 100644
--- a/Documentation/networking/ip-sysctl.txt
+++ b/Documentation/networking/ip-sysctl.txt
@@ -101,19 +101,17 @@ ipfrag_high_thresh - INTEGER
101 Maximum memory used to reassemble IP fragments. When 101 Maximum memory used to reassemble IP fragments. When
102 ipfrag_high_thresh bytes of memory is allocated for this purpose, 102 ipfrag_high_thresh bytes of memory is allocated for this purpose,
103 the fragment handler will toss packets until ipfrag_low_thresh 103 the fragment handler will toss packets until ipfrag_low_thresh
104 is reached. 104 is reached. This also serves as a maximum limit to namespaces
105 different from the initial one.
105 106
106ipfrag_low_thresh - INTEGER 107ipfrag_low_thresh - INTEGER
107 See ipfrag_high_thresh 108 Maximum memory used to reassemble IP fragments before the kernel
109 begins to remove incomplete fragment queues to free up resources.
110 The kernel still accepts new fragments for defragmentation.
108 111
109ipfrag_time - INTEGER 112ipfrag_time - INTEGER
110 Time in seconds to keep an IP fragment in memory. 113 Time in seconds to keep an IP fragment in memory.
111 114
112ipfrag_secret_interval - INTEGER
113 Regeneration interval (in seconds) of the hash secret (or lifetime
114 for the hash secret) for IP fragments.
115 Default: 600
116
117ipfrag_max_dist - INTEGER 115ipfrag_max_dist - INTEGER
118 ipfrag_max_dist is a non-negative integer value which defines the 116 ipfrag_max_dist is a non-negative integer value which defines the
119 maximum "disorder" which is allowed among fragments which share a 117 maximum "disorder" which is allowed among fragments which share a
@@ -1132,6 +1130,15 @@ flowlabel_consistency - BOOLEAN
1132 FALSE: disabled 1130 FALSE: disabled
1133 Default: TRUE 1131 Default: TRUE
1134 1132
1133auto_flowlabels - BOOLEAN
1134 Automatically generate flow labels based based on a flow hash
1135 of the packet. This allows intermediate devices, such as routers,
1136 to idenfify packet flows for mechanisms like Equal Cost Multipath
1137 Routing (see RFC 6438).
1138 TRUE: enabled
1139 FALSE: disabled
1140 Default: false
1141
1135anycast_src_echo_reply - BOOLEAN 1142anycast_src_echo_reply - BOOLEAN
1136 Controls the use of anycast addresses as source addresses for ICMPv6 1143 Controls the use of anycast addresses as source addresses for ICMPv6
1137 echo reply 1144 echo reply
@@ -1153,11 +1160,6 @@ ip6frag_low_thresh - INTEGER
1153ip6frag_time - INTEGER 1160ip6frag_time - INTEGER
1154 Time in seconds to keep an IPv6 fragment in memory. 1161 Time in seconds to keep an IPv6 fragment in memory.
1155 1162
1156ip6frag_secret_interval - INTEGER
1157 Regeneration interval (in seconds) of the hash secret (or lifetime
1158 for the hash secret) for IPv6 fragments.
1159 Default: 600
1160
1161conf/default/*: 1163conf/default/*:
1162 Change the interface-specific default settings. 1164 Change the interface-specific default settings.
1163 1165
@@ -1210,6 +1212,18 @@ accept_ra_defrtr - BOOLEAN
1210 Functional default: enabled if accept_ra is enabled. 1212 Functional default: enabled if accept_ra is enabled.
1211 disabled if accept_ra is disabled. 1213 disabled if accept_ra is disabled.
1212 1214
1215accept_ra_from_local - BOOLEAN
1216 Accept RA with source-address that is found on local machine
1217 if the RA is otherwise proper and able to be accepted.
1218 Default is to NOT accept these as it may be an un-intended
1219 network loop.
1220
1221 Functional default:
1222 enabled if accept_ra_from_local is enabled
1223 on a specific interface.
1224 disabled if accept_ra_from_local is disabled
1225 on a specific interface.
1226
1213accept_ra_pinfo - BOOLEAN 1227accept_ra_pinfo - BOOLEAN
1214 Learn Prefix Information in Router Advertisement. 1228 Learn Prefix Information in Router Advertisement.
1215 1229
diff --git a/Documentation/networking/packet_mmap.txt b/Documentation/networking/packet_mmap.txt
index 38112d512f47..a6d7cb91069e 100644
--- a/Documentation/networking/packet_mmap.txt
+++ b/Documentation/networking/packet_mmap.txt
@@ -1008,14 +1008,9 @@ hardware timestamps to be used. Note: you may need to enable the generation
1008of hardware timestamps with SIOCSHWTSTAMP (see related information from 1008of hardware timestamps with SIOCSHWTSTAMP (see related information from
1009Documentation/networking/timestamping.txt). 1009Documentation/networking/timestamping.txt).
1010 1010
1011PACKET_TIMESTAMP accepts the same integer bit field as 1011PACKET_TIMESTAMP accepts the same integer bit field as SO_TIMESTAMPING:
1012SO_TIMESTAMPING. However, only the SOF_TIMESTAMPING_SYS_HARDWARE 1012
1013and SOF_TIMESTAMPING_RAW_HARDWARE values are recognized by 1013 int req = SOF_TIMESTAMPING_RAW_HARDWARE;
1014PACKET_TIMESTAMP. SOF_TIMESTAMPING_SYS_HARDWARE takes precedence over
1015SOF_TIMESTAMPING_RAW_HARDWARE if both bits are set.
1016
1017 int req = 0;
1018 req |= SOF_TIMESTAMPING_SYS_HARDWARE;
1019 setsockopt(fd, SOL_PACKET, PACKET_TIMESTAMP, (void *) &req, sizeof(req)) 1014 setsockopt(fd, SOL_PACKET, PACKET_TIMESTAMP, (void *) &req, sizeof(req))
1020 1015
1021For the mmap(2)ed ring buffers, such timestamps are stored in the 1016For the mmap(2)ed ring buffers, such timestamps are stored in the
@@ -1023,14 +1018,13 @@ tpacket{,2,3}_hdr structure's tp_sec and tp_{n,u}sec members. To determine
1023what kind of timestamp has been reported, the tp_status field is binary |'ed 1018what kind of timestamp has been reported, the tp_status field is binary |'ed
1024with the following possible bits ... 1019with the following possible bits ...
1025 1020
1026 TP_STATUS_TS_SYS_HARDWARE
1027 TP_STATUS_TS_RAW_HARDWARE 1021 TP_STATUS_TS_RAW_HARDWARE
1028 TP_STATUS_TS_SOFTWARE 1022 TP_STATUS_TS_SOFTWARE
1029 1023
1030... that are equivalent to its SOF_TIMESTAMPING_* counterparts. For the 1024... that are equivalent to its SOF_TIMESTAMPING_* counterparts. For the
1031RX_RING, if none of those 3 are set (i.e. PACKET_TIMESTAMP is not set), 1025RX_RING, if neither is set (i.e. PACKET_TIMESTAMP is not set), then a
1032then this means that a software fallback was invoked *within* PF_PACKET's 1026software fallback was invoked *within* PF_PACKET's processing code (less
1033processing code (less precise). 1027precise).
1034 1028
1035Getting timestamps for the TX_RING works as follows: i) fill the ring frames, 1029Getting timestamps for the TX_RING works as follows: i) fill the ring frames,
1036ii) call sendto() e.g. in blocking mode, iii) wait for status of relevant 1030ii) call sendto() e.g. in blocking mode, iii) wait for status of relevant
diff --git a/Documentation/networking/phy.txt b/Documentation/networking/phy.txt
index 3544c98401fd..e839e7efc835 100644
--- a/Documentation/networking/phy.txt
+++ b/Documentation/networking/phy.txt
@@ -272,6 +272,8 @@ Writing a PHY driver
272 txtsamp: Requests a transmit timestamp at the PHY level for a 'skb' 272 txtsamp: Requests a transmit timestamp at the PHY level for a 'skb'
273 set_wol: Enable Wake-on-LAN at the PHY level 273 set_wol: Enable Wake-on-LAN at the PHY level
274 get_wol: Get the Wake-on-LAN status at the PHY level 274 get_wol: Get the Wake-on-LAN status at the PHY level
275 read_mmd_indirect: Read PHY MMD indirect register
276 write_mmd_indirect: Write PHY MMD indirect register
275 277
276 Of these, only config_aneg and read_status are required to be 278 Of these, only config_aneg and read_status are required to be
277 assigned by the driver code. The rest are optional. Also, it is 279 assigned by the driver code. The rest are optional. Also, it is
@@ -284,7 +286,21 @@ Writing a PHY driver
284 286
285 Feel free to look at the Marvell, Cicada, and Davicom drivers in 287 Feel free to look at the Marvell, Cicada, and Davicom drivers in
286 drivers/net/phy/ for examples (the lxt and qsemi drivers have 288 drivers/net/phy/ for examples (the lxt and qsemi drivers have
287 not been tested as of this writing) 289 not been tested as of this writing).
290
291 The PHY's MMD register accesses are handled by the PAL framework
292 by default, but can be overridden by a specific PHY driver if
293 required. This could be the case if a PHY was released for
294 manufacturing before the MMD PHY register definitions were
295 standardized by the IEEE. Most modern PHYs will be able to use
296 the generic PAL framework for accessing the PHY's MMD registers.
297 An example of such usage is for Energy Efficient Ethernet support,
298 implemented in the PAL. This support uses the PAL to access MMD
299 registers for EEE query and configuration if the PHY supports
300 the IEEE standard access mechanisms, or can use the PHY's specific
301 access interfaces if overridden by the specific PHY driver. See
302 the Micrel driver in drivers/net/phy/ for an example of how this
303 can be implemented.
288 304
289Board Fixups 305Board Fixups
290 306
diff --git a/Documentation/networking/pktgen.txt b/Documentation/networking/pktgen.txt
index 0e30c7845b2b..0dffc6e37902 100644
--- a/Documentation/networking/pktgen.txt
+++ b/Documentation/networking/pktgen.txt
@@ -24,6 +24,34 @@ For monitoring and control pktgen creates:
24 /proc/net/pktgen/ethX 24 /proc/net/pktgen/ethX
25 25
26 26
27Tuning NIC for max performance
28==============================
29
30The default NIC setting are (likely) not tuned for pktgen's artificial
31overload type of benchmarking, as this could hurt the normal use-case.
32
33Specifically increasing the TX ring buffer in the NIC:
34 # ethtool -G ethX tx 1024
35
36A larger TX ring can improve pktgen's performance, while it can hurt
37in the general case, 1) because the TX ring buffer might get larger
38than the CPUs L1/L2 cache, 2) because it allow more queueing in the
39NIC HW layer (which is bad for bufferbloat).
40
41One should be careful to conclude, that packets/descriptors in the HW
42TX ring cause delay. Drivers usually delay cleaning up the
43ring-buffers (for various performance reasons), thus packets stalling
44the TX ring, might just be waiting for cleanup.
45
46This cleanup issues is specifically the case, for the driver ixgbe
47(Intel 82599 chip). This driver (ixgbe) combine TX+RX ring cleanups,
48and the cleanup interval is affected by the ethtool --coalesce setting
49of parameter "rx-usecs".
50
51For ixgbe use e.g "30" resulting in approx 33K interrupts/sec (1/30*10^6):
52 # ethtool -C ethX rx-usecs 30
53
54
27Viewing threads 55Viewing threads
28=============== 56===============
29/proc/net/pktgen/kpktgend_0 57/proc/net/pktgen/kpktgend_0
diff --git a/Documentation/networking/timestamping.txt b/Documentation/networking/timestamping.txt
index bc3554124903..897f942b976b 100644
--- a/Documentation/networking/timestamping.txt
+++ b/Documentation/networking/timestamping.txt
@@ -40,7 +40,7 @@ the set bits correspond to data that is available, then the control
40message will not be generated: 40message will not be generated:
41 41
42SOF_TIMESTAMPING_SOFTWARE: report systime if available 42SOF_TIMESTAMPING_SOFTWARE: report systime if available
43SOF_TIMESTAMPING_SYS_HARDWARE: report hwtimetrans if available 43SOF_TIMESTAMPING_SYS_HARDWARE: report hwtimetrans if available (deprecated)
44SOF_TIMESTAMPING_RAW_HARDWARE: report hwtimeraw if available 44SOF_TIMESTAMPING_RAW_HARDWARE: report hwtimeraw if available
45 45
46It is worth noting that timestamps may be collected for reasons other 46It is worth noting that timestamps may be collected for reasons other
@@ -88,13 +88,12 @@ hwtimeraw is the original hardware time stamp. Filled in if
88SOF_TIMESTAMPING_RAW_HARDWARE is set. No assumptions about its 88SOF_TIMESTAMPING_RAW_HARDWARE is set. No assumptions about its
89relation to system time should be made. 89relation to system time should be made.
90 90
91hwtimetrans is the hardware time stamp transformed so that it 91hwtimetrans is always zero. This field is deprecated. It used to hold
92corresponds as good as possible to system time. This correlation is 92hw timestamps converted to system time. Instead, expose the hardware
93not perfect; as a consequence, sorting packets received via different 93clock device on the NIC directly as a HW PTP clock source, to allow
94NICs by their hwtimetrans may differ from the order in which they were 94time conversion in userspace and optionally synchronize system time
95received. hwtimetrans may be non-monotonic even for the same NIC. 95with a userspace PTP stack such as linuxptp. For the PTP clock API,
96Filled in if SOF_TIMESTAMPING_SYS_HARDWARE is set. Requires support 96see Documentation/ptp/ptp.txt.
97by the network device and will be empty without that support.
98 97
99 98
100SIOCSHWTSTAMP, SIOCGHWTSTAMP: 99SIOCSHWTSTAMP, SIOCGHWTSTAMP:
@@ -185,7 +184,6 @@ struct skb_shared_hwtstamps {
185 * since arbitrary point in time 184 * since arbitrary point in time
186 */ 185 */
187 ktime_t hwtstamp; 186 ktime_t hwtstamp;
188 ktime_t syststamp; /* hwtstamp transformed to system time base */
189}; 187};
190 188
191Time stamps for outgoing packets are to be generated as follows: 189Time stamps for outgoing packets are to be generated as follows:
diff --git a/Documentation/networking/timestamping/timestamping.c b/Documentation/networking/timestamping/timestamping.c
index 8ba82bfe6a33..5cdfd743447b 100644
--- a/Documentation/networking/timestamping/timestamping.c
+++ b/Documentation/networking/timestamping/timestamping.c
@@ -76,7 +76,6 @@ static void usage(const char *error)
76 " SOF_TIMESTAMPING_RX_HARDWARE - hardware time stamping of incoming packets\n" 76 " SOF_TIMESTAMPING_RX_HARDWARE - hardware time stamping of incoming packets\n"
77 " SOF_TIMESTAMPING_RX_SOFTWARE - software fallback for incoming packets\n" 77 " SOF_TIMESTAMPING_RX_SOFTWARE - software fallback for incoming packets\n"
78 " SOF_TIMESTAMPING_SOFTWARE - request reporting of software time stamps\n" 78 " SOF_TIMESTAMPING_SOFTWARE - request reporting of software time stamps\n"
79 " SOF_TIMESTAMPING_SYS_HARDWARE - request reporting of transformed HW time stamps\n"
80 " SOF_TIMESTAMPING_RAW_HARDWARE - request reporting of raw HW time stamps\n" 79 " SOF_TIMESTAMPING_RAW_HARDWARE - request reporting of raw HW time stamps\n"
81 " SIOCGSTAMP - check last socket time stamp\n" 80 " SIOCGSTAMP - check last socket time stamp\n"
82 " SIOCGSTAMPNS - more accurate socket time stamp\n"); 81 " SIOCGSTAMPNS - more accurate socket time stamp\n");
@@ -202,9 +201,7 @@ static void printpacket(struct msghdr *msg, int res,
202 (long)stamp->tv_sec, 201 (long)stamp->tv_sec,
203 (long)stamp->tv_nsec); 202 (long)stamp->tv_nsec);
204 stamp++; 203 stamp++;
205 printf("HW transformed %ld.%09ld ", 204 /* skip deprecated HW transformed */
206 (long)stamp->tv_sec,
207 (long)stamp->tv_nsec);
208 stamp++; 205 stamp++;
209 printf("HW raw %ld.%09ld", 206 printf("HW raw %ld.%09ld",
210 (long)stamp->tv_sec, 207 (long)stamp->tv_sec,
@@ -361,8 +358,6 @@ int main(int argc, char **argv)
361 so_timestamping_flags |= SOF_TIMESTAMPING_RX_SOFTWARE; 358 so_timestamping_flags |= SOF_TIMESTAMPING_RX_SOFTWARE;
362 else if (!strcasecmp(argv[i], "SOF_TIMESTAMPING_SOFTWARE")) 359 else if (!strcasecmp(argv[i], "SOF_TIMESTAMPING_SOFTWARE"))
363 so_timestamping_flags |= SOF_TIMESTAMPING_SOFTWARE; 360 so_timestamping_flags |= SOF_TIMESTAMPING_SOFTWARE;
364 else if (!strcasecmp(argv[i], "SOF_TIMESTAMPING_SYS_HARDWARE"))
365 so_timestamping_flags |= SOF_TIMESTAMPING_SYS_HARDWARE;
366 else if (!strcasecmp(argv[i], "SOF_TIMESTAMPING_RAW_HARDWARE")) 361 else if (!strcasecmp(argv[i], "SOF_TIMESTAMPING_RAW_HARDWARE"))
367 so_timestamping_flags |= SOF_TIMESTAMPING_RAW_HARDWARE; 362 so_timestamping_flags |= SOF_TIMESTAMPING_RAW_HARDWARE;
368 else 363 else