Commit d14d2b20 authored by Vedang Patel's avatar Vedang Patel Committed by David S. Miller

etf: Add skip_sock_check

Currently, etf expects a socket with SO_TXTIME option set for each packet
it encounters. So, it will drop all other packets. But, in the future
commits we are planning to add functionality where tstamp value will be set
by another qdisc. Also, some packets which are generated from within the
kernel (e.g. ICMP packets) do not have any socket associated with them.

So, this commit adds support for skip_sock_check. When this option is set,
etf will skip checking for a socket and other associated options for all
skbs.
Signed-off-by: default avatarVedang Patel <vedang.patel@intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 9903c8dc
...@@ -990,6 +990,7 @@ struct tc_etf_qopt { ...@@ -990,6 +990,7 @@ struct tc_etf_qopt {
__u32 flags; __u32 flags;
#define TC_ETF_DEADLINE_MODE_ON _BITUL(0) #define TC_ETF_DEADLINE_MODE_ON _BITUL(0)
#define TC_ETF_OFFLOAD_ON _BITUL(1) #define TC_ETF_OFFLOAD_ON _BITUL(1)
#define TC_ETF_SKIP_SOCK_CHECK _BITUL(2)
}; };
enum { enum {
......
...@@ -22,10 +22,12 @@ ...@@ -22,10 +22,12 @@
#define DEADLINE_MODE_IS_ON(x) ((x)->flags & TC_ETF_DEADLINE_MODE_ON) #define DEADLINE_MODE_IS_ON(x) ((x)->flags & TC_ETF_DEADLINE_MODE_ON)
#define OFFLOAD_IS_ON(x) ((x)->flags & TC_ETF_OFFLOAD_ON) #define OFFLOAD_IS_ON(x) ((x)->flags & TC_ETF_OFFLOAD_ON)
#define SKIP_SOCK_CHECK_IS_SET(x) ((x)->flags & TC_ETF_SKIP_SOCK_CHECK)
struct etf_sched_data { struct etf_sched_data {
bool offload; bool offload;
bool deadline_mode; bool deadline_mode;
bool skip_sock_check;
int clockid; int clockid;
int queue; int queue;
s32 delta; /* in ns */ s32 delta; /* in ns */
...@@ -77,6 +79,9 @@ static bool is_packet_valid(struct Qdisc *sch, struct sk_buff *nskb) ...@@ -77,6 +79,9 @@ static bool is_packet_valid(struct Qdisc *sch, struct sk_buff *nskb)
struct sock *sk = nskb->sk; struct sock *sk = nskb->sk;
ktime_t now; ktime_t now;
if (q->skip_sock_check)
goto skip;
if (!sk) if (!sk)
return false; return false;
...@@ -92,6 +97,7 @@ static bool is_packet_valid(struct Qdisc *sch, struct sk_buff *nskb) ...@@ -92,6 +97,7 @@ static bool is_packet_valid(struct Qdisc *sch, struct sk_buff *nskb)
if (sk->sk_txtime_deadline_mode != q->deadline_mode) if (sk->sk_txtime_deadline_mode != q->deadline_mode)
return false; return false;
skip:
now = q->get_time(); now = q->get_time();
if (ktime_before(txtime, now) || ktime_before(txtime, q->last)) if (ktime_before(txtime, now) || ktime_before(txtime, q->last))
return false; return false;
...@@ -385,6 +391,7 @@ static int etf_init(struct Qdisc *sch, struct nlattr *opt, ...@@ -385,6 +391,7 @@ static int etf_init(struct Qdisc *sch, struct nlattr *opt,
q->clockid = qopt->clockid; q->clockid = qopt->clockid;
q->offload = OFFLOAD_IS_ON(qopt); q->offload = OFFLOAD_IS_ON(qopt);
q->deadline_mode = DEADLINE_MODE_IS_ON(qopt); q->deadline_mode = DEADLINE_MODE_IS_ON(qopt);
q->skip_sock_check = SKIP_SOCK_CHECK_IS_SET(qopt);
switch (q->clockid) { switch (q->clockid) {
case CLOCK_REALTIME: case CLOCK_REALTIME:
...@@ -473,6 +480,9 @@ static int etf_dump(struct Qdisc *sch, struct sk_buff *skb) ...@@ -473,6 +480,9 @@ static int etf_dump(struct Qdisc *sch, struct sk_buff *skb)
if (q->deadline_mode) if (q->deadline_mode)
opt.flags |= TC_ETF_DEADLINE_MODE_ON; opt.flags |= TC_ETF_DEADLINE_MODE_ON;
if (q->skip_sock_check)
opt.flags |= TC_ETF_SKIP_SOCK_CHECK;
if (nla_put(skb, TCA_ETF_PARMS, sizeof(opt), &opt)) if (nla_put(skb, TCA_ETF_PARMS, sizeof(opt), &opt))
goto nla_put_failure; goto nla_put_failure;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment