qpolicy.c (0a68a20cc3eafa73bb54097c28b921147d7d3685) | qpolicy.c (871a2c16c21b988688b4ab1a78eadd969765c0a3) |
---|---|
1/* 2 * net/dccp/qpolicy.c 3 * 4 * Policy-based packet dequeueing interface for DCCP. 5 * 6 * Copyright (c) 2008 Tomasz Grobelny <tomasz@grobelny.oswiecenia.net> 7 * 8 * This program is free software; you can redistribute it and/or --- 59 unchanged lines hidden (view full) --- 68 * @push: add a new @skb to the write queue 69 * @full: indicates that no more packets will be admitted 70 * @top: peeks at whatever the queueing policy defines as its `top' 71 */ 72static struct dccp_qpolicy_operations { 73 void (*push) (struct sock *sk, struct sk_buff *skb); 74 bool (*full) (struct sock *sk); 75 struct sk_buff* (*top) (struct sock *sk); | 1/* 2 * net/dccp/qpolicy.c 3 * 4 * Policy-based packet dequeueing interface for DCCP. 5 * 6 * Copyright (c) 2008 Tomasz Grobelny <tomasz@grobelny.oswiecenia.net> 7 * 8 * This program is free software; you can redistribute it and/or --- 59 unchanged lines hidden (view full) --- 68 * @push: add a new @skb to the write queue 69 * @full: indicates that no more packets will be admitted 70 * @top: peeks at whatever the queueing policy defines as its `top' 71 */ 72static struct dccp_qpolicy_operations { 73 void (*push) (struct sock *sk, struct sk_buff *skb); 74 bool (*full) (struct sock *sk); 75 struct sk_buff* (*top) (struct sock *sk); |
76 __be32 params; | |
77 78} qpol_table[DCCPQ_POLICY_MAX] = { 79 [DCCPQ_POLICY_SIMPLE] = { | 76 77} qpol_table[DCCPQ_POLICY_MAX] = { 78 [DCCPQ_POLICY_SIMPLE] = { |
80 .push = qpolicy_simple_push, 81 .full = qpolicy_simple_full, 82 .top = qpolicy_simple_top, 83 .params = 0, | 79 .push = qpolicy_simple_push, 80 .full = qpolicy_simple_full, 81 .top = qpolicy_simple_top, |
84 }, 85 [DCCPQ_POLICY_PRIO] = { | 82 }, 83 [DCCPQ_POLICY_PRIO] = { |
86 .push = qpolicy_simple_push, 87 .full = qpolicy_prio_full, 88 .top = qpolicy_prio_best_skb, 89 .params = DCCP_SCM_PRIORITY, | 84 .push = qpolicy_simple_push, 85 .full = qpolicy_prio_full, 86 .top = qpolicy_prio_best_skb, |
90 }, 91}; 92 93/* 94 * Externally visible interface 95 */ 96void dccp_qpolicy_push(struct sock *sk, struct sk_buff *skb) 97{ --- 17 unchanged lines hidden (view full) --- 115{ 116 return qpol_table[dccp_sk(sk)->dccps_qpolicy].top(sk); 117} 118 119struct sk_buff *dccp_qpolicy_pop(struct sock *sk) 120{ 121 struct sk_buff *skb = dccp_qpolicy_top(sk); 122 | 87 }, 88}; 89 90/* 91 * Externally visible interface 92 */ 93void dccp_qpolicy_push(struct sock *sk, struct sk_buff *skb) 94{ --- 17 unchanged lines hidden (view full) --- 112{ 113 return qpol_table[dccp_sk(sk)->dccps_qpolicy].top(sk); 114} 115 116struct sk_buff *dccp_qpolicy_pop(struct sock *sk) 117{ 118 struct sk_buff *skb = dccp_qpolicy_top(sk); 119 |
123 /* Clear any skb fields that we used internally */ 124 skb->priority = 0; 125 126 if (skb) | 120 if (skb != NULL) { 121 /* Clear any skb fields that we used internally */ 122 skb->priority = 0; |
127 skb_unlink(skb, &sk->sk_write_queue); | 123 skb_unlink(skb, &sk->sk_write_queue); |
124 } |
|
128 return skb; 129} | 125 return skb; 126} |
130 131bool dccp_qpolicy_param_ok(struct sock *sk, __be32 param) 132{ 133 /* check if exactly one bit is set */ 134 if (!param || (param & (param - 1))) 135 return false; 136 return (qpol_table[dccp_sk(sk)->dccps_qpolicy].params & param) == param; 137} | |