@@ -537,35 +537,50 @@ int vlan_dev_change_mtu(struct net_device *dev, int new_mtu)
537537void vlan_dev_set_ingress_priority (const struct net_device * dev ,
538538 u32 skb_prio , short vlan_prio )
539539{
540- VLAN_DEV_INFO (dev )-> ingress_priority_map [vlan_prio & 0x7 ] = skb_prio ;
540+ struct vlan_dev_info * vlan = VLAN_DEV_INFO (dev );
541+
542+ if (vlan -> ingress_priority_map [vlan_prio & 0x7 ] && !skb_prio )
543+ vlan -> nr_ingress_mappings -- ;
544+ else if (!vlan -> ingress_priority_map [vlan_prio & 0x7 ] && skb_prio )
545+ vlan -> nr_ingress_mappings ++ ;
546+
547+ vlan -> ingress_priority_map [vlan_prio & 0x7 ] = skb_prio ;
541548}
542549
543550int vlan_dev_set_egress_priority (const struct net_device * dev ,
544551 u32 skb_prio , short vlan_prio )
545552{
553+ struct vlan_dev_info * vlan = VLAN_DEV_INFO (dev );
546554 struct vlan_priority_tci_mapping * mp = NULL ;
547555 struct vlan_priority_tci_mapping * np ;
556+ u32 vlan_qos = (vlan_prio << 13 ) & 0xE000 ;
548557
549558 /* See if a priority mapping exists.. */
550- mp = VLAN_DEV_INFO ( dev ) -> egress_priority_map [skb_prio & 0xF ];
559+ mp = vlan -> egress_priority_map [skb_prio & 0xF ];
551560 while (mp ) {
552561 if (mp -> priority == skb_prio ) {
553- mp -> vlan_qos = ((vlan_prio << 13 ) & 0xE000 );
562+ if (mp -> vlan_qos && !vlan_qos )
563+ vlan -> nr_egress_mappings -- ;
564+ else if (!mp -> vlan_qos && vlan_qos )
565+ vlan -> nr_egress_mappings ++ ;
566+ mp -> vlan_qos = vlan_qos ;
554567 return 0 ;
555568 }
556569 mp = mp -> next ;
557570 }
558571
559572 /* Create a new mapping then. */
560- mp = VLAN_DEV_INFO ( dev ) -> egress_priority_map [skb_prio & 0xF ];
573+ mp = vlan -> egress_priority_map [skb_prio & 0xF ];
561574 np = kmalloc (sizeof (struct vlan_priority_tci_mapping ), GFP_KERNEL );
562575 if (!np )
563576 return - ENOBUFS ;
564577
565578 np -> next = mp ;
566579 np -> priority = skb_prio ;
567- np -> vlan_qos = ((vlan_prio << 13 ) & 0xE000 );
568- VLAN_DEV_INFO (dev )-> egress_priority_map [skb_prio & 0xF ] = np ;
580+ np -> vlan_qos = vlan_qos ;
581+ vlan -> egress_priority_map [skb_prio & 0xF ] = np ;
582+ if (vlan_qos )
583+ vlan -> nr_egress_mappings ++ ;
569584 return 0 ;
570585}
571586
0 commit comments