Merge pull request #4371 from manuhalo/fix_isisd_large_mtu

isisd: support circuits with mtu > 8192
This commit is contained in:
Olivier Dugeon 2019-05-28 17:40:39 +02:00 committed by GitHub
commit 15636d0efe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -73,7 +73,6 @@ uint8_t ALL_ISS[6] = {0x09, 0x00, 0x2B, 0x00, 0x00, 0x05};
uint8_t ALL_ESS[6] = {0x09, 0x00, 0x2B, 0x00, 0x00, 0x04}; uint8_t ALL_ESS[6] = {0x09, 0x00, 0x2B, 0x00, 0x00, 0x04};
static uint8_t discard_buff[8192]; static uint8_t discard_buff[8192];
static uint8_t sock_buff[8192];
/* /*
* if level is 0 we are joining p2p multicast * if level is 0 we are joining p2p multicast
@ -277,19 +276,22 @@ int isis_recv_pdu_bcast(struct isis_circuit *circuit, uint8_t *ssnpa)
return ISIS_WARNING; return ISIS_WARNING;
} }
/* on lan we have to read to the static buff first */ /* Ensure that we have enough space for a pdu padded to fill the mtu */
bytesread = recvfrom(circuit->fd, sock_buff, sizeof(sock_buff), unsigned int max_size =
MSG_DONTWAIT, (struct sockaddr *)&s_addr, circuit->interface->mtu > circuit->interface->mtu6
(socklen_t *)&addr_len); ? circuit->interface->mtu
: circuit->interface->mtu6;
uint8_t temp_buff[max_size];
bytesread =
recvfrom(circuit->fd, temp_buff, max_size, MSG_DONTWAIT,
(struct sockaddr *)&s_addr, (socklen_t *)&addr_len);
if (bytesread < 0) { if (bytesread < 0) {
zlog_warn("isis_recv_pdu_bcast(): recvfrom() failed"); zlog_warn("%s: recvfrom() failed", __func__);
return ISIS_WARNING; return ISIS_WARNING;
} }
/* then we lose the LLC */ /* then we lose the LLC */
stream_write(circuit->rcv_stream, sock_buff + LLC_LEN, stream_write(circuit->rcv_stream, temp_buff + LLC_LEN,
bytesread - LLC_LEN); bytesread - LLC_LEN);
memcpy(ssnpa, &s_addr.sll_addr, s_addr.sll_halen); memcpy(ssnpa, &s_addr.sll_addr, s_addr.sll_halen);
return ISIS_OK; return ISIS_OK;
@ -337,6 +339,7 @@ int isis_send_pdu_bcast(struct isis_circuit *circuit, int level)
{ {
struct msghdr msg; struct msghdr msg;
struct iovec iov[2]; struct iovec iov[2];
char temp_buff[LLC_LEN];
/* we need to do the LLC in here because of P2P circuits, which will /* we need to do the LLC in here because of P2P circuits, which will
* not need it * not need it
@ -361,16 +364,16 @@ int isis_send_pdu_bcast(struct isis_circuit *circuit, int level)
/* on a broadcast circuit */ /* on a broadcast circuit */
/* first we put the LLC in */ /* first we put the LLC in */
sock_buff[0] = 0xFE; temp_buff[0] = 0xFE;
sock_buff[1] = 0xFE; temp_buff[1] = 0xFE;
sock_buff[2] = 0x03; temp_buff[2] = 0x03;
memset(&msg, 0, sizeof(msg)); memset(&msg, 0, sizeof(msg));
msg.msg_name = &sa; msg.msg_name = &sa;
msg.msg_namelen = sizeof(struct sockaddr_ll); msg.msg_namelen = sizeof(struct sockaddr_ll);
msg.msg_iov = iov; msg.msg_iov = iov;
msg.msg_iovlen = 2; msg.msg_iovlen = 2;
iov[0].iov_base = sock_buff; iov[0].iov_base = temp_buff;
iov[0].iov_len = LLC_LEN; iov[0].iov_len = LLC_LEN;
iov[1].iov_base = circuit->snd_stream->data; iov[1].iov_base = circuit->snd_stream->data;
iov[1].iov_len = stream_get_endp(circuit->snd_stream); iov[1].iov_len = stream_get_endp(circuit->snd_stream);