get_flow_label
allocates
private flow label.
int get_flow_label(int fd, struct sockaddr_in6 *dst, __u32 fl) { int on = 1; struct in6_flowlabel_req freq; memset(&freq, 0, sizeof(freq)); freq.flr_label = htonl(fl); freq.flr_action = IPV6_FL_A_GET; freq.flr_flags = IPV6_FL_F_CREATE | IPV6_FL_F_EXCL; freq.flr_share = IPV6_FL_S_EXCL; memcpy(&freq.flr_dst, &dst->sin6_addr, 16); if (setsockopt(fd, SOL_IPV6, IPV6_FLOWLABEL_MGR, &freq, sizeof(freq)) == -1) { perror ("can't lease flowlabel"); return -1; } dst->sin6_flowinfo |= freq.flr_label; if (setsockopt(fd, SOL_IPV6, IPV6_FLOWINFO_SEND, &on, sizeof(on)) == -1) { perror ("can't send flowinfo"); freq.flr_action = IPV6_FL_A_PUT; setsockopt(fd, SOL_IPV6, IPV6_FLOWLABEL_MGR, &freq, sizeof(freq)); return -1; } return 0; }
A bit more complicated example using routing header can be found
in ping6
utility (iputils
package). Linux rsvpd backend
contains an example of using operation IPV6_FL_A_RENEW
.