u8      dcbx;
 };
 
+u16 dcb_getrewr(struct net_device *dev, struct dcb_app *app);
+int dcb_setrewr(struct net_device *dev, struct dcb_app *app);
+int dcb_delrewr(struct net_device *dev, struct dcb_app *app);
+
 int dcb_setapp(struct net_device *, struct dcb_app *);
 u8 dcb_getapp(struct net_device *, struct dcb_app *);
 int dcb_ieee_setapp(struct net_device *, struct dcb_app *);
        /* apptrust */
        int (*dcbnl_setapptrust)(struct net_device *, u8 *, int);
        int (*dcbnl_getapptrust)(struct net_device *, u8 *, int *);
+
+       /* rewrite */
+       int (*dcbnl_setrewr)(struct net_device *dev, struct dcb_app *app);
+       int (*dcbnl_delrewr)(struct net_device *dev, struct dcb_app *app);
 };
 
 #endif /* __NET_DCBNL_H__ */
 
 };
 
 static LIST_HEAD(dcb_app_list);
+static LIST_HEAD(dcb_rewr_list);
 static DEFINE_SPINLOCK(dcb_lock);
 
 static enum ieee_attrs_app dcbnl_app_attr_type_get(u8 selector)
 static int dcbnl_ieee_fill(struct sk_buff *skb, struct net_device *netdev)
 {
        const struct dcbnl_rtnl_ops *ops = netdev->dcbnl_ops;
-       struct nlattr *ieee, *app;
+       struct nlattr *ieee, *app, *rewr;
        struct dcb_app_type *itr;
        int dcbx;
        int err;
        spin_unlock_bh(&dcb_lock);
        nla_nest_end(skb, app);
 
+       rewr = nla_nest_start(skb, DCB_ATTR_DCB_REWR_TABLE);
+       if (!rewr)
+               return -EMSGSIZE;
+
+       spin_lock_bh(&dcb_lock);
+       list_for_each_entry(itr, &dcb_rewr_list, list) {
+               if (itr->ifindex == netdev->ifindex) {
+                       enum ieee_attrs_app type =
+                               dcbnl_app_attr_type_get(itr->app.selector);
+                       err = nla_put(skb, type, sizeof(itr->app), &itr->app);
+                       if (err) {
+                               spin_unlock_bh(&dcb_lock);
+                               nla_nest_cancel(skb, rewr);
+                               return -EMSGSIZE;
+                       }
+               }
+       }
+
+       spin_unlock_bh(&dcb_lock);
+       nla_nest_end(skb, rewr);
+
        if (ops->dcbnl_getapptrust) {
                err = dcbnl_getapptrust(netdev, skb);
                if (err)
                        goto err;
        }
 
+       if (ieee[DCB_ATTR_DCB_REWR_TABLE]) {
+               err = dcbnl_app_table_setdel(ieee[DCB_ATTR_DCB_REWR_TABLE],
+                                            netdev,
+                                            ops->dcbnl_setrewr ?: dcb_setrewr);
+               if (err)
+                       goto err;
+       }
+
        if (ieee[DCB_ATTR_IEEE_APP_TABLE]) {
                err = dcbnl_app_table_setdel(ieee[DCB_ATTR_IEEE_APP_TABLE],
                                             netdev, ops->ieee_setapp ?:
                        goto err;
        }
 
+       if (ieee[DCB_ATTR_DCB_REWR_TABLE]) {
+               err = dcbnl_app_table_setdel(ieee[DCB_ATTR_DCB_REWR_TABLE],
+                                            netdev,
+                                            ops->dcbnl_delrewr ?: dcb_delrewr);
+               if (err)
+                       goto err;
+       }
+
 err:
        err = nla_put_u8(skb, DCB_ATTR_IEEE, err);
        dcbnl_ieee_notify(netdev, RTM_SETDCB, DCB_CMD_IEEE_DEL, seq, 0);
        return ret;
 }
 
+static struct dcb_app_type *dcb_rewr_lookup(const struct dcb_app *app,
+                                           int ifindex, int proto)
+{
+       struct dcb_app_type *itr;
+
+       list_for_each_entry(itr, &dcb_rewr_list, list) {
+               if (itr->app.selector == app->selector &&
+                   itr->app.priority == app->priority &&
+                   itr->ifindex == ifindex &&
+                   ((proto == -1) || itr->app.protocol == proto))
+                       return itr;
+       }
+
+       return NULL;
+}
+
 static struct dcb_app_type *dcb_app_lookup(const struct dcb_app *app,
                                           int ifindex, int prio)
 {
 }
 EXPORT_SYMBOL(dcb_ieee_getapp_mask);
 
+/* Get protocol value from rewrite entry. */
+u16 dcb_getrewr(struct net_device *dev, struct dcb_app *app)
+{
+       struct dcb_app_type *itr;
+       u16 proto = 0;
+
+       spin_lock_bh(&dcb_lock);
+       itr = dcb_rewr_lookup(app, dev->ifindex, -1);
+       if (itr)
+               proto = itr->app.protocol;
+       spin_unlock_bh(&dcb_lock);
+
+       return proto;
+}
+EXPORT_SYMBOL(dcb_getrewr);
+
+ /* Add rewrite entry to the rewrite list. */
+int dcb_setrewr(struct net_device *dev, struct dcb_app *new)
+{
+       int err;
+
+       spin_lock_bh(&dcb_lock);
+       /* Search for existing match and abort if found. */
+       if (dcb_rewr_lookup(new, dev->ifindex, new->protocol)) {
+               err = -EEXIST;
+               goto out;
+       }
+
+       err = dcb_app_add(&dcb_rewr_list, new, dev->ifindex);
+out:
+       spin_unlock_bh(&dcb_lock);
+
+       return err;
+}
+EXPORT_SYMBOL(dcb_setrewr);
+
+/* Delete rewrite entry from the rewrite list. */
+int dcb_delrewr(struct net_device *dev, struct dcb_app *del)
+{
+       struct dcb_app_type *itr;
+       int err = -ENOENT;
+
+       spin_lock_bh(&dcb_lock);
+       /* Search for existing match and remove it. */
+       itr = dcb_rewr_lookup(del, dev->ifindex, del->protocol);
+       if (itr) {
+               list_del(&itr->list);
+               kfree(itr);
+               err = 0;
+       }
+
+       spin_unlock_bh(&dcb_lock);
+
+       return err;
+}
+EXPORT_SYMBOL(dcb_delrewr);
+
 /**
  * dcb_ieee_setapp - add IEEE dcb application data to app list
  * @dev: network interface