diff -X exclude_files -Nabur ospfd1.28/linux/Makefile ospfd/linux/Makefile --- ospfd1.28/linux/Makefile Fri Mar 16 14:06:21 2001 +++ ospfd/linux/Makefile Fri Mar 30 12:54:31 2001 @@ -24,6 +24,7 @@ mospf.o \ nbrfsm.o \ netlsa.o \ + opqlsa.o \ ospf.o \ pat.o \ phyint.o \ diff -X exclude_files -Nabur ospfd1.28/linux/linux.C ospfd/linux/linux.C --- ospfd1.28/linux/linux.C Fri Mar 16 14:06:21 2001 +++ ospfd/linux/linux.C Tue Apr 3 12:03:56 2001 @@ -157,6 +157,7 @@ { close(conn->monfd()); monfds.remove(conn); + ospf->register_for_opqs(conn->monfd(), true); delete conn; } diff -X exclude_files -Nabur ospfd1.28/linux/lsa_prn.C ospfd/linux/lsa_prn.C --- ospfd1.28/linux/lsa_prn.C Fri Mar 16 14:06:21 2001 +++ ospfd/linux/lsa_prn.C Tue Apr 3 12:07:29 2001 @@ -72,6 +72,7 @@ void print_asbr_lsa(byte *, int); void print_asex_lsa(byte *, int); void print_gm_lsa(byte *, int); + void print_opq_lsa(byte *, int); case LST_RTR: print_rtr_lsa(body, len); break; @@ -90,10 +91,15 @@ case LST_GM: print_gm_lsa(body, len); break; + case LST_LINK_OPQ: + case LST_AREA_OPQ: + case LST_AS_OPQ: + print_opq_lsa(body, len); + break; default: break; } -}; +} /* Print out the body of a router-LSA. @@ -286,5 +292,24 @@ printf("\t\tLS type:\t%d\n", ntoh32(ref->ls_type)); in = *((in_addr *) &ref->ls_id); printf("\t\tLink State ID:\t%s\n", inet_ntoa(in)); + } +} + +/* Print out the body of an opaque-LSA. + */ + +void print_opq_lsa(byte *body, int len) + +{ + byte *end; + int i; + + end = body + len; + + printf("\t// Opaque-LSA body\n\t"); + for (i=0; i < len; i++) { + if (i != 0 && (i % 16) == 0) + printf("\r\n\t"); + printf("%02x ", body[i]); } } diff -X exclude_files -Nabur ospfd1.28/linux/ospfd_browser.C ospfd/linux/ospfd_browser.C --- ospfd1.28/linux/ospfd_browser.C Fri Mar 16 14:06:23 2001 +++ ospfd/linux/ospfd_browser.C Thu Apr 5 15:03:07 2001 @@ -53,6 +53,7 @@ void get_rttbl(); void display_html(char *); void display_error(char *); +void get_opaques(); const int OSPFD_MON_PORT = 12767; @@ -94,6 +95,8 @@ extern char *expand_lsa_top; extern char *expand_lsa_bottom; extern char *error_page; +extern char *opaque_page_top; +extern char *opaque_row; /* Class used to store the value-pairs returned * by the html server. @@ -271,6 +274,8 @@ select_lsa(); else if (strncmp(command, "adv", 3) == 0) get_lsa(); + else if (strncmp(command, "opqs", 4) == 0) + get_opaques(); } display_html(page_footer); @@ -544,6 +549,15 @@ case LST_GM: addVP(&pairs, "ls_type", "Group member"); break; + case LST_LINK_OPQ: + addVP(&pairs, "ls_type", "Link Opaque"); + break; + case LST_AREA_OPQ: + addVP(&pairs, "ls_type", "Area Opaque"); + break; + case LST_AS_OPQ: + addVP(&pairs, "ls_type", "AS Opaque"); + break; } in = *((in_addr *) &lshdr->ls_id); addVP(&pairs, "ls_id", inet_ntoa(in)); @@ -573,6 +587,111 @@ display_html(database_page_bottom); } +/* Get the Opaque-LSAs, through the registration interface. + */ + +void get_opaques() + +{ + MonMsg req; + int mlen; + int n_lsas = 0; + uns32 xsum = 0; + + display_html(opaque_page_top); + req.hdr.version = OSPF_MON_VERSION; + req.hdr.retcode = 0; + req.hdr.exact = 0; + mlen = sizeof(MonHdr); + req.hdr.id = hton16(id++); + if (!monpkt->sendpkt_suspend(&req, MonReq_OpqReg, 0, mlen)) { + display_error("Send failed"); + exit(0); + } + + while (1) { + MonHdr *mhdr; + MonMsg *m; + LShdr *lshdr; + in_addr in; + uns16 type; + uns16 subtype; + age_t age; + char *ptr; + + req.hdr.version = OSPF_MON_VERSION; + req.hdr.retcode = 0; + req.hdr.exact = 0; + mlen = sizeof(MonHdr); + req.hdr.id = hton16(id++); + if (!monpkt->sendpkt_suspend(&req, MonReq_OpqNext, 0, mlen)) { + display_error("Send failed"); + exit(0); + } + + if (monpkt->rcv_suspend((void **)&mhdr, type, subtype) == -1) { + display_error("Receive failed"); + exit(0); + } + + m = (MonMsg *) mhdr; + if (m->hdr.retcode != 0) + break; + addVP(&pairs, "phyint", "n/a"); + addVP(&pairs, "if_addr", "n/a"); + addVP(&pairs, "area_id", "n/a"); + + n_lsas++; + lshdr = (LShdr *) (((char *) m) + sizeof(MonHdr) + sizeof(OpqRsp)); + xsum += ntoh16(lshdr->ls_xsum); + sprintf(buffer, "%d", lshdr->ls_type); + addVP(&pairs, "ls_typeno", buffer); + // Print out Link state header + switch (lshdr->ls_type) { + case LST_LINK_OPQ: + addVP(&pairs, "ls_type", "Link Opaque"); + sprintf(buffer, "%d", ntoh32(m->body.opqrsp.phyint)); + addVP(&pairs, "phyint", buffer); + in = *((in_addr *) &m->body.opqrsp.if_addr); + addVP(&pairs, "if_addr", inet_ntoa(in)); + break; + case LST_AREA_OPQ: + addVP(&pairs, "ls_type", "Area Opaque"); + in = *((in_addr *) &m->body.opqrsp.a_id); + addVP(&pairs, "area_id", inet_ntoa(in)); + break; + case LST_AS_OPQ: + addVP(&pairs, "ls_type", "AS Opaque"); + break; + } + in = *((in_addr *) &lshdr->ls_id); + addVP(&pairs, "ls_id", inet_ntoa(in)); + in = *((in_addr *) &lshdr->ls_org); + addVP(&pairs, "adv_rtr", inet_ntoa(in)); + sprintf(buffer, "0x%08x", ntoh32(lshdr->ls_seqno)); + addVP(&pairs, "seqno", buffer); + sprintf(buffer, "0x%04x", ntoh16(lshdr->ls_xsum)); + addVP(&pairs, "lsa_xsum", buffer); + sprintf(buffer, "%d", ntoh16(lshdr->ls_length)); + addVP(&pairs, "lsa_len", buffer); + ptr = buffer; + age = ntoh16(lshdr->ls_age); + if ((age & DoNotAge) != 0) { + age &= ~DoNotAge; + strcpy(buffer, "DNA+"); + ptr += strlen(buffer); + } + sprintf(ptr, "%d", age); + addVP(&pairs, "ls_age", buffer); + display_html(opaque_row); + } + sprintf(buffer, "%d", n_lsas); + addVP(&pairs, "n_lsas", buffer); + sprintf(buffer, "0x%x", xsum); + addVP(&pairs, "area_xsum", buffer); + display_html(database_page_bottom); +} + /* Ask the user to select a particular LSA to * expand. */ @@ -1274,6 +1393,48 @@ \n\ \n"; +/* The pages used to display the Opaque-LSAs + */ + +char *opaque_page_top = "\ +\n\ +\n\ +\n\ +\n\ +\n\ +
\n\ +Router $router_id$'s link-state database for OSPF\n\ +Area $area_id$. AS-external-LSAs are not included.\n\ +
\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n"; + +char *opaque_row = "\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n"; + /* Pages used to select a given LSA for display. * Top is followed by "
PhyintIf AddressAreaLS typeLS IDAdv. Rtr.LS SeqnoXsumLengthAge
$phyint$$if_addr$$area_id$$ls_type$$ls_id$$adv_rtr$$seqno$$lsa_xsum$$lsa_len$$ls_age$