]> git.puffer.fish Git - matthieu/frr.git/commitdiff
isisd: Fixed the way isis reads from bpf
authoripinlnd <nlndipi@hotmail.com>
Wed, 14 Mar 2018 19:26:48 +0000 (22:56 +0330)
committerRafael Zalamena <rzalamena@opensourcerouting.org>
Mon, 19 Mar 2018 16:22:27 +0000 (13:22 -0300)
With this fix, we parse the bpf to process every packet read

Signed-off-by: Ali Rezaee nlndipi@hotmail.com
(cherry picked from commit b9347997d6be2ba45bbad97ab8a2ee8c670f37b0)
Signed-off-by: Rafael Zalamena <rzalamena@opensourcerouting.org>
isisd/isis_bpf.c
isisd/isis_pdu.c
isisd/isis_pdu.h

index a4c6b4c75d055a3e6e089b02e237c11defc00c7a..872bc5bc72f2395e9e7a42800e9fe6e4d281788f 100644 (file)
@@ -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,26 +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));
index 2ea1fe0a5f08e4d41ab34c65a7aa17e01c774545..44ca08da60186eb561d8653dc654c86e86e8874c 100644 (file)
@@ -1334,7 +1334,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;
 
@@ -1457,8 +1457,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.
index 7096761879394591f830f7554d30f6d6707ed5ca..2d9100c10b118b80276bd107ebe35e5abdc90ca2 100644 (file)
@@ -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 */