Print this page
Restore SVP_R_ROUTE_REQ, and all that goes with it.
Interpret sl3a_uport == 0 in SVP_R_VL3_ACK to indicate the VL3 IP is a next-hop router.

*** 72,83 **** svp_vl2_ack_t sqd_vl2a; svp_vl3_req_t sdq_vl3r; svp_vl3_ack_t sdq_vl3a; svp_log_req_t sdq_logr; svp_lrm_ack_t sdq_lrma; ! svp_rvl3_req_t sqd_rvl3r; ! svp_rvl3_ack_t sqd_rvl3a; } svp_query_data_t; typedef void (*svp_query_f)(svp_query_t *, void *); typedef enum svp_query_state { --- 72,83 ---- svp_vl2_ack_t sqd_vl2a; svp_vl3_req_t sdq_vl3r; svp_vl3_ack_t sdq_vl3a; svp_log_req_t sdq_logr; svp_lrm_ack_t sdq_lrma; ! svp_route_req_t sqd_rr; ! svp_route_ack_t sqd_ra; } svp_query_data_t; typedef void (*svp_query_f)(svp_query_t *, void *); typedef enum svp_query_state {
*** 245,264 **** typedef void (*svp_vl2_invalidation_f)(svp_t *, const uint8_t *); typedef void (*svp_vl3_inject_f)(svp_t *, const uint16_t, const struct in6_addr *, const uint8_t *, const uint8_t *); typedef void (*svp_shootdown_f)(svp_t *, const uint8_t *, const struct in6_addr *, const uint16_t uport); ! /* XXX KEBE SAYS FILL ME IN! */ ! typedef void (*svp_rvl3_lookup_f)(svp_t *, svp_status_t, void *); typedef struct svp_cb { svp_vl2_lookup_f scb_vl2_lookup; svp_vl3_lookup_f scb_vl3_lookup; svp_vl2_invalidation_f scb_vl2_invalidate; svp_vl3_inject_f scb_vl3_inject; svp_shootdown_f scb_shootdown; ! svp_rvl3_lookup_f scb_rvl3_lookup; } svp_cb_t; /* * Core implementation structure. */ --- 245,265 ---- typedef void (*svp_vl2_invalidation_f)(svp_t *, const uint8_t *); typedef void (*svp_vl3_inject_f)(svp_t *, const uint16_t, const struct in6_addr *, const uint8_t *, const uint8_t *); typedef void (*svp_shootdown_f)(svp_t *, const uint8_t *, const struct in6_addr *, const uint16_t uport); ! typedef void (*svp_route_lookup_f)(svp_t *, svp_status_t, uint32_t, uint32_t, ! uint16_t, uint8_t *, uint8_t *, uint16_t, uint8_t *, uint8_t, uint8_t, ! void *); typedef struct svp_cb { svp_vl2_lookup_f scb_vl2_lookup; svp_vl3_lookup_f scb_vl3_lookup; svp_vl2_invalidation_f scb_vl2_invalidate; svp_vl3_inject_f scb_vl3_inject; svp_shootdown_f scb_shootdown; ! svp_route_lookup_f scb_route_lookup; } svp_cb_t; /* * Core implementation structure. */
*** 274,284 **** uint16_t svp_port; /* svp_lock */ uint16_t svp_uport; /* svp_lock */ uint32_t svp_dcid; /* svp_lock (but write-once?) */ boolean_t svp_huip; /* svp_lock */ struct in6_addr svp_uip; /* svp_lock */ ! struct ether_addr svp_router_mac; /* svp_lock (but write-once?) */ }; extern bunyan_logger_t *svp_bunyan; extern int svp_remote_find(char *, uint16_t, struct in6_addr *, --- 275,286 ---- uint16_t svp_port; /* svp_lock */ uint16_t svp_uport; /* svp_lock */ uint32_t svp_dcid; /* svp_lock (but write-once?) */ boolean_t svp_huip; /* svp_lock */ struct in6_addr svp_uip; /* svp_lock */ ! /* NOTE: lower-3 bytes are 0s. */ ! uint8_t svp_router_oui[6]; /* svp_lock (but write-once?) */ }; extern bunyan_logger_t *svp_bunyan; extern int svp_remote_find(char *, uint16_t, struct in6_addr *,
*** 288,299 **** extern void svp_remote_release(svp_remote_t *); extern void svp_remote_vl3_lookup(svp_t *, svp_query_t *, const struct sockaddr *, void *); extern void svp_remote_vl2_lookup(svp_t *, svp_query_t *, const uint8_t *, void *); ! extern void svp_remote_rvl3_lookup(svp_t *, svp_query_t *, ! const struct in6_addr *, const struct in6_addr *, uint32_t, uint32_t, uint16_t, void *); /* * Init functions --- 290,301 ---- extern void svp_remote_release(svp_remote_t *); extern void svp_remote_vl3_lookup(svp_t *, svp_query_t *, const struct sockaddr *, void *); extern void svp_remote_vl2_lookup(svp_t *, svp_query_t *, const uint8_t *, void *); ! extern void svp_remote_route_lookup(svp_t *, svp_query_t *, ! const struct in6_addr *, const struct in6_addr *, uint32_t, uint16_t, void *); /* * Init functions