- i = sendto(s, (char *)packet, cc, 0, (struct sockaddr *)&whereto,
- sizeof(whereto));
-
+ if (how_traffic_class == 2) {
+ struct msghdr msg;
+ struct iovec iov;
+ char *cmbuf[CMSG_SPACE(sizeof(int))];
+ struct cmsghdr *cm = (struct cmsghdr *)cmbuf;
+
+ msg.msg_name = &whereto;
+ msg.msg_namelen = sizeof(whereto);
+
+ iov.iov_base = packet;
+ iov.iov_len = cc;
+ msg.msg_iov = &iov;
+ msg.msg_iovlen = 1;
+
+ cm->cmsg_len = CMSG_LEN(sizeof(int));
+ cm->cmsg_level = SOL_SOCKET;
+ cm->cmsg_type = SO_TRAFFIC_CLASS;
+ *(int *)CMSG_DATA(cm) = traffic_class;
+ msg.msg_control = cm;
+ msg.msg_controllen = CMSG_SPACE(sizeof(int));
+
+ msg.msg_flags = 0;
+
+ i = sendmsg(s, &msg, 0);
+ } else {
+ i = sendto(s, (char *)packet, cc, 0, (struct sockaddr *)&whereto,
+ sizeof(whereto));
+ }