#include "if.h"
#include "lib_errors.h"
-#include "isisd/dict.h"
#include "isisd/isis_constants.h"
#include "isisd/isis_common.h"
#include "isisd/isis_circuit.h"
#include "privs.h"
/* tcpdump -i eth0 'isis' -dd */
-static struct sock_filter isisfilter[] = {
+static const struct sock_filter isisfilter[] = {
/* NB: we're in SOCK_DGRAM, so src/dst mac + length are stripped
* off!
* (OTOH it's a bit more lower-layer agnostic and might work
{0x6, 0, 0, 0x00040000}, {0x6, 0, 0, 0x00000000},
};
-static struct sock_fprog bpf = {
+static const struct sock_fprog bpf = {
.len = array_size(isisfilter),
- .filter = isisfilter,
+ .filter = (struct sock_filter *)isisfilter,
};
/*
* ISO 10589 - 8.4.8
*/
-uint8_t ALL_L1_ISS[6] = {0x01, 0x80, 0xC2, 0x00, 0x00, 0x14};
-uint8_t ALL_L2_ISS[6] = {0x01, 0x80, 0xC2, 0x00, 0x00, 0x15};
-uint8_t ALL_ISS[6] = {0x09, 0x00, 0x2B, 0x00, 0x00, 0x05};
-uint8_t ALL_ESS[6] = {0x09, 0x00, 0x2B, 0x00, 0x00, 0x04};
+static const uint8_t ALL_L1_ISS[6] = {0x01, 0x80, 0xC2, 0x00, 0x00, 0x14};
+static const uint8_t ALL_L2_ISS[6] = {0x01, 0x80, 0xC2, 0x00, 0x00, 0x15};
+static const uint8_t ALL_ISS[6] = {0x09, 0x00, 0x2B, 0x00, 0x00, 0x05};
+static const uint8_t ALL_ESS[6] = {0x09, 0x00, 0x2B, 0x00, 0x00, 0x04};
static uint8_t discard_buff[8192];
-static uint8_t sock_buff[8192];
/*
* if level is 0 we are joining p2p multicast
{
int retval = ISIS_OK;
- frr_elevate_privs(&isisd_privs) {
+ frr_with_privs(&isisd_privs) {
retval = open_packet_socket(circuit);
return ISIS_WARNING;
}
- /* on lan we have to read to the static buff first */
- bytesread = recvfrom(circuit->fd, sock_buff, sizeof(sock_buff),
- MSG_DONTWAIT, (struct sockaddr *)&s_addr,
- (socklen_t *)&addr_len);
+ /* Ensure that we have enough space for a pdu padded to fill the mtu */
+ unsigned int max_size =
+ circuit->interface->mtu > circuit->interface->mtu6
+ ? 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) {
- zlog_warn("isis_recv_pdu_bcast(): recvfrom() failed");
+ zlog_warn("%s: recvfrom() failed", __func__);
return ISIS_WARNING;
}
-
/* 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);
-
memcpy(ssnpa, &s_addr.sll_addr, s_addr.sll_halen);
return ISIS_OK;
{
struct msghdr msg;
struct iovec iov[2];
+ char temp_buff[LLC_LEN];
/* we need to do the LLC in here because of P2P circuits, which will
* not need it
/* on a broadcast circuit */
/* first we put the LLC in */
- sock_buff[0] = 0xFE;
- sock_buff[1] = 0xFE;
- sock_buff[2] = 0x03;
+ temp_buff[0] = 0xFE;
+ temp_buff[1] = 0xFE;
+ temp_buff[2] = 0x03;
memset(&msg, 0, sizeof(msg));
msg.msg_name = &sa;
msg.msg_namelen = sizeof(struct sockaddr_ll);
msg.msg_iov = iov;
msg.msg_iovlen = 2;
- iov[0].iov_base = sock_buff;
+ iov[0].iov_base = temp_buff;
iov[0].iov_len = LLC_LEN;
iov[1].iov_base = circuit->snd_stream->data;
iov[1].iov_len = stream_get_endp(circuit->snd_stream);