diff options
-rw-r--r-- | isisd/isis_bpf.c | 29 | ||||
-rw-r--r-- | isisd/isis_pdu.c | 4 | ||||
-rw-r--r-- | isisd/isis_pdu.h | 2 |
3 files changed, 23 insertions, 12 deletions
diff --git a/isisd/isis_bpf.c b/isisd/isis_bpf.c index 0493c125b..872bc5bc7 100644 --- a/isisd/isis_bpf.c +++ b/isisd/isis_bpf.c @@ -216,7 +216,8 @@ end: int isis_recv_pdu_bcast(struct isis_circuit *circuit, u_char *ssnpa) { - int bytesread = 0, bytestoread, offset, one = 1; + int bytesread = 0, bytestoread, offset, one = 1, err = ISIS_OK; + u_char *buff_ptr; struct bpf_hdr *bpf_hdr; assert(circuit->fd > 0); @@ -230,25 +231,33 @@ int isis_recv_pdu_bcast(struct isis_circuit *circuit, u_char *ssnpa) } if (bytesread < 0) { zlog_warn("isis_recv_pdu_bcast(): read() failed: %s", - safe_strerror(errno)); + safe_strerror(errno)); return ISIS_WARNING; } if (bytesread == 0) return ISIS_WARNING; - bpf_hdr = (struct bpf_hdr *)readbuff; + buff_ptr = readbuff; + while (buff_ptr < readbuff + bytesread) { + bpf_hdr = (struct bpf_hdr *) buff_ptr; + assert(bpf_hdr->bh_caplen == bpf_hdr->bh_datalen); + offset = bpf_hdr->bh_hdrlen + LLC_LEN + ETHER_HDR_LEN; - assert(bpf_hdr->bh_caplen == bpf_hdr->bh_datalen); + /* then we lose the BPF, LLC and ethernet headers */ + stream_write(circuit->rcv_stream, buff_ptr + offset, + bpf_hdr->bh_caplen - LLC_LEN - ETHER_HDR_LEN); + stream_set_getp(circuit->rcv_stream, 0); - offset = bpf_hdr->bh_hdrlen + LLC_LEN + ETHER_HDR_LEN; + memcpy(ssnpa, buff_ptr + bpf_hdr->bh_hdrlen + ETHER_ADDR_LEN, + ETHER_ADDR_LEN); - /* then we lose the BPF, LLC and ethernet headers */ - stream_write(circuit->rcv_stream, readbuff + offset, - bpf_hdr->bh_caplen - LLC_LEN - ETHER_HDR_LEN); - stream_set_getp(circuit->rcv_stream, 0); + err = isis_handle_pdu(circuit, ssnpa); + stream_reset(circuit->rcv_stream); + buff_ptr += BPF_WORDALIGN(bpf_hdr->bh_hdrlen + + bpf_hdr->bh_datalen); + } - memcpy(ssnpa, readbuff + bpf_hdr->bh_hdrlen + ETH_ALEN, ETH_ALEN); if (ioctl(circuit->fd, BIOCFLUSH, &one) < 0) zlog_warn("Flushing failed: %s", safe_strerror(errno)); diff --git a/isisd/isis_pdu.c b/isisd/isis_pdu.c index 20c39a624..cf2304c7a 100644 --- a/isisd/isis_pdu.c +++ b/isisd/isis_pdu.c @@ -1336,7 +1336,7 @@ static int pdu_size(uint8_t pdu_type, uint8_t *size) * PDU Dispatcher */ -static int isis_handle_pdu(struct isis_circuit *circuit, u_char *ssnpa) +int isis_handle_pdu(struct isis_circuit *circuit, u_char *ssnpa) { int retval = ISIS_OK; @@ -1459,8 +1459,10 @@ int isis_receive(struct thread *thread) retval = circuit->rx(circuit, ssnpa); +#if ISIS_METHOD != ISIS_METHOD_BPF if (retval == ISIS_OK) retval = isis_handle_pdu(circuit, ssnpa); +#endif //ISIS_METHOD != ISIS_METHOD_BPF /* * prepare for next packet. diff --git a/isisd/isis_pdu.h b/isisd/isis_pdu.h index 709676187..2d9100c10 100644 --- a/isisd/isis_pdu.h +++ b/isisd/isis_pdu.h @@ -215,5 +215,5 @@ int send_l2_psnp(struct thread *thread); int send_lsp(struct thread *thread); void fill_fixed_hdr(uint8_t pdu_type, struct stream *stream); int send_hello(struct isis_circuit *circuit, int level); - +int isis_handle_pdu(struct isis_circuit *circuit, u_char *ssnpa); #endif /* _ZEBRA_ISIS_PDU_H */ |