Skip to content

Commit e50424e

Browse files
committed
Add dontfrag parameter to babel_send.
1 parent ef3eb65 commit e50424e

File tree

3 files changed

+16
-3
lines changed

3 files changed

+16
-3
lines changed

message.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1152,7 +1152,7 @@ flushbuf(struct buffered *buf, struct interface *ifp)
11521152
packet_header, sizeof(packet_header),
11531153
buf->buf, end,
11541154
(struct sockaddr*)&buf->sin6,
1155-
sizeof(buf->sin6));
1155+
sizeof(buf->sin6), 0);
11561156
if(rc < 0)
11571157
perror("send");
11581158
}

net.c

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,10 +173,12 @@ babel_recv(int s, void *buf, int buflen, struct sockaddr *sin, int slen,
173173
int
174174
babel_send(int s,
175175
const void *buf1, int buflen1, const void *buf2, int buflen2,
176-
const struct sockaddr *sin, int slen)
176+
const struct sockaddr *sin, int slen, int dontfrag)
177177
{
178178
struct iovec iovec[2];
179179
struct msghdr msg;
180+
int one = 1;
181+
unsigned char cmsgbuf[CMSG_SPACE(sizeof(one))];
180182
int rc, count = 0;
181183

182184
iovec[0].iov_base = (void*)buf1;
@@ -188,6 +190,17 @@ babel_send(int s,
188190
msg.msg_namelen = slen;
189191
msg.msg_iov = iovec;
190192
msg.msg_iovlen = 2;
193+
if(dontfrag) {
194+
struct cmsghdr *cmsg;
195+
msg.msg_control = cmsgbuf;
196+
msg.msg_controllen = sizeof(cmsgbuf);
197+
cmsg = CMSG_FIRSTHDR(&msg);
198+
cmsg->cmsg_level = IPPROTO_IPV6;
199+
cmsg->cmsg_type = IPV6_DONTFRAG;;
200+
cmsg->cmsg_len = CMSG_LEN(sizeof(one));
201+
memcpy(CMSG_DATA(cmsg), &one, sizeof(one));
202+
msg.msg_controllen = cmsg->cmsg_len;
203+
}
191204

192205
/* The Linux kernel can apparently keep returning EAGAIN indefinitely. */
193206

net.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,6 @@ int babel_recv(int s, void *buf, int buflen, struct sockaddr *sin, int slen,
2525
unsigned char *src_return);
2626
int babel_send(int s,
2727
const void *buf1, int buflen1, const void *buf2, int buflen2,
28-
const struct sockaddr *sin, int slen);
28+
const struct sockaddr *sin, int slen, int dontfrag);
2929
int tcp_server_socket(int port, int local);
3030
int unix_server_socket(const char *path);

0 commit comments

Comments
 (0)