kengo sakai wrote: > Hi, > > I am tring to set a flow label in IPv6 TCP message which TCP server send. > I could set a flow label in IPv6 TCP message which TCP client send. > Does anyone know how to set a flow label in IPv6 TCP server? > > There seems to be no documentation available about IPv6 flow lable in Linux. > > Attached you can find my simple TCP server program, which does not compile. > Of course I don't expect you to debug my code, > but I suppose it may be helpful. > > Regards, > Kengo > > // tcpserver6.c > #include <sys/types.h> > #include <sys/socket.h> > #include <netdb.h> > #include <string.h> > #include <unistd.h> > #include <stdio.h> > #include <stdlib.h> > #include <errno.h> > > #define BACKLOG 5 > #define PORT "12345" > > int tcp_listen(const char* service) { > int err; > struct addrinfo hints; > struct addrinfo* res = NULL; > struct addrinfo* ai; > int sockfd; > > memset(&hints, 0, sizeof(hints)); > hints.ai_family = AF_INET6; > hints.ai_socktype = SOCK_STREAM; > hints.ai_flags = AI_PASSIVE; > > err = getaddrinfo(NULL, service, &hints, &res); > if (err != 0) { > printf("getaddrinfo(): %s\n", gai_strerror(err)); > return -1; > } > > ai = res; > sockfd = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); > if (sockfd < 0) > return -1; > > if (bind(sockfd, ai->ai_addr, ai->ai_addrlen) < 0) > return -1; > > if (listen(sockfd, BACKLOG) < 0) > return -1; > > freeaddrinfo(res); > return sockfd; > } > > int main() { > int sockfd; > > sockfd = tcp_listen(PORT); > if (sockfd < 0) { > perror("server"); > exit(1); > } > > printf("wait...\n"); > > while (1) { > int cs; > struct sockaddr_storage sa; > socklen_t len = sizeof(sa); > cs = accept(sockfd, (struct sockaddr*) &sa, &len); > if (cs < 0) { > if (errno == EINTR) > continue; > perror("accept"); > exit(1); > } > > printf("accepted.\n"); > > char ch; > > (void)set_flow_label(cs, &sa); > read(cs, &ch, 1); > write(cs, &ch, 1); // I expect that the flowlabel is set to the packet. > > close(cs); > } > return 0; > } > // tcpserver6.c end > > // flowlabel.c > #include <sys/socket.h> > #include <linux/in.h> > #include <linux/in6.h> > #include <string.h> > #include <stdio.h> > #include <errno.h> > > int set_flow_label(int sock, struct sockaddr_in6 *addr) > { > char freq_buf[sizeof(struct in6_flowlabel_req)]; > struct in6_flowlabel_req *freq = (struct in6_flowlabel_req *)freq_buf; > int freq_len = sizeof(*freq); > int on = 1; > > if (setsockopt(sock, IPPROTO_IPV6, IPV6_FLOWINFO_SEND, > &on, sizeof(on)) == -1) { > printf("setsockopt: %s\n", strerror(errno)); > return 1; > } > > memset(freq, 0, sizeof(*freq)); > freq->flr_label = 0; > freq->flr_action = IPV6_FL_A_GET; > freq->flr_flags = IPV6_FL_F_CREATE; > freq->flr_share = IPV6_FL_S_EXCL; > memcpy(&freq->flr_dst, &addr->sin6_addr, 16); > if (setsockopt(sock, IPPROTO_IPV6, IPV6_FLOWLABEL_MGR, freq, freq_len) > == -1) { > printf("setsockopt: %s\n", strerror(errno)); > return 1; > } > return 0; > } > // flowlabel.c end > -- > To unsubscribe from this list: send the line "unsubscribe linux-net" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html > > It compiled just fine, without edits, for me. LDB -- To unsubscribe from this list: send the line "unsubscribe linux-net" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html