8322 nl: misleading-indentation
[unleashed/tickless.git] / usr / src / man / man7p / dlpi.7p
blobc2ffdc6889190686cb7970859f26ef9d90bbe6f2
1 '\" te
2 .\" Copyright (c) 2009, Sun Microsystems, Inc.
3 .\" The contents of this file are subject to the terms of the Common Development and Distribution License (the "License"). You may not use this file except in compliance with the License. You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE or http://www.opensolaris.org/os/licensing.
4 .\"  See the License for the specific language governing permissions and limitations under the License. When distributing Covered Code, include this CDDL HEADER in each file and include the License file at usr/src/OPENSOLARIS.LICENSE. If applicable, add the following below this CDDL HEADER, with the
5 .\" fields enclosed by brackets "[]" replaced with your own identifying information: Portions Copyright [yyyy] [name of copyright owner]
6 .TH DLPI 7P "April 9, 2016"
7 .SH NAME
8 dlpi \- Data Link Provider Interface
9 .SH SYNOPSIS
10 .LP
11 .nf
12 \fB#include <sys/dlpi.h>\fR
13 .fi
15 .SH DESCRIPTION
16 .LP
17 SunOS STREAMS-based device drivers wishing to support the STREAMS \fB TCP/IP\fR
18 and other STREAMS-based networking protocol suite implementations support
19 Version 2 of the Data Link Provider Interface (\fBDLPI\fR). \fBDLPI V2\fR
20 enables a data link service user to access and use any of a variety of
21 conforming data link service providers without special knowledge of the
22 provider's protocol. Specifically, the interface is intended to support
23 Ethernet, \fBX.25 LAPB,\fR \fBSDLC,\fR \fBISDN LAPD,\fR \fBCSMA/CD,\fR
24 \fBFDDI,\fR token ring, token bus, Bisync, and other datalink-level protocols.
25 .sp
26 .LP
27 The interface specifies access to the data link service provider in the form of
28 \fBM_PROTO\fR and \fBM_PCPROTO\fR type STREAMS messages and does not define a
29 specific protocol implementation. The interface defines the syntax and
30 semantics of primitives exchanged between the data link user and the data link
31 provider to attach a physical device with physical-level address to a stream,
32 bind a datalink-level address to the stream, get implementation-specific
33 information from the data link provider, exchange data with a peer data link
34 user in one of three communication modes (connection, connectionless,
35 acknowledged connectionless), enable/disable multicast group and promiscuous
36 mode reception of datalink frames, get and set the physical address associated
37 with a stream, and several other operations.
38 .sp
39 .LP
40 Solaris conforms to The Open Group Technical Standard for \fIDLPI, Version
41 2\fR. For free access to this specification, point your browser to
42 \fIwww.opengroup.org/pubs/catalog/c811.htm\fR. Solaris also provides extensions
43 to the DLPI standard, as detailed in this man page.
44 .SH SOLARIS-SPECIFIC DLPI EXTENSIONS
45 .ne 2
46 .na
47 \fBNotification Support\fR
48 .ad
49 .sp .6
50 .RS 4n
51 Enables \fBDLPI\fR consumers to register for notification when events of
52 interest occur at the \fBDLPI\fR provider. The negotiation can be performed on
53 any attached DLPI stream, and begins with the \fBDLPI\fR consumer, sending a
54 DL_NOTIFY_REQ to the provider, which is an M_PROTO message with the following
55 payload:
56 .sp
57 .in +2
58 .nf
59       typedef struct {
60               t_uscalar_t     dl_primitive;
61               uint32_t        dl_notifications;
62               uint32_t        dl_timelimit;
63       } dl_notify_req_t;
64 .fi
65 .in -2
67 The dl_primitive field must be set to DL_NOTIFY_REQ; the dl_timelimit field is
68 reserved for future use and must be set to zero. The dl_notifications field is
69 a bitmask containing the event types the consumer is interested in receiving,
70 and must be zero or more of:
71 .sp
72 .in +2
73 .nf
74 DL_NOTE_LINK_DOWN         Notify when link has gone down
75 DL_NOTE_LINK_UP           Notify when link has come up
76 DL_NOTE_PHYS_ADDR         Notify when address changes
77 DL_NOTE_SDU_SIZE          Notify when MTU changes
78 DL_NOTE_SPEED             Notify when speed changes
79 DL_NOTE_PROMISC_ON_PHYS   Notify when DL_PROMISC_PHYS is set
80 DL_NOTE_PROMISC_OFF_PHYS  Notify when DL_PROMISC_PHYS is cleared
81 .fi
82 .in -2
84 Consumers might find it useful to send a DL_NOTIFY_REQ message with no
85 requested types to check if the \fBDLPI\fR provider supports the extension.
86 .sp
87 Upon receiving the DL_NOTIFY_REQ, the \fBDLPI\fR provider must generate a
88 DL_NOTIFY_ACK, which is an M_PROTO message with the following payload:
89 .sp
90 .in +2
91 .nf
92       typedef struct {
93               t_uscalar_t     dl_primitive;
94               uint32_t        dl_notifications;
95       } dl_notify_ack_t;
96 .fi
97 .in -2
99 The \fBdl_primitive\fR field must be set to DL_NOTIFY_ACK. The
100 \fBdl_notifications\fR field must include any notifications that the provider
101 supports, along with any other unrequested notifications that the provider
102 supports. However, regardless of the notifications the provider supports, it is
103 restricted to sending only DL_NOTIFY_IND messages  (see below) that were
104 requested in the DL_NOTIFY_REQ.
106 Since there are additional notification types which are not yet available for
107 public use, \fBDLPI\fR consumers and providers must take care when inspecting
108 and setting the \fBdl_notifications\fR field. Specifically, consumers must be
109 careful to only request the above notification types, and providers must be
110 careful to not include any unrecognized notification types in the
111 \fBdl_notifications\fR field when constructing the DL_NOTIFY_ACK. In addition,
112 DL_NOTIFY_IND's that are received with undocumented dl_notification or dl_data
113 values must be ignored.
115 DLPI consumers might receive a DL_ERROR_ACK message (with dl_error_primitive
116 set to DL_NOTIFY_REQ) in response to the initial DL_NOTIFY_REQ message. This
117 message indicates that the DLPI provider does not support the DLPI notification
118 extension. Otherwise, the DLPI consumer receives a DL_NOTIFY_ACK and should
119 expect to receive DL_NOTIFY_IND messages for any types that it requested that
120 were still set in it. The DL_NOTIFY_IND is an M_PROTO message with the
121 following payload:
123 .in +2
125      typedef struct {
126              t_uscalar_t     dl_primitive;
127              uint32_t        dl_notification;
128              uint32_t        dl_data;
129              t_uscalar_t     dl_addr_length;
130              t_uscalar_t     dl_addr_offset;
131      } dl_notify_ind_t;
133 .in -2
135 The \fBdl_primitive\fR field must be set to DL_NOTIFY_IND, and the
136 \fBdl_notification\fR field must be set to the event type that has occurred
137 (for example, DL_NOTE_LINK_DOWN). Only a single event type can be set in each
138 DL_NOTIFY_IND.
140 For the DL_NOTE_SPEED event type, \fBdl_data\fR must be set to the current
141 interface speed in kilobits per second. For the DL_NOTE_PHYS_ADDR event type,
142 dl_data must be set to DL_CURR_PHYS_ADDR. For the DL_NOTE_SDU_SIZE event type,
143 \fBdl_data\fR must be set to the current MTU in bytes. Otherwise, \fBdl_data\fR
144 must be set to zero.
146 For the DL_NOTE_PHYS_ADDR event type, the \fBdl_addr_length\fR field must be
147 set to the length of the address, and the \fBdl_addr_offset\fR field must be
148 set to offset of the first byte of the address, relative to b_rptr (for
149 example, if the address immediately follows the \fBdl_notify_ind\fR structure,
150 \fBdl_addr_offset\fR is set to 'sizeof (\fBdl_notify_ind\fR)'). For all other
151 event types, the \fBdl_addr_length\fR and \fBdl_addr_offset\fR fields must be
152 set to zero by DLPI providers and ignored by DLPI consumers.
154 In addition to generating DL_NOTIFY_IND messages when a requested event has
155 occurred, the \fBDLPI\fR provider must initially generate one or more
156 DL_NOTIFY_IND messages to notify the \fBDLPI\fR consumer of the current
157 state of the interface. For instance, if the consumer has requested
158 DL_NOTE_LINK_UP | DL_NOTE_LINK_DOWN, the provider must send a DL_NOTIFY_IND
159 containing the current state of the link (either DL_NOTE_LINK_UP or
160 DL_NOTE_LINK_DOWN) after sending the DL_NOTIFY_ACK.
162 For the initial DL_NOTIFY_IND message, the DLPI provider is strongly
163 recommended against sending DL_NOTE_LINK_DOWN, even if the interface is still
164 initializing and is not yet ready to send or receive packets. Instead, either
165 delaying the DL_NOTIFY_IND message until the interface is ready or
166 optimistically reporting DL_NOTIFY_LINK_UP and subsequently   reporting
167 DL_NOTE_LINK_DOWN if the negotiation fails is strongly   preferred. This
168 prevents DL_NOTIFY_IND consumers from needlessly triggering network failover
169 operations and logging error messages during network interface initialization.
171 The DLPI provider must continue to generate DL_NOTIFY_IND messages until it
172 receives a new DL_NOTIFY_REQ message or the \fBDLPI\fR stream is detached (or
173 closed). Further, a DLPI style  2 provider must keep track of the requested
174 events after a DL_DETACH_REQ operation, and if a subsequent DL_ATTACH_REQ is
175 received, it must send gratuitous DL_NOTIFY_IND  messages to notify the
176 consumer of the  current state of  the device, since the state might have
177 changed while  detached (or the consumer might have simply discarded its
178 previous state).
182 .ne 2
184 \fBPassive Consumers of Aggregated Links\fR
186 .sp .6
187 .RS 4n
188 Solaris link aggregations as configured by \fBdladm\fR(1M) export DLPI nodes
189 for both the link aggregation, and individual links that comprises the
190 aggregation, to allow observability of the aggregated links. To allow
191 applications such as  \fBsnoop\fR(1M) to open those individual aggregated links
192 while disallowing other consumers such as \fBip\fR(7P), DL_PASSIVE_REQ (a DLPI
193 primitive), must be issued by \fBsnoop\fR(1M) and similar applications.
195 The DL_PASSIVE_REQ primitive is an M_PROTO message containing the following
196 payload:
198 .in +2
200 typedef struct {
201         t_uscalar_t     dl_primitive;
202 } dl_passive_req_t;
204 .in -2
206 Issuing this primitive allows the consumer of a DLPI link to coexist with a
207 link aggregation that also uses the link.  Such a consumer is considered
208 \fBpassive\fR.
210 Consumers that don't use this primitive while an aggregation is using the link
211 receive DL_SYSERR/EBUSY when issuing the following DLPI primitives:
213 .in +2
215 DL_BIND_REQ
216 DL_ENABMULTI_REQ
217 DL_PROMISCON_REQ
218 DL_AGGR_REQ
219 DL_UNAGGR_REQ
220 DL_CONTROL_REQ
221 DL_SET_PHYS_ADDR_REQ
223 .in -2
225 A consumer that has not issued a DL_PASSIVE_REQ and has successfully issued one
226 of the above primitives is considered \fBactive\fR.
228 The creation of a link aggregation using \fBdladm\fR(1M) fails if one of the
229 links included in the aggregation has an \fBactive\fR consumer, but succeeds if
230 the links do not have any DLPI consumers or only \fBpassive\fR consumers.
234 .ne 2
236 \fBRaw Mode\fR
238 .sp .6
239 .RS 4n
240 The \fBDLIOCRAW\fR ioctl function is used by some DLPI applications, most
241 notably the \fBsnoop\fR(1M) command. The \fBDLIOCRAW\fR command puts the stream
242 into a raw mode, which, upon receive, causes the full MAC-level packet to
243 be sent upstream in an \fBM_DATA\fR message instead of it being transformed
244 into the \fBDL_UNITDATA_IND\fR form normally used for reporting incoming
245 packets. Packet \fBSAP\fR filtering is still performed on streams that are in
246 raw mode. If a stream user wants to receive all incoming packets it must also
247 select the appropriate promiscuous modes. After successfully selecting raw
248 mode, the application is also allowed to send fully formatted packets to the
249 provider as \fBM_DATA\fR messages for transmission. \fBDLIOCRAW\fR takes no
250 arguments. Once enabled, the stream remains in this mode until closed.
254 .ne 2
256 \fBNative Mode\fR
258 .sp .6
259 .RS 4n
260 Some DLPI providers are able to represent their link layer using more than one
261 link-layer  format. In this case, the  default link-layer format can minimize
262 impact to applications, but might not allow truly \fBnative\fR link-layer
263 headers to be sent or received. DLPI consumers who wish to use the native
264 link-layer format can use DLIOCNATIVE to transition the stream. DLIOCNATIVE
265 takes no arguments and returns the DLPI mac type associated with the  new
266 link-layer format  upon        success. Once enabled, the  stream remains in
267 this mode until closed. Note that  DLIOCNATIVE does not enable transition
268 between dissimilar DLPI mac types and (aside from the link-layer format), the
269 new DLPI  mac  type is guaranteed to be semantically identical. In particular,
270 the SAP space and addressing format are not affected and the effect of
271 DLIOCNATIVE is only visible when in raw mode, though any subsequent DL_INFO_REQ
272 requests generate responses with dl_mac_type set to the native DLPI type.
276 .ne 2
278 \fBMargin\fR
280 .sp .6
281 .RS 4n
282 While a DLPI provider provides its maximum SDU via dl_max_sdu in DL_INFO_ACK
283 messages, this value typically represents a standard maximum SDU for the
284 provider's media (1500 for Ethernet for example), and not necessarily the
285 absolute maximum amount of data that the provider is able to transmit in a
286 given data unit.  The \fBmargin\fR "is the extra amount of data in bytes that
287 the provider can transmit beyond its advertised maximum SDU. For example, if a
288 DL_ETHER provider can handle packets whose payload section is no greater than
289 1522 bytes and its dl_max_sdu is set to 1500 (as is typical for Ethernet), then
290 the margin would be 22. If a provider supports a non-zero margin, it implements
291 the DLIOCMARGININFO ioctl, whose data is a t_uscalar_t representing the margin
292 size.
295 .SH DL_ETHER-SPECIFIC DLPI SEMANTICS
296 .SS "VLAN Support"
297 .SS "Traditional VLAN Access"
299 Some \fBDL_ETHER DLPI\fR providers support \fIIEEE 802.1Q\fR Virtual LANs
300 (VLAN). For these providers, traffic for a particular VLAN can be accessed by
301 opening a VLAN data-link.
304 Unless raw mode is enabled, a DLPI stream bound to a VLAN data-link  behaves
305 no differently than a traditional DLPI stream. As with non-VLAN data-link
306 access, data must be sent to a DLPI  provider without link-layer headers (which
307 are added by the provider) and received data is passed to interested DLPI
308 consumers without link-layer headers.  As a result,  DLPI consumers not require
309 special-case logic to implement VLAN access.
310 .SS "SAP-Based VLAN Access"
312 As per \fIIEEE 802.1Q\fR, all VLAN traffic is sent using Ether- Type  0x8100,
313 meaning  that in addition to directly opening a VLAN data-link, all VLAN
314 traffic for a given underline data-link can also be accessed by opening the
315 underlying data-link and binding to SAP 0x8100. Accordingly, all VLAN traffic
316 (regardless of VLAN ID) can be sent and received by the DLPI consumer.
317 However,  even when raw mode is disabled, packets are received starting with
318 their VLAN headers and must be sent to the DLPI provider with their  VLAN
319 headers already pre-pended (but without Ethernet headers).  Because adhering to
320 these semantics requires each DLPI consumer to have specialized knowledge of
321 VLANs, VLANs should only be accessed in this way when the traditional VLAN
322 access  method is insufficient (for example, because access to all VLAN
323 traffic, regardless of  VLAN ID, is needed).
326 Because all VLAN traffic is sent with SAP 0x8100, VLAN traffic not filtered at
327 the physical (\fBDL_PROMISC_PHYS\fR) level is also visible if a DLPI consumer
328 enables promiscuous mode of a stream at the \fBDL_PROMISC_SAP\fR level. As
329 mentioned earlier, these packets are received starting with their VLAN headers
330 if raw mode is not enabled.
331 .SS "QoS Support"
333 The \fIIEEE 802.1Q\fR standard defines eight classes of priority values used by
334 QoS traffic control of Ethernet packets. Although the priority values are
335 encoded in the\fI 802.1Q\fR tags, they can be used independently from VLANs.
336 In particular, a  special priority tagged packet (with VLAN ID zero but
337 priority bits non-zero) does not belong to any VLAN.
340 The priority value can be set on either a per-stream or per-packet basis. DLPI
341 consumers can specify the  per-stream priority using the \fBDL_UDQOS_REQ\fR
342 request (the priority value remains unchanged until the next DL_UDQOS_REQ) and
343 also specify the per-packet priority value using the b_band field of a M_DATA
344 message or the \fBdl_priority\fR field of a \fBDL_UNITDATA_REQ\fR.
345 .SS "Raw Mode"
346 .SS "SAP-Based VLAN Access"
348 When raw mode is enabled, the complete, unmodified MAC- level packet (including
349 Ethernet  and  VLAN headers) is passed to interested DLPI consumers. Similarly,
350 the entire MAC-level packet (including Ethernet and VLAN headers) must be sent
351 to the DLPI provider for transmission.  Note that the priority value specified
352 in the b_band field can be overridden by encoding the priority value (if any)
353 into the VLAN header.
354 .SS "Traditional VLAN Access"
356 When raw mode is enabled, only packets with the correct VLAN ID are passed up
357 to interested DLPI consumers. With the exception of priority-tagged packets,
358 DLPI providers must strip off the VLAN headers (while retaining the preceding
359 Ethernet headers) before sending up the packets.  For priority-tagged packets,
360 DLPI providers must use the reserved tag 0 to encode the VLAN TCI and send up
361 the packets.
364 On the transmit-side, DLPI consumers must send the packets down to the DLPI
365 providers without the VLAN headers (but with the  Ethernet headers)  unless
366 certain QoS support is required. If QoS support is needed, the packet can have
367 the VLAN header to  indicate the priority value, however its VLAN ID must be
368 zero. The DLPI providers then insert the VLAN tags or encode the VLAN tags
369 using the priority value specified in the VLAN headers and send the packets.
370 .SH FILES
372 Files in or under \fB/dev\fR.
373 .SH ATTRIBUTES
375 See \fBattributes\fR(5) for descriptions of the following attributes:
380 box;
381 c | c
382 l | l .
383 ATTRIBUTE TYPE  ATTRIBUTE VALUE
386 Interface Stability (Notification support/Passive mode behavior)
387 T}      Committed
390 .SH SEE ALSO
392 \fBdladm\fR(1M), \fBsnoop\fR(1M), \fBlibdlpi\fR(3LIB), \fBgld\fR(7D),
393 \fBip\fR(7P)
394 .SH NOTES
396 A Solaris DLPI link name consists of a \fBDLPI provider name\fR followed by a
397 numeric \fBPPA\fR (physical point of attachment).
400 The DLPI provider name must be between 1 and 16 characters in length, though
401 names between 3 and 8 characters are preferred. The DLPI provider name can
402 consist of any alphanumeric character (a-z, A-Z, 0-9), and the underscore (_).
403 The first and last character of the DLPI provider name cannot be a digit.
406 The PPA must be a number between \fB0\fR and \fB4294967294\fR inclusive.
407 Leading zeroes are not permitted.