|
@@ -418,72 +418,6 @@ void prpkt(const char *msg, osl_t *osh, void *p0)
|
|
|
}
|
|
|
#endif /* defined(BCMDBG) */
|
|
|
|
|
|
-/* Takes an Ethernet frame and sets out-of-bound PKTPRIO.
|
|
|
- * Also updates the inplace vlan tag if requested.
|
|
|
- * For debugging, it returns an indication of what it did.
|
|
|
- */
|
|
|
-uint pktsetprio(void *pkt, bool update_vtag)
|
|
|
-{
|
|
|
- struct ether_header *eh;
|
|
|
- struct ethervlan_header *evh;
|
|
|
- u8 *pktdata;
|
|
|
- int priority = 0;
|
|
|
- int rc = 0;
|
|
|
-
|
|
|
- pktdata = (u8 *) PKTDATA(pkt);
|
|
|
- ASSERT(IS_ALIGNED((unsigned long)pktdata, sizeof(u16)));
|
|
|
-
|
|
|
- eh = (struct ether_header *)pktdata;
|
|
|
-
|
|
|
- if (ntoh16(eh->ether_type) == ETHER_TYPE_8021Q) {
|
|
|
- u16 vlan_tag;
|
|
|
- int vlan_prio, dscp_prio = 0;
|
|
|
-
|
|
|
- evh = (struct ethervlan_header *)eh;
|
|
|
-
|
|
|
- vlan_tag = ntoh16(evh->vlan_tag);
|
|
|
- vlan_prio = (int)(vlan_tag >> VLAN_PRI_SHIFT) & VLAN_PRI_MASK;
|
|
|
-
|
|
|
- if (ntoh16(evh->ether_type) == ETHER_TYPE_IP) {
|
|
|
- u8 *ip_body =
|
|
|
- pktdata + sizeof(struct ethervlan_header);
|
|
|
- u8 tos_tc = IP_TOS(ip_body);
|
|
|
- dscp_prio = (int)(tos_tc >> IPV4_TOS_PREC_SHIFT);
|
|
|
- }
|
|
|
-
|
|
|
- /* DSCP priority gets precedence over 802.1P (vlan tag) */
|
|
|
- if (dscp_prio != 0) {
|
|
|
- priority = dscp_prio;
|
|
|
- rc |= PKTPRIO_VDSCP;
|
|
|
- } else {
|
|
|
- priority = vlan_prio;
|
|
|
- rc |= PKTPRIO_VLAN;
|
|
|
- }
|
|
|
- /*
|
|
|
- * If the DSCP priority is not the same as the VLAN priority,
|
|
|
- * then overwrite the priority field in the vlan tag, with the
|
|
|
- * DSCP priority value. This is required for Linux APs because
|
|
|
- * the VLAN driver on Linux, overwrites the skb->priority field
|
|
|
- * with the priority value in the vlan tag
|
|
|
- */
|
|
|
- if (update_vtag && (priority != vlan_prio)) {
|
|
|
- vlan_tag &= ~(VLAN_PRI_MASK << VLAN_PRI_SHIFT);
|
|
|
- vlan_tag |= (u16) priority << VLAN_PRI_SHIFT;
|
|
|
- evh->vlan_tag = hton16(vlan_tag);
|
|
|
- rc |= PKTPRIO_UPD;
|
|
|
- }
|
|
|
- } else if (ntoh16(eh->ether_type) == ETHER_TYPE_IP) {
|
|
|
- u8 *ip_body = pktdata + sizeof(struct ether_header);
|
|
|
- u8 tos_tc = IP_TOS(ip_body);
|
|
|
- priority = (int)(tos_tc >> IPV4_TOS_PREC_SHIFT);
|
|
|
- rc |= PKTPRIO_DSCP;
|
|
|
- }
|
|
|
-
|
|
|
- ASSERT(priority >= 0 && priority <= MAXPRIO);
|
|
|
- PKTSETPRIO(pkt, priority);
|
|
|
- return rc | priority;
|
|
|
-}
|
|
|
-
|
|
|
static char bcm_undeferrstr[BCME_STRLEN];
|
|
|
|
|
|
static const char *bcmerrorstrtable[] = BCMERRSTRINGTABLE;
|