aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrancesco Fusco <ffusco@redhat.com>2013-09-24 09:43:08 -0400
committerDavid S. Miller <davem@davemloft.net>2013-09-28 18:21:51 -0400
commitf02db315b8d888570cb0d4496cfbb7e4acb047cb (patch)
treee7ab8fcd05f0ba442a6eb3914ff4c894611a97a6
parentf0e28d48c8641beac1239e484383c2b4764b1f02 (diff)
ipv4: IP_TOS and IP_TTL can be specified as ancillary data
This patch enables the IP_TTL and IP_TOS values passed from userspace to be stored in the ipcm_cookie struct. Three fields are added to the struct: - the TTL, expressed as __u8. The allowed values are in the [1-255]. A value of 0 means that the TTL is not specified. - the TOS, expressed as __s16. The allowed values are in the range [0,255]. A value of -1 means that the TOS is not specified. - the priority, expressed as a char and computed when handling the ancillary data. Signed-off-by: Francesco Fusco <ffusco@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--include/net/ip.h3
-rw-r--r--net/ipv4/ip_sockglue.c20
2 files changed, 22 insertions, 1 deletions
diff --git a/include/net/ip.h b/include/net/ip.h
index c1f192b8cd0e..0135f3823e66 100644
--- a/include/net/ip.h
+++ b/include/net/ip.h
@@ -56,6 +56,9 @@ struct ipcm_cookie {
56 int oif; 56 int oif;
57 struct ip_options_rcu *opt; 57 struct ip_options_rcu *opt;
58 __u8 tx_flags; 58 __u8 tx_flags;
59 __u8 ttl;
60 __s16 tos;
61 char priority;
59}; 62};
60 63
61#define IPCB(skb) ((struct inet_skb_parm*)((skb)->cb)) 64#define IPCB(skb) ((struct inet_skb_parm*)((skb)->cb))
diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c
index d9c4f113d709..56e34457ac07 100644
--- a/net/ipv4/ip_sockglue.c
+++ b/net/ipv4/ip_sockglue.c
@@ -189,7 +189,7 @@ EXPORT_SYMBOL(ip_cmsg_recv);
189 189
190int ip_cmsg_send(struct net *net, struct msghdr *msg, struct ipcm_cookie *ipc) 190int ip_cmsg_send(struct net *net, struct msghdr *msg, struct ipcm_cookie *ipc)
191{ 191{
192 int err; 192 int err, val;
193 struct cmsghdr *cmsg; 193 struct cmsghdr *cmsg;
194 194
195 for (cmsg = CMSG_FIRSTHDR(msg); cmsg; cmsg = CMSG_NXTHDR(msg, cmsg)) { 195 for (cmsg = CMSG_FIRSTHDR(msg); cmsg; cmsg = CMSG_NXTHDR(msg, cmsg)) {
@@ -215,6 +215,24 @@ int ip_cmsg_send(struct net *net, struct msghdr *msg, struct ipcm_cookie *ipc)
215 ipc->addr = info->ipi_spec_dst.s_addr; 215 ipc->addr = info->ipi_spec_dst.s_addr;
216 break; 216 break;
217 } 217 }
218 case IP_TTL:
219 if (cmsg->cmsg_len != CMSG_LEN(sizeof(int)))
220 return -EINVAL;
221 val = *(int *)CMSG_DATA(cmsg);
222 if (val < 1 || val > 255)
223 return -EINVAL;
224 ipc->ttl = val;
225 break;
226 case IP_TOS:
227 if (cmsg->cmsg_len != CMSG_LEN(sizeof(int)))
228 return -EINVAL;
229 val = *(int *)CMSG_DATA(cmsg);
230 if (val < 0 || val > 255)
231 return -EINVAL;
232 ipc->tos = val;
233 ipc->priority = rt_tos2priority(ipc->tos);
234 break;
235
218 default: 236 default:
219 return -EINVAL; 237 return -EINVAL;
220 } 238 }