forked from mirrors/linux
		
	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; | ||||
| 	struct ip_options_rcu	*opt; | ||||
| 	__u8			tx_flags; | ||||
| 	__u8			ttl; | ||||
| 	__s16			tos; | ||||
| 	char			priority; | ||||
| }; | ||||
| 
 | ||||
| #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 err; | ||||
| 	int err, val; | ||||
| 	struct cmsghdr *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; | ||||
| 			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: | ||||
| 			return -EINVAL; | ||||
| 		} | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Francesco Fusco
						Francesco Fusco