Author: tuexen
Date: Tue Jun 12 14:56:08 2012
New Revision: 236961
URL: http://svn.freebsd.org/changeset/base/236961

Log:
  Add a cmsg of type IP_TOS for UDP/IPv4 sockets to specify the TOS byte.
  
  MFC after: 3 days

Modified:
  head/sys/netinet/udp_usrreq.c

Modified: head/sys/netinet/udp_usrreq.c
==============================================================================
--- head/sys/netinet/udp_usrreq.c       Tue Jun 12 14:40:19 2012        
(r236960)
+++ head/sys/netinet/udp_usrreq.c       Tue Jun 12 14:56:08 2012        
(r236961)
@@ -956,6 +956,7 @@ udp_output(struct inpcb *inp, struct mbu
        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 mbu
 
        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 mbu
                                    *(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 mbu
                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)
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to