mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	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>
This commit is contained in:
		
							parent
							
								
									f0e28d48c8
								
							
						
					
					
						commit
						f02db315b8
					
				
					 2 changed files with 22 additions and 1 deletions
				
			
		| 
						 | 
					@ -56,6 +56,9 @@ struct ipcm_cookie {
 | 
				
			||||||
	int			oif;
 | 
						int			oif;
 | 
				
			||||||
	struct ip_options_rcu	*opt;
 | 
						struct ip_options_rcu	*opt;
 | 
				
			||||||
	__u8			tx_flags;
 | 
						__u8			tx_flags;
 | 
				
			||||||
 | 
						__u8			ttl;
 | 
				
			||||||
 | 
						__s16			tos;
 | 
				
			||||||
 | 
						char			priority;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define IPCB(skb) ((struct inet_skb_parm*)((skb)->cb))
 | 
					#define IPCB(skb) ((struct inet_skb_parm*)((skb)->cb))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -189,7 +189,7 @@ EXPORT_SYMBOL(ip_cmsg_recv);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int ip_cmsg_send(struct net *net, struct msghdr *msg, struct ipcm_cookie *ipc)
 | 
					int ip_cmsg_send(struct net *net, struct msghdr *msg, struct ipcm_cookie *ipc)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int err;
 | 
						int err, val;
 | 
				
			||||||
	struct cmsghdr *cmsg;
 | 
						struct cmsghdr *cmsg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (cmsg = CMSG_FIRSTHDR(msg); cmsg; cmsg = CMSG_NXTHDR(msg, cmsg)) {
 | 
						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)
 | 
				
			||||||
			ipc->addr = info->ipi_spec_dst.s_addr;
 | 
								ipc->addr = info->ipi_spec_dst.s_addr;
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							case IP_TTL:
 | 
				
			||||||
 | 
								if (cmsg->cmsg_len != CMSG_LEN(sizeof(int)))
 | 
				
			||||||
 | 
									return -EINVAL;
 | 
				
			||||||
 | 
								val = *(int *)CMSG_DATA(cmsg);
 | 
				
			||||||
 | 
								if (val < 1 || val > 255)
 | 
				
			||||||
 | 
									return -EINVAL;
 | 
				
			||||||
 | 
								ipc->ttl = val;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case IP_TOS:
 | 
				
			||||||
 | 
								if (cmsg->cmsg_len != CMSG_LEN(sizeof(int)))
 | 
				
			||||||
 | 
									return -EINVAL;
 | 
				
			||||||
 | 
								val = *(int *)CMSG_DATA(cmsg);
 | 
				
			||||||
 | 
								if (val < 0 || val > 255)
 | 
				
			||||||
 | 
									return -EINVAL;
 | 
				
			||||||
 | 
								ipc->tos = val;
 | 
				
			||||||
 | 
								ipc->priority = rt_tos2priority(ipc->tos);
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		default:
 | 
							default:
 | 
				
			||||||
			return -EINVAL;
 | 
								return -EINVAL;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue