source: SVN/rincon/u-boot/cpu/ixp/npe/IxEthDBVlan.c @ 55

Last change on this file since 55 was 55, checked in by Tim Harvey, 22 months ago

rincon: added latest u-boot source

restored form server backup

Signed-off-by: Tim Harvey <tharvey@…>

File size: 34.8 KB
Line 
1/**
2 * @file IxEthDBVlan.c
3 *
4 * @brief Implementation of the VLAN API
5 *
6 * @par
7 * IXP400 SW Release version 2.0
8 *
9 * -- Copyright Notice --
10 *
11 * @par
12 * Copyright 2001-2005, Intel Corporation.
13 * All rights reserved.
14 *
15 * @par
16 * Redistribution and use in source and binary forms, with or without
17 * modification, are permitted provided that the following conditions
18 * are met:
19 * 1. Redistributions of source code must retain the above copyright
20 *    notice, this list of conditions and the following disclaimer.
21 * 2. Redistributions in binary form must reproduce the above copyright
22 *    notice, this list of conditions and the following disclaimer in the
23 *    documentation and/or other materials provided with the distribution.
24 * 3. Neither the name of the Intel Corporation nor the names of its contributors
25 *    may be used to endorse or promote products derived from this software
26 *    without specific prior written permission.
27 *
28 * @par
29 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
30 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
31 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
32 * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
33 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
34 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
35 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
37 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
38 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
39 * SUCH DAMAGE.
40 *
41 * @par
42 * -- End of Copyright Notice --
43 */
44
45#include "IxEthDB.h"
46#include "IxEthDB_p.h"
47
48/* forward prototypes */
49IX_ETH_DB_PUBLIC
50IxEthDBStatus ixEthDBUpdateTrafficClass(IxEthDBPortId portID, UINT32 classIndex);
51IX_ETH_DB_PUBLIC
52IxEthDBStatus ixEthDBVlanTableGet(IxEthDBPortId portID, IxEthDBVlanSet portVlanTable, IxEthDBVlanSet vlanSet);
53
54/* contants used by various functions as "action" parameter */
55#define ADD_VLAN    (0x1)
56#define REMOVE_VLAN (0x2)
57
58/**
59 * @brief adds or removes a VLAN from a VLAN set
60 *
61 * @param vlanID VLAN ID to add or remove
62 * @param table VLAN set to add into or remove from
63 * @param action ADD_VLAN or REMOVE_VLAN
64 *
65 * @internal
66 */
67IX_ETH_DB_PRIVATE
68void ixEthDBLocalVlanMembershipChange(UINT32 vlanID, IxEthDBVlanSet table, UINT32 action)
69{
70    UINT32 setOffset;
71   
72    /* add/remove VID to membership table */
73    setOffset = VLAN_SET_OFFSET(vlanID); /* we need 9 bits to index the 512 byte membership array */
74
75    if (action == ADD_VLAN)
76    {
77        table[setOffset] |= 1 << VLAN_SET_MASK(vlanID);
78    }
79    else if (action == REMOVE_VLAN)
80    {
81        table[setOffset] &= ~(1 << VLAN_SET_MASK(vlanID));
82    }
83}
84
85/**
86 * @brief updates a set of 8 VLANs in an NPE
87 *
88 * @param portID ID of the port
89 * @param setOffset offset of the 8 VLANs
90 *
91 * This function updates the VLAN membership table
92 * and Transmit Tagging Info table for 8 consecutive
93 * VLAN IDs indexed by setOffset.
94 *
95 * For example, a setOffset of 0 indexes VLAN IDs 0
96 * through 7, 1 indexes VLAN IDs 8 through 9 etc.
97 *
98 * @return IX_ETH_DB_SUCCESS if the operation completed
99 * successfully or an appropriate error message otherwise
100 *
101 * @internal
102 */
103IX_ETH_DB_PRIVATE
104IxEthDBStatus ixEthDBVlanTableEntryUpdate(IxEthDBPortId portID, UINT32 setOffset)
105{
106    PortInfo *portInfo = &ixEthDBPortInfo[portID];
107    IxNpeMhMessage message;
108    IX_STATUS result;
109       
110    FILL_SETPORTVLANTABLEENTRY_MSG(message, IX_ETH_DB_PORT_ID_TO_NPE_LOGICAL_ID(portID), 
111        2 * setOffset, 
112        portInfo->vlanMembership[setOffset], 
113        portInfo->transmitTaggingInfo[setOffset]);
114   
115    IX_ETHDB_SEND_NPE_MSG(IX_ETH_DB_PORT_ID_TO_NPE(portID), message, result);
116   
117    return result;
118}
119
120/**
121 * @brief updates a VLAN range in an NPE
122 *
123 * @param portID ID of the port
124 *
125 * This function is similar to @ref ixEthDBVlanTableEntryUpdate
126 * except that it can update more than one VLAN set (up to
127 * the entire VLAN membership and TTI tables if the offset is 0
128 * and length is sizeof (IxEthDBVlanSet) (512 bytes).
129 *
130 * Updating the NPE via this method is slower as it requires
131 * a memory copy from SDRAM, hence it is recommended that the
132 * ixEthDBVlanTableEntryUpdate function is used where possible.
133 *
134 * @return IX_ETH_DB_SUCCESS if the operation completed
135 * successfully or an appropriate error message otherwise
136 *
137 * @internal
138 */
139IX_ETH_DB_PRIVATE
140IxEthDBStatus ixEthDBVlanTableRangeUpdate(IxEthDBPortId portID)
141{
142    PortInfo *portInfo    = &ixEthDBPortInfo[portID];
143    UINT8 *vlanUpdateZone = (UINT8 *) portInfo->updateMethod.vlanUpdateZone;
144    IxNpeMhMessage message;
145    UINT32 setIndex;
146    IX_STATUS result;
147
148    /* copy membership info and transmit tagging into into exchange area */
149    for (setIndex = 0 ; setIndex < sizeof (portInfo->vlanMembership) ; setIndex++)
150    {
151        /* membership and TTI data are interleaved */
152        vlanUpdateZone[setIndex * 2]     = portInfo->vlanMembership[setIndex];
153        vlanUpdateZone[setIndex * 2 + 1] = portInfo->transmitTaggingInfo[setIndex];
154    }
155
156    IX_OSAL_CACHE_FLUSH(vlanUpdateZone, FULL_VLAN_BYTE_SIZE);
157   
158    /* build NPE message */
159    FILL_SETPORTVLANTABLERANGE_MSG(message, IX_ETH_DB_PORT_ID_TO_NPE_LOGICAL_ID(portID), 0, 0, 
160        IX_OSAL_MMU_VIRT_TO_PHYS(vlanUpdateZone));
161
162    /* send message */   
163    IX_ETHDB_SEND_NPE_MSG(IX_ETH_DB_PORT_ID_TO_NPE(portID), message, result);
164
165    return result;
166}
167
168/**
169 * @brief adds or removes a VLAN from a port's VLAN membership table
170 * or Transmit Tagging Information table
171 *
172 * @param portID ID of the port
173 * @param vlanID VLAN ID to add or remove
174 * @param table to add or remove from
175 * @param action ADD_VLAN or REMOVE_VLAN
176 *
177 * @return IX_ETH_DB_SUCCESS if the operation completed
178 * successfully or an appropriate error message otherwise
179 *
180 * @internal
181 */
182IX_ETH_DB_PRIVATE
183IxEthDBStatus ixEthDBPortVlanMembershipChange(IxEthDBPortId portID, IxEthDBVlanId vlanID, IxEthDBVlanSet table, UINT32 action)
184{
185    /* change VLAN in local membership table */
186    ixEthDBLocalVlanMembershipChange(vlanID, table, action);
187   
188    /* send updated entry to NPE */
189    return ixEthDBVlanTableEntryUpdate(portID, VLAN_SET_OFFSET(vlanID));
190}
191
192/**
193 * @brief sets the default port VLAN tag (the lower 3 bytes are the PVID)
194 *
195 * @param portID ID of the port
196 * @param vlanTag port VLAN tag (802.1Q tag)
197 *
198 * Note that this function is documented in the main component
199 * header file, IxEthDB.h.
200 *
201 * @return IX_ETH_DB_SUCCESS if the operation completed successfully
202 * or an appropriate error message otherwise
203 */
204IX_ETH_DB_PUBLIC
205IxEthDBStatus ixEthDBPortVlanTagSet(IxEthDBPortId portID, IxEthDBVlanTag vlanTag)
206{
207    IxNpeMhMessage message;
208    IX_STATUS result;
209   
210    IX_ETH_DB_CHECK_PORT(portID);
211   
212    IX_ETH_DB_CHECK_SINGLE_NPE(portID);
213 
214    IX_ETH_DB_CHECK_VLAN_TAG(vlanTag);
215   
216    IX_ETH_DB_CHECK_FEATURE(portID, IX_ETH_DB_VLAN_QOS);
217       
218    /* add VLAN ID to local membership table */
219    ixEthDBPortVlanMembershipChange(portID, 
220        vlanTag & IX_ETH_DB_802_1Q_VLAN_MASK, 
221        ixEthDBPortInfo[portID].vlanMembership, 
222        ADD_VLAN);
223       
224    /* set tag in portInfo */
225    ixEthDBPortInfo[portID].vlanTag = vlanTag;
226   
227    /* build VLAN_SetDefaultRxVID message */
228    FILL_SETDEFAULTRXVID_MSG(message, 
229        IX_ETH_DB_PORT_ID_TO_NPE_LOGICAL_ID(portID), 
230        IX_IEEE802_1Q_VLAN_TPID, 
231        vlanTag);
232   
233    IX_ETHDB_SEND_NPE_MSG(IX_ETH_DB_PORT_ID_TO_NPE(portID), message, result);
234   
235    return result;
236}
237
238/**
239 * @brief retrieves the default port VLAN tag (the lower 3 bytes are the PVID)
240 *
241 * @param portID ID of the port
242 * @param vlanTag address to write the port VLAN tag (802.1Q tag) into
243 *
244 * Note that this function is documented in the main component
245 * header file, IxEthDB.h.
246 *
247 * @return IX_ETH_DB_SUCCESS if the operation completed successfully
248 * or an appropriate error message otherwise
249 */
250IX_ETH_DB_PUBLIC
251IxEthDBStatus ixEthDBPortVlanTagGet(IxEthDBPortId portID, IxEthDBVlanTag *vlanTag)
252{
253    IX_ETH_DB_CHECK_PORT(portID);
254   
255    IX_ETH_DB_CHECK_SINGLE_NPE(portID);
256   
257    IX_ETH_DB_CHECK_FEATURE(portID, IX_ETH_DB_VLAN_QOS);
258   
259    IX_ETH_DB_CHECK_REFERENCE(vlanTag);
260   
261    *vlanTag = ixEthDBPortInfo[portID].vlanTag;
262   
263    return IX_ETH_DB_SUCCESS;
264}
265
266/**
267 * @brief sets the VLAN tag (the lower 3 bytes are the PVID) of a
268 * database filtering record
269 *
270 * @param portID ID of the port
271 * @param vlanTag VLAN tag (802.1Q tag)
272 *
273 * Important: filtering records are automatically converted to
274 * IX_ETH_DB_FILTERING_VLAN record when added a VLAN tag.
275 *
276 * Note that this function is documented in the main component
277 * header file, IxEthDB.h.
278 *
279 * @return IX_ETH_DB_SUCCESS if the operation completed successfully
280 * or an appropriate error message otherwise
281 */
282IX_ETH_DB_PUBLIC
283IxEthDBStatus ixEthDBVlanTagSet(IxEthDBMacAddr *macAddr, IxEthDBVlanTag vlanTag)
284{
285    HashNode *searchResult;
286    MacDescriptor *descriptor;
287   
288    IX_ETH_DB_CHECK_REFERENCE(macAddr);
289   
290    IX_ETH_DB_CHECK_VLAN_TAG(vlanTag);
291   
292    searchResult = ixEthDBSearch(macAddr, IX_ETH_DB_ALL_FILTERING_RECORDS);
293   
294    if (searchResult == NULL)
295    {
296        return IX_ETH_DB_NO_SUCH_ADDR;
297    }
298   
299    descriptor = (MacDescriptor *) searchResult->data;
300   
301    /* set record type to VLAN if not already set */
302    descriptor->type = IX_ETH_DB_FILTERING_VLAN_RECORD;
303   
304    /* add vlan tag */
305    descriptor->recordData.filteringVlanData.ieee802_1qTag = vlanTag;
306   
307    /* transaction completed */
308    ixEthDBReleaseHashNode(searchResult);
309   
310    return IX_ETH_DB_SUCCESS;
311}
312
313/**
314 * @brief retrieves the VLAN tag (the lower 3 bytes are the PVID) from a
315 * database VLAN filtering record
316 *
317 * @param portID ID of the port
318 * @param vlanTag address to write the VLAN tag (802.1Q tag) into
319 *
320 * Note that this function is documented in the main component
321 * header file, IxEthDB.h.
322 *
323 * @return IX_ETH_DB_SUCCESS if the operation completed successfully
324 * or an appropriate error message otherwise
325 */
326IX_ETH_DB_PUBLIC
327IxEthDBStatus ixEthDBVlanTagGet(IxEthDBMacAddr *macAddr, IxEthDBVlanTag *vlanTag)
328{
329    HashNode *searchResult;
330    MacDescriptor *descriptor;
331   
332    IX_ETH_DB_CHECK_REFERENCE(macAddr);
333   
334    IX_ETH_DB_CHECK_REFERENCE(vlanTag);
335   
336    searchResult = ixEthDBSearch(macAddr, IX_ETH_DB_FILTERING_VLAN_RECORD);
337   
338    if (searchResult == NULL)
339    {
340        return IX_ETH_DB_NO_SUCH_ADDR;
341    }
342   
343    descriptor = (MacDescriptor *) searchResult->data;
344       
345    /* get vlan tag */
346    *vlanTag = descriptor->recordData.filteringVlanData.ieee802_1qTag;
347   
348    /* transaction completed */
349    ixEthDBReleaseHashNode(searchResult);
350   
351    return IX_ETH_DB_SUCCESS;
352}
353
354/**
355 * @brief adds a VLAN to a port's VLAN membership table
356 *
357 * @param portID ID of the port
358 * @param vlanID VLAN ID to add
359 *
360 * Note that this function is documented in the main component
361 * header file, IxEthDB.h.
362 *
363 * @return IX_ETH_DB_SUCCESS if the operation completed successfully
364 * or an appropriate error message otherwise
365 */
366IX_ETH_DB_PUBLIC
367IxEthDBStatus ixEthDBPortVlanMembershipAdd(IxEthDBPortId portID, IxEthDBVlanId vlanID)
368{
369    IX_ETH_DB_CHECK_PORT(portID);
370
371    IX_ETH_DB_CHECK_SINGLE_NPE(portID);
372
373    IX_ETH_DB_CHECK_VLAN_ID(vlanID);
374
375    IX_ETH_DB_CHECK_FEATURE(portID, IX_ETH_DB_VLAN_QOS);
376
377    return ixEthDBPortVlanMembershipChange(portID, vlanID, ixEthDBPortInfo[portID].vlanMembership, ADD_VLAN);
378}
379
380/**
381 * @brief removes a VLAN from a port's VLAN membership table
382 *
383 * @param portID ID of the port
384 * @param vlanID VLAN ID to remove
385 *
386 * Note that this function is documented in the main component
387 * header file, IxEthDB.h.
388 *
389 * @return IX_ETH_DB_SUCCESS if the operation completed successfully
390 * or an appropriate error message otherwise
391 */
392IX_ETH_DB_PUBLIC
393IxEthDBStatus ixEthDBPortVlanMembershipRemove(IxEthDBPortId portID, IxEthDBVlanId vlanID)
394{
395    IX_ETH_DB_CHECK_PORT(portID);
396
397    IX_ETH_DB_CHECK_SINGLE_NPE(portID);
398
399    IX_ETH_DB_CHECK_FEATURE(portID, IX_ETH_DB_VLAN_QOS);
400
401    IX_ETH_DB_CHECK_VLAN_ID(vlanID);
402
403    /* for safety isolate only the VLAN ID in the tag (the lower 12 bits) */
404    vlanID = vlanID & IX_ETH_DB_802_1Q_VLAN_MASK;
405   
406    /* check we're not asked to remove the default port VID */
407    if (vlanID == IX_ETH_DB_GET_VLAN_ID(ixEthDBPortInfo[portID].vlanTag))
408    {
409        return IX_ETH_DB_NO_PERMISSION;
410    }
411   
412    return ixEthDBPortVlanMembershipChange(portID, vlanID, ixEthDBPortInfo[portID].vlanMembership, REMOVE_VLAN);
413}
414
415/**
416 * @brief adds or removes a VLAN range from a port's
417 * VLAN membership table or TTI table
418 *
419 * @param portID ID of the port
420 * @param vlanIDMin start of the VLAN range
421 * @param vlanIDMax end of the VLAN range
422 * @param table VLAN set to add or remove from
423 * @param action ADD_VLAN or REMOVE_VLAN
424 *
425 * @return IX_ETH_DB_SUCCESS if the operation completed successfully
426 * or an appropriate error message otherwise
427 *
428 * @internal
429 */
430IX_ETH_DB_PRIVATE
431IxEthDBStatus ixEthDBPortVlanMembershipRangeChange(IxEthDBPortId portID, IxEthDBVlanId vlanIDMin, IxEthDBVlanId vlanIDMax, IxEthDBVlanSet table, UINT32 action)
432{
433    UINT32 setOffsetMin, setOffsetMax;
434   
435    IX_ETH_DB_CHECK_PORT(portID);
436   
437    IX_ETH_DB_CHECK_SINGLE_NPE(portID);
438   
439    IX_ETH_DB_CHECK_FEATURE(portID, IX_ETH_DB_VLAN_QOS);
440   
441    IX_ETH_DB_CHECK_VLAN_ID(vlanIDMin);
442   
443    IX_ETH_DB_CHECK_VLAN_ID(vlanIDMax);
444   
445    /* for safety isolate only the VLAN ID in the tags (the lower 12 bits) */
446    vlanIDMin = vlanIDMin & IX_ETH_DB_802_1Q_VLAN_MASK;
447    vlanIDMax = vlanIDMax & IX_ETH_DB_802_1Q_VLAN_MASK;
448   
449    /* is this a range? */
450    if (vlanIDMax < vlanIDMin)
451    {
452        return IX_ETH_DB_INVALID_VLAN;
453    }
454   
455    /* check that we're not specifically asked to remove the default port VID */
456    if (action == REMOVE_VLAN && vlanIDMax == vlanIDMin && IX_ETH_DB_GET_VLAN_ID(ixEthDBPortInfo[portID].vlanTag) == vlanIDMin)
457    {
458        return IX_ETH_DB_NO_PERMISSION;
459    }
460   
461    /* compute set offsets */
462    setOffsetMin = VLAN_SET_OFFSET(vlanIDMin);
463    setOffsetMax = VLAN_SET_OFFSET(vlanIDMax);
464
465    /* change VLAN range */
466    for (; vlanIDMin <= vlanIDMax ; vlanIDMin++)
467    {
468        /* change vlan in local membership table */
469        ixEthDBLocalVlanMembershipChange(vlanIDMin, table, action);
470    }
471
472    /* if the range is within one set (max 8 VLANs in one table byte) we can just update that entry in the NPE */
473    if (setOffsetMin == setOffsetMax)
474    {
475        /* send updated entry to NPE */
476        return ixEthDBVlanTableEntryUpdate(portID, setOffsetMin);
477    }
478    else
479    {
480        /* update a zone of the membership/transmit tag info table */
481        return ixEthDBVlanTableRangeUpdate(portID);
482    }
483}
484
485/**
486 * @brief adds a VLAN range to a port's VLAN membership table
487 *
488 * @param portID ID of the port
489 * @param vlanIDMin start of the VLAN range
490 * @param vlanIDMax end of the VLAN range
491 *
492 * Note that this function is documented in the main component
493 * header file, IxEthDB.h.
494 *
495 * @return IX_ETH_DB_SUCCESS if the operation completed successfully
496 * or an appropriate error message otherwise
497 */
498IX_ETH_DB_PUBLIC
499IxEthDBStatus ixEthDBPortVlanMembershipRangeAdd(IxEthDBPortId portID, IxEthDBVlanId vlanIDMin, IxEthDBVlanId vlanIDMax)
500{
501    IX_ETH_DB_CHECK_PORT(portID);
502
503    IX_ETH_DB_CHECK_SINGLE_NPE(portID);
504
505    return ixEthDBPortVlanMembershipRangeChange(portID, vlanIDMin, vlanIDMax, ixEthDBPortInfo[portID].vlanMembership, ADD_VLAN);
506}
507
508/**
509 * @brief removes a VLAN range from a port's VLAN membership table
510 *
511 * @param portID ID of the port
512 * @param vlanIDMin start of the VLAN range
513 * @param vlanIDMax end of the VLAN range
514 *
515 * Note that this function is documented in the main component
516 * header file, IxEthDB.h.
517 *
518 * @return IX_ETH_DB_SUCCESS if the operation completed successfully
519 * or an appropriate error message otherwise
520 */
521IX_ETH_DB_PUBLIC
522IxEthDBStatus ixEthDBPortVlanMembershipRangeRemove(IxEthDBPortId portID, IxEthDBVlanId vlanIDMin, IxEthDBVlanId vlanIDMax)
523{
524    IX_ETH_DB_CHECK_PORT(portID);
525
526    IX_ETH_DB_CHECK_SINGLE_NPE(portID);
527
528    return ixEthDBPortVlanMembershipRangeChange(portID, vlanIDMin, vlanIDMax, ixEthDBPortInfo[portID].vlanMembership, REMOVE_VLAN);
529}
530
531/**
532 * @brief sets a port's VLAN membership table or TTI table and
533 * updates the NPE VLAN configuration
534 *
535 * @param portID ID of the port
536 * @param portVlanTable port VLAN table to set
537 * @param vlanSet new set contents
538 *
539 * @return IX_ETH_DB_SUCCESS if the operation completed successfully
540 * or an appropriate error message otherwise
541 *
542 * @internal
543 */
544IX_ETH_DB_PUBLIC
545IxEthDBStatus ixEthDBPortVlanTableSet(IxEthDBPortId portID, IxEthDBVlanSet portVlanTable, IxEthDBVlanSet vlanSet)
546{
547    IX_ETH_DB_CHECK_PORT(portID);
548   
549    IX_ETH_DB_CHECK_SINGLE_NPE(portID);
550   
551    IX_ETH_DB_CHECK_FEATURE(portID, IX_ETH_DB_VLAN_QOS);
552   
553    IX_ETH_DB_CHECK_REFERENCE(vlanSet);
554
555    memcpy(portVlanTable, vlanSet, sizeof (IxEthDBVlanSet));
556   
557    return ixEthDBVlanTableRangeUpdate(portID);
558}
559
560/**
561 * @brief retireves a port's VLAN membership table or TTI table
562 *
563 * @param portID ID of the port
564 * @param portVlanTable port VLAN table to retrieve
565 * @param vlanSet address to
566 *
567 * @return IX_ETH_DB_SUCCESS if the operation completed successfully
568 * or an appropriate error message otherwise
569 *
570 * @internal
571 */
572IX_ETH_DB_PUBLIC
573IxEthDBStatus ixEthDBVlanTableGet(IxEthDBPortId portID, IxEthDBVlanSet portVlanTable, IxEthDBVlanSet vlanSet)
574{
575    IX_ETH_DB_CHECK_PORT(portID);
576   
577    IX_ETH_DB_CHECK_SINGLE_NPE(portID);
578   
579    IX_ETH_DB_CHECK_FEATURE(portID, IX_ETH_DB_VLAN_QOS);
580   
581    IX_ETH_DB_CHECK_REFERENCE(vlanSet);
582   
583    memcpy(vlanSet, portVlanTable, sizeof (IxEthDBVlanSet));
584   
585    return IX_ETH_DB_SUCCESS;
586}
587
588/**
589 * @brief sets a port's VLAN membership table
590 *
591 * @param portID ID of the port
592 * @param vlanSet new VLAN membership table
593 *
594 * Note that this function is documented in the main component
595 * header file, IxEthDB.h.
596 *
597 * @return IX_ETH_DB_SUCCESS if the operation completed successfully
598 * or an appropriate error message otherwise
599 */
600IX_ETH_DB_PUBLIC
601IxEthDBStatus ixEthDBPortVlanMembershipSet(IxEthDBPortId portID, IxEthDBVlanSet vlanSet)
602{
603    IxEthDBVlanId vlanID;
604
605    IX_ETH_DB_CHECK_PORT(portID);
606   
607    IX_ETH_DB_CHECK_SINGLE_NPE(portID);
608
609    IX_ETH_DB_CHECK_REFERENCE(vlanSet);
610
611    /* set the bit corresponding to the PVID just in case */
612    vlanID = IX_ETH_DB_GET_VLAN_ID(ixEthDBPortInfo[portID].vlanTag);
613    vlanSet[VLAN_SET_OFFSET(vlanID)] |= 1 << VLAN_SET_MASK(vlanID);
614   
615    return ixEthDBPortVlanTableSet(portID, ixEthDBPortInfo[portID].vlanMembership, vlanSet);
616}
617
618/**
619 * @brief retrieves a port's VLAN membership table
620 *
621 * @param portID ID of the port
622 * @param vlanSet location to store the port's VLAN membership table
623 *
624 * Note that this function is documented in the main component
625 * header file, IxEthDB.h.
626 *
627 * @return IX_ETH_DB_SUCCESS if the operation completed successfully
628 * or an appropriate error message otherwise
629 */
630IX_ETH_DB_PUBLIC
631IxEthDBStatus ixEthDBPortVlanMembershipGet(IxEthDBPortId portID, IxEthDBVlanSet vlanSet)
632{
633    IX_ETH_DB_CHECK_PORT(portID);
634   
635    IX_ETH_DB_CHECK_SINGLE_NPE(portID);
636   
637    return ixEthDBVlanTableGet(portID, ixEthDBPortInfo[portID].vlanMembership, vlanSet);
638}
639
640/**
641 * @brief enables or disables Egress tagging for one VLAN ID
642 *
643 * @param portID ID of the port
644 * @param vlanID VLAN ID to enable or disable Egress tagging on
645 * @param enabled TRUE to enable and FALSE to disable tagging
646 *
647 * Note that this function is documented in the main component
648 * header file, IxEthDB.h.
649 *
650 * @return IX_ETH_DB_SUCCESS if the operation completed successfully
651 * or an appropriate error message otherwise
652 */
653IX_ETH_DB_PUBLIC
654IxEthDBStatus ixEthDBEgressVlanEntryTaggingEnabledSet(IxEthDBPortId portID, IxEthDBVlanId vlanID, BOOL enabled)
655{
656    IX_ETH_DB_CHECK_PORT(portID);
657   
658    IX_ETH_DB_CHECK_SINGLE_NPE(portID);
659
660    IX_ETH_DB_CHECK_VLAN_ID(vlanID);
661
662    IX_ETH_DB_CHECK_FEATURE(portID, IX_ETH_DB_VLAN_QOS);
663
664    return ixEthDBPortVlanMembershipChange(portID, vlanID, ixEthDBPortInfo[portID].transmitTaggingInfo, enabled? ADD_VLAN : REMOVE_VLAN);
665}
666
667/**
668 * @brief retrieves the Egress tagging status for one VLAN ID
669 *
670 * @param portID ID of the port
671 * @param vlanID VLAN ID to retrieve the tagging status for
672 * @param enabled location to store the tagging status
673 * (TRUE - tagging enabled, FALSE - tagging disabled)
674 *
675 * Note that this function is documented in the main component
676 * header file, IxEthDB.h.
677 *
678 * @return IX_ETH_DB_SUCCESS if the operation completed successfully
679 * or an appropriate error message otherwise
680 */
681IX_ETH_DB_PUBLIC
682IxEthDBStatus ixEthDBEgressVlanEntryTaggingEnabledGet(IxEthDBPortId portID, IxEthDBVlanId vlanID, BOOL *enabled)
683{
684    IX_ETH_DB_CHECK_PORT(portID);
685   
686    IX_ETH_DB_CHECK_SINGLE_NPE(portID);
687   
688    IX_ETH_DB_CHECK_FEATURE(portID, IX_ETH_DB_VLAN_QOS);
689   
690    IX_ETH_DB_CHECK_REFERENCE(enabled);
691
692    IX_ETH_DB_CHECK_VLAN_ID(vlanID);
693   
694    *enabled = ((ixEthDBPortInfo[portID].transmitTaggingInfo[VLAN_SET_OFFSET(vlanID)] & (1 << VLAN_SET_MASK(vlanID))) != 0);
695   
696    return IX_ETH_DB_SUCCESS;
697}
698
699/**
700 * @brief enables or disables Egress VLAN tagging for a VLAN range
701 *
702 * @param portID ID of the port
703 * @param vlanIDMin start of VLAN range
704 * @param vlanIDMax end of VLAN range
705 * @param enabled TRUE to enable or FALSE to disable VLAN tagging
706 *
707 * Note that this function is documented in the main component
708 * header file, IxEthDB.h.
709 *
710 * @return IX_ETH_DB_SUCCESS if the operation completed successfully
711 * or an appropriate error message otherwise
712 */
713IX_ETH_DB_PUBLIC
714IxEthDBStatus ixEthDBEgressVlanRangeTaggingEnabledSet(IxEthDBPortId portID, IxEthDBVlanId vlanIDMin, IxEthDBVlanId vlanIDMax, BOOL enabled)
715{
716    IX_ETH_DB_CHECK_PORT(portID);
717   
718    IX_ETH_DB_CHECK_SINGLE_NPE(portID);
719   
720    return ixEthDBPortVlanMembershipRangeChange(portID, vlanIDMin, vlanIDMax, ixEthDBPortInfo[portID].transmitTaggingInfo, enabled? ADD_VLAN : REMOVE_VLAN);
721}
722
723/**
724 * @brief sets the Egress VLAN tagging table (the Transmit Tagging
725 * Information table)
726 *
727 * @param portID ID of the port
728 * @param vlanSet new TTI table
729 *
730 * Note that this function is documented in the main component
731 * header file, IxEthDB.h.
732 *
733 * @return IX_ETH_DB_SUCCESS if the operation completed successfully
734 * or an appropriate error message otherwise
735 */
736IX_ETH_DB_PUBLIC
737IxEthDBStatus ixEthDBEgressVlanTaggingEnabledSet(IxEthDBPortId portID, IxEthDBVlanSet vlanSet)
738{
739    IxEthDBVlanId vlanID;
740
741    IX_ETH_DB_CHECK_PORT(portID);
742   
743    IX_ETH_DB_CHECK_SINGLE_NPE(portID);
744
745    IX_ETH_DB_CHECK_REFERENCE(vlanSet);
746
747    /* set the PVID bit just in case */
748    vlanID = IX_ETH_DB_GET_VLAN_ID(ixEthDBPortInfo[portID].vlanTag);
749    vlanSet[VLAN_SET_OFFSET(vlanID)] |= 1 << VLAN_SET_MASK(vlanID);
750   
751    return ixEthDBPortVlanTableSet(portID, ixEthDBPortInfo[portID].transmitTaggingInfo, vlanSet);
752}
753
754/**
755 * @brief retrieves the Egress VLAN tagging table (the Transmit
756 * Tagging Information table)
757 *
758 * @param portID ID of the port
759 * @param vlanSet location to store the port's TTI table
760 *
761 * Note that this function is documented in the main component
762 * header file, IxEthDB.h.
763 *
764 * @return IX_ETH_DB_SUCCESS if the operation completed successfully
765 * or an appropriate error message otherwise
766 */
767IX_ETH_DB_PUBLIC
768IxEthDBStatus ixEthDBEgressVlanTaggingEnabledGet(IxEthDBPortId portID, IxEthDBVlanSet vlanSet)
769{
770    IX_ETH_DB_CHECK_PORT(portID);
771   
772    IX_ETH_DB_CHECK_SINGLE_NPE(portID);
773   
774    return ixEthDBVlanTableGet(portID, ixEthDBPortInfo[portID].transmitTaggingInfo, vlanSet);
775}
776
777/**
778 * @brief sends the NPE the updated frame filter and default
779 * Ingress tagging
780 *
781 * @param portID ID of the port
782 *
783 * @return IX_ETH_DB_SUCCESS if the operation completed successfully
784 * or an appropriate error message otherwise
785 *
786 * @internal
787 */
788IX_ETH_DB_PRIVATE
789IxEthDBStatus ixEthDBIngressVlanModeUpdate(IxEthDBPortId portID)
790{
791    PortInfo *portInfo = &ixEthDBPortInfo[portID];
792    IxNpeMhMessage message;
793    IX_STATUS result;
794
795    FILL_SETRXTAGMODE_MSG(message, portID, portInfo->npeFrameFilter, portInfo->npeTaggingAction);
796    IX_ETHDB_SEND_NPE_MSG(IX_ETH_DB_PORT_ID_TO_NPE(portID), message, result);
797
798    return result;
799}
800
801/**
802 * @brief sets the default Ingress tagging behavior
803 *
804 * @param portID ID of the port
805 * @param taggingAction default tagging behavior
806 *
807 * Note that this function is documented in the main component
808 * header file, IxEthDB.h.
809 *
810 * @return IX_ETH_DB_SUCCESS if the operation completed successfully
811 * or an appropriate error message otherwise
812 */
813IX_ETH_DB_PUBLIC
814IxEthDBStatus ixEthDBIngressVlanTaggingEnabledSet(IxEthDBPortId portID, IxEthDBTaggingAction taggingAction)
815{
816    PortInfo *portInfo;
817   
818    IX_ETH_DB_CHECK_PORT(portID);
819   
820    IX_ETH_DB_CHECK_SINGLE_NPE(portID);
821   
822    IX_ETH_DB_CHECK_FEATURE(portID, IX_ETH_DB_VLAN_QOS);
823   
824    portInfo = &ixEthDBPortInfo[portID];
825   
826    if (taggingAction == IX_ETH_DB_PASS_THROUGH)
827    {
828        portInfo->npeTaggingAction = 0x00;
829    }
830    else if (taggingAction == IX_ETH_DB_ADD_TAG)
831    {
832        portInfo->npeTaggingAction = 0x02;
833    }
834    else if (taggingAction == IX_ETH_DB_REMOVE_TAG)
835    {
836        portInfo->npeTaggingAction = 0x01;
837    }
838    else
839    {
840        return IX_ETH_DB_INVALID_ARG;
841    }
842   
843    portInfo->taggingAction = taggingAction;
844   
845    return ixEthDBIngressVlanModeUpdate(portID);
846}
847
848/**
849 * @brief retrieves the default Ingress tagging behavior of a port
850 *
851 * @param portID ID of the port
852 * @param taggingAction location to save the default tagging behavior
853 *
854 * Note that this function is documented in the main component
855 * header file, IxEthDB.h.
856 *
857 * @return IX_ETH_DB_SUCCESS if the operation completed successfully
858 * or an appropriate error message otherwise
859 */
860IX_ETH_DB_PUBLIC
861IxEthDBStatus ixEthDBIngressVlanTaggingEnabledGet(IxEthDBPortId portID, IxEthDBTaggingAction *taggingAction)
862{
863    IX_ETH_DB_CHECK_PORT(portID);
864   
865    IX_ETH_DB_CHECK_SINGLE_NPE(portID);
866   
867    IX_ETH_DB_CHECK_FEATURE(portID, IX_ETH_DB_VLAN_QOS);
868
869    IX_ETH_DB_CHECK_REFERENCE(taggingAction);
870   
871    *taggingAction = ixEthDBPortInfo[portID].taggingAction;
872   
873    return IX_ETH_DB_SUCCESS;
874}
875
876/**
877 * @brief sets the Ingress acceptable frame type filter
878 *
879 * @param portID ID of the port
880 * @param frameFilter acceptable frame type filter
881 *
882 * Note that this function is documented in the main component
883 * header file, IxEthDB.h.
884 *
885 * @return IX_ETH_DB_SUCCESS if the operation completed successfully
886 * or an appropriate error message otherwise
887 */
888IX_ETH_DB_PUBLIC
889IxEthDBStatus ixEthDBAcceptableFrameTypeSet(IxEthDBPortId portID, IxEthDBFrameFilter frameFilter)
890{
891    PortInfo *portInfo;
892    IxEthDBStatus result = IX_ETH_DB_SUCCESS;
893       
894    IX_ETH_DB_CHECK_PORT(portID);
895   
896    IX_ETH_DB_CHECK_SINGLE_NPE(portID);
897   
898    IX_ETH_DB_CHECK_FEATURE(portID, IX_ETH_DB_VLAN_QOS);
899   
900    /* check parameter range
901       the ORed value of the valid values is 0x7
902       a value having extra bits is invalid */
903    if ((frameFilter | 0x7) != 0x7 || frameFilter == 0)
904    {
905        return IX_ETH_DB_INVALID_ARG;
906    }
907   
908    portInfo = &ixEthDBPortInfo[portID];
909   
910    portInfo->frameFilter    = frameFilter;
911    portInfo->npeFrameFilter = 0; /* allow all by default */
912   
913    /* if accepting priority tagged but not all VLAN tagged
914       set the membership table to contain only VLAN ID 0
915       hence remove vlans 1-4094 and add VLAN ID 0 */
916    if (((frameFilter & IX_ETH_DB_PRIORITY_TAGGED_FRAMES) != 0)
917        && ((frameFilter & IX_ETH_DB_VLAN_TAGGED_FRAMES) == 0))
918    {
919        result = ixEthDBPortVlanMembershipRangeChange(portID, 
920            1, IX_ETH_DB_802_1Q_MAX_VLAN_ID, portInfo->vlanMembership, REMOVE_VLAN);
921
922        if (result == IX_ETH_DB_SUCCESS)
923        {
924            ixEthDBLocalVlanMembershipChange(0, portInfo->vlanMembership, ADD_VLAN);
925            result = ixEthDBVlanTableRangeUpdate(portID);
926        }
927    }
928   
929    /* untagged only? */
930    if (frameFilter == IX_ETH_DB_UNTAGGED_FRAMES)
931    {
932        portInfo->npeFrameFilter = 0x01;
933    }
934   
935    /* tagged only? */
936    if ((frameFilter & IX_ETH_DB_UNTAGGED_FRAMES) == 0)
937    {
938        portInfo->npeFrameFilter = 0x02;
939    }
940
941    if (result == IX_ETH_DB_SUCCESS)
942    {
943        result = ixEthDBIngressVlanModeUpdate(portID);
944    }
945
946    return result;
947}
948
949/**
950 * @brief retrieves the acceptable frame type filter for a port
951 *
952 * @param portID ID of the port
953 * @param frameFilter location to store the frame filter
954 *
955 * Note that this function is documented in the main component
956 * header file, IxEthDB.h.
957 *
958 * @return IX_ETH_DB_SUCCESS if the operation completed successfully
959 * or an appropriate error message otherwise
960 */
961IX_ETH_DB_PUBLIC
962IxEthDBStatus ixEthDBAcceptableFrameTypeGet(IxEthDBPortId portID, IxEthDBFrameFilter *frameFilter)
963{
964    IX_ETH_DB_CHECK_PORT(portID);
965   
966    IX_ETH_DB_CHECK_SINGLE_NPE(portID);
967   
968    IX_ETH_DB_CHECK_FEATURE(portID, IX_ETH_DB_VLAN_QOS);
969   
970    IX_ETH_DB_CHECK_REFERENCE(frameFilter);
971   
972    *frameFilter = ixEthDBPortInfo[portID].frameFilter;
973   
974    return IX_ETH_DB_SUCCESS;
975}
976
977/**
978 * @brief sends an NPE the updated configuration related
979 * to one QoS priority (associated traffic class and AQM mapping)
980 *
981 * @param portID ID of the port
982 * @param classIndex QoS priority (traffic class index)
983 *
984 * @return IX_ETH_DB_SUCCESS if the operation completed successfully
985 * or an appropriate error message otherwise
986 *
987 * @internal
988 */
989IX_ETH_DB_PUBLIC
990IxEthDBStatus ixEthDBUpdateTrafficClass(IxEthDBPortId portID, UINT32 classIndex)
991{
992    IxNpeMhMessage message;
993    IX_STATUS result;
994
995    UINT32 trafficClass = ixEthDBPortInfo[portID].priorityTable[classIndex];
996    UINT32 aqmQueue     = ixEthDBPortInfo[portID].ixEthDBTrafficClassAQMAssignments[trafficClass];
997   
998    FILL_SETRXQOSENTRY(message, IX_ETH_DB_PORT_ID_TO_NPE_LOGICAL_ID(portID), classIndex, trafficClass, aqmQueue);
999   
1000    IX_ETHDB_SEND_NPE_MSG(IX_ETH_DB_PORT_ID_TO_NPE(portID), message, result);
1001   
1002    return result;
1003}
1004
1005/**
1006 * @brief sets the priority mapping table
1007 *
1008 * @param portID ID of the port
1009 * @param priorityTable new priority mapping table
1010 *
1011 * Note that this function is documented in the main component
1012 * header file, IxEthDB.h.
1013 *
1014 * @return IX_ETH_DB_SUCCESS if the operation completed successfully
1015 * or an appropriate error message otherwise
1016 */
1017IX_ETH_DB_PUBLIC
1018IxEthDBStatus ixEthDBPriorityMappingTableSet(IxEthDBPortId portID, IxEthDBPriorityTable priorityTable)
1019{
1020    UINT32 classIndex;
1021   
1022    IX_ETH_DB_CHECK_PORT(portID);
1023   
1024    IX_ETH_DB_CHECK_SINGLE_NPE(portID);
1025   
1026    IX_ETH_DB_CHECK_FEATURE(portID, IX_ETH_DB_VLAN_QOS);
1027   
1028    IX_ETH_DB_CHECK_REFERENCE(priorityTable);
1029           
1030    for (classIndex = 0 ; classIndex < IX_IEEE802_1Q_QOS_PRIORITY_COUNT ; classIndex++)
1031    {
1032        /* check range */
1033        if (priorityTable[classIndex] >= ixEthDBPortInfo[portID].ixEthDBTrafficClassCount)
1034        {
1035            return IX_ETH_DB_INVALID_PRIORITY;
1036        }
1037    }
1038   
1039    /* set new traffic classes */
1040    for (classIndex = 0 ; classIndex < IX_IEEE802_1Q_QOS_PRIORITY_COUNT ; classIndex++)
1041    {
1042        ixEthDBPortInfo[portID].priorityTable[classIndex] = priorityTable[classIndex];
1043       
1044        if (ixEthDBUpdateTrafficClass(portID, classIndex) != IX_ETH_DB_SUCCESS)
1045        {
1046            return IX_ETH_DB_FAIL;
1047        }
1048    }
1049   
1050    return IX_ETH_DB_SUCCESS;
1051 }
1052
1053/**
1054 * @brief retrieves a port's priority mapping table
1055 *
1056 * @param portID ID of the port
1057 * @param priorityTable location to store the priority table
1058 *
1059 * Note that this function is documented in the main component
1060 * header file, IxEthDB.h.
1061 *
1062 * @return IX_ETH_DB_SUCCESS if the operation completed successfully
1063 * or an appropriate error message otherwise
1064 */
1065IX_ETH_DB_PUBLIC
1066IxEthDBStatus ixEthDBPriorityMappingTableGet(IxEthDBPortId portID, IxEthDBPriorityTable priorityTable)
1067{
1068    IX_ETH_DB_CHECK_PORT(portID);
1069   
1070    IX_ETH_DB_CHECK_SINGLE_NPE(portID);
1071   
1072    IX_ETH_DB_CHECK_FEATURE(portID, IX_ETH_DB_VLAN_QOS);
1073   
1074    IX_ETH_DB_CHECK_REFERENCE(priorityTable);
1075   
1076    memcpy(priorityTable, ixEthDBPortInfo[portID].priorityTable, sizeof (IxEthDBPriorityTable));
1077   
1078    return IX_ETH_DB_SUCCESS;
1079}
1080
1081/**
1082 * @brief sets one QoS priority => traffic class mapping
1083 *
1084 * @param portID ID of the port
1085 * @param userPriority QoS (user) priority
1086 * @param trafficClass associated traffic class
1087 *
1088 * Note that this function is documented in the main component
1089 * header file, IxEthDB.h.
1090 *
1091 * @return IX_ETH_DB_SUCCESS if the operation completed successfully
1092 * or an appropriate error message otherwise
1093 */
1094IX_ETH_DB_PUBLIC
1095IxEthDBStatus ixEthDBPriorityMappingClassSet(IxEthDBPortId portID, IxEthDBPriority userPriority, IxEthDBPriority trafficClass)
1096{
1097    IX_ETH_DB_CHECK_PORT(portID);
1098   
1099    IX_ETH_DB_CHECK_SINGLE_NPE(portID);
1100   
1101    IX_ETH_DB_CHECK_FEATURE(portID, IX_ETH_DB_VLAN_QOS);
1102
1103    /* check ranges for userPriority and trafficClass */
1104    if (userPriority >= IX_IEEE802_1Q_QOS_PRIORITY_COUNT || trafficClass >= ixEthDBPortInfo[portID].ixEthDBTrafficClassCount)
1105    {
1106        return IX_ETH_DB_INVALID_PRIORITY;
1107    }
1108   
1109    ixEthDBPortInfo[portID].priorityTable[userPriority] = trafficClass;
1110   
1111    return ixEthDBUpdateTrafficClass(portID, userPriority);
1112}
1113
1114/**
1115 * @brief retrieves one QoS priority => traffic class mapping
1116 *
1117 * @param portID ID of the port
1118 * @param userPriority QoS (user) priority
1119 * @param trafficClass location to store the associated traffic class
1120 *
1121 * Note that this function is documented in the main component
1122 * header file, IxEthDB.h.
1123 *
1124 * @return IX_ETH_DB_SUCCESS if the operation completed successfully
1125 * or an appropriate error message otherwise
1126 */
1127IX_ETH_DB_PUBLIC
1128IxEthDBStatus ixEthDBPriorityMappingClassGet(IxEthDBPortId portID, IxEthDBPriority userPriority, IxEthDBPriority *trafficClass)
1129{
1130    IX_ETH_DB_CHECK_PORT(portID);
1131   
1132    IX_ETH_DB_CHECK_SINGLE_NPE(portID);
1133   
1134    IX_ETH_DB_CHECK_FEATURE(portID, IX_ETH_DB_VLAN_QOS);
1135   
1136    IX_ETH_DB_CHECK_REFERENCE(trafficClass);
1137   
1138    /* check userPriority range */
1139    if (userPriority >= IX_IEEE802_1Q_QOS_PRIORITY_COUNT)
1140    {
1141        return IX_ETH_DB_INVALID_PRIORITY;
1142    }
1143   
1144    *trafficClass = ixEthDBPortInfo[portID].priorityTable[userPriority];
1145   
1146    return IX_ETH_DB_SUCCESS;
1147}
1148
1149/**
1150 * @brief enables or disables the source port extraction
1151 * from the VLAN TPID field
1152 *
1153 * @param portID ID of the port
1154 * @param enable TRUE to enable or FALSE to disable
1155 *
1156 * Note that this function is documented in the main component
1157 * header file, IxEthDB.h.
1158 *
1159 * @return IX_ETH_DB_SUCCESS if the operation completed successfully
1160 * or an appropriate error message otherwise
1161 */
1162IX_ETH_DB_PUBLIC
1163IxEthDBStatus ixEthDBVlanPortExtractionEnable(IxEthDBPortId portID, BOOL enable)
1164{
1165    IxNpeMhMessage message;
1166    IX_STATUS result;
1167
1168    IX_ETH_DB_CHECK_PORT(portID);
1169   
1170    IX_ETH_DB_CHECK_SINGLE_NPE(portID);
1171   
1172    IX_ETH_DB_CHECK_FEATURE(portID, IX_ETH_DB_VLAN_QOS);
1173
1174    FILL_SETPORTIDEXTRACTIONMODE(message, portID, enable);
1175
1176    IX_ETHDB_SEND_NPE_MSG(IX_ETH_DB_PORT_ID_TO_NPE(portID), message, result);
1177   
1178    return result;
1179}
Note: See TracBrowser for help on using the repository browser.