}
 
        while ((skb = __skb_dequeue(&txp->tq)) != NULL) {
-               u32 from = skb->tc_from;
-
-               skb_reset_tc(skb);
+               skb->tc_redirected = 0;
                skb->tc_skip_classify = 1;
 
                u64_stats_update_begin(&txp->tsync);
                rcu_read_unlock();
                skb->skb_iif = txp->dev->ifindex;
 
-               if (from & AT_EGRESS) {
+               if (!skb->tc_from_ingress) {
                        dev_queue_xmit(skb);
-               } else if (from & AT_INGRESS) {
+               } else {
                        skb_pull(skb, skb->mac_len);
                        netif_receive_skb(skb);
-               } else
-                       BUG();
+               }
        }
 
        if (__netif_tx_trylock(txq)) {
        txp->rx_bytes += skb->len;
        u64_stats_update_end(&txp->rsync);
 
-       if (skb->tc_from == AT_STACK || !skb->skb_iif) {
+       if (!skb->tc_redirected || !skb->skb_iif) {
                dev_kfree_skb(skb);
                dev->stats.rx_dropped++;
                return NETDEV_TX_OK;
 
  *     @ipvs_property: skbuff is owned by ipvs
  *     @tc_skip_classify: do not classify packet. set by IFB device
  *     @tc_at_ingress: used within tc_classify to distinguish in/egress
+ *     @tc_redirected: packet was redirected by a tc action
+ *     @tc_from_ingress: if tc_redirected, tc_at_ingress at time of redirect
  *     @peeked: this packet has been seen already, so stats have been
  *             done for it, don't do them again
  *     @nf_trace: netfilter packet trace flag
 #ifdef CONFIG_NET_CLS_ACT
        __u8                    tc_skip_classify:1;
        __u8                    tc_at_ingress:1;
-       __u8                    tc_from:2;
+       __u8                    tc_redirected:1;
+       __u8                    tc_from_ingress:1;
 #endif
 
 #ifdef CONFIG_NET_SCHED
 
 static inline void skb_reset_tc(struct sk_buff *skb)
 {
 #ifdef CONFIG_NET_CLS_ACT
-       skb->tc_from = 0;
+       skb->tc_redirected = 0;
 #endif
 }
 
 
 #include <linux/types.h>
 #include <linux/pkt_sched.h>
 
-#ifdef __KERNEL__
-#define AT_STACK       0x0
-#define AT_INGRESS     0x1
-#define AT_EGRESS      0x2
-#endif
-
 /* Action attributes */
 enum {
        TCA_ACT_UNSPEC,
 
        }
 
        /* mirror is always swallowed */
-       if (tcf_mirred_is_act_redirect(m_eaction))
-               skb2->tc_from = skb_at_tc_ingress(skb) ? AT_INGRESS : AT_EGRESS;
+       if (tcf_mirred_is_act_redirect(m_eaction)) {
+               skb2->tc_redirected = 1;
+               skb2->tc_from_ingress = skb2->tc_at_ingress;
+       }
 
        skb2->skb_iif = skb->dev->ifindex;
        skb2->dev = dev;
 
                         * If it's at ingress let's pretend the delay is
                         * from the network (tstamp will be updated).
                         */
-                       if (skb->tc_from & AT_INGRESS)
+                       if (skb->tc_redirected && skb->tc_from_ingress)
                                skb->tstamp = 0;
 #endif