Add a cmsg of type IP_TOS for UDP/IPv4 sockets to specify the TOS byte.

MFC after: 3 days
This commit is contained in:
Michael Tuexen 2012-06-12 14:56:08 +00:00
parent 0ca5e953e7
commit f584d74b4d
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=236961

View File

@ -956,6 +956,7 @@ udp_output(struct inpcb *inp, struct mbuf *m, struct sockaddr *addr,
int ipflags;
u_short fport, lport;
int unlock_udbinfo;
u_char tos;
/*
* udp_output() may need to temporarily bind or connect the current
@ -972,6 +973,7 @@ udp_output(struct inpcb *inp, struct mbuf *m, struct sockaddr *addr,
src.sin_family = 0;
INP_RLOCK(inp);
tos = inp->inp_ip_tos;
if (control != NULL) {
/*
* XXX: Currently, we assume all the optional information is
@ -1010,6 +1012,14 @@ udp_output(struct inpcb *inp, struct mbuf *m, struct sockaddr *addr,
*(struct in_addr *)CMSG_DATA(cm);
break;
case IP_TOS:
if (cm->cmsg_len != CMSG_LEN(sizeof(u_char))) {
error = EINVAL;
break;
}
tos = *(u_char *)CMSG_DATA(cm);
break;
default:
error = ENOPROTOOPT;
break;
@ -1225,7 +1235,7 @@ udp_output(struct inpcb *inp, struct mbuf *m, struct sockaddr *addr,
ui->ui_sum = 0;
((struct ip *)ui)->ip_len = sizeof (struct udpiphdr) + len;
((struct ip *)ui)->ip_ttl = inp->inp_ip_ttl; /* XXX */
((struct ip *)ui)->ip_tos = inp->inp_ip_tos; /* XXX */
((struct ip *)ui)->ip_tos = tos; /* XXX */
UDPSTAT_INC(udps_opackets);
if (unlock_udbinfo == UH_WLOCKED)