Print this page
Version bump SVP to 2

Split Close
Expand all
Collapse all
          --- old/usr/src/lib/varpd/svp/common/libvarpd_svp_remote.c
          +++ new/usr/src/lib/varpd/svp/common/libvarpd_svp_remote.c
↓ open down ↓ 271 lines elided ↑ open up ↑
 272  272          lookup = avl_find(&srp->sr_tree, svp, NULL);
 273  273          if (lookup == NULL || lookup != svp)
 274  274                  libvarpd_panic("inconsitent remote avl tree...");
 275  275          avl_remove(&srp->sr_tree, svp);
 276  276          svp->svp_remote = NULL;
 277  277          mutex_exit(&srp->sr_lock);
 278  278          svp_remote_release(srp);
 279  279  }
 280  280  
 281  281  /*
 282      - * Walk the list of connections and find the first one that's available, the
 283      - * move it to the back of the list so it's less likely to be used again.
      282 + * See if the request can be sent over the connection's supported version.
      283 + * Scribble the version in the request itself.  NOTE that we do not check the
      284 + * version that already exists in sqp->sq_header.svp_ver, as we may be called
      285 + * from svp_remote_reassign() (and change versions when arriving at a new
      286 + * connection).
 284  287   */
 285  288  static boolean_t
      289 +svp_outbound_version_check(int version, svp_query_t *sqp)
      290 +{
      291 +        uint16_t op = htons(sqp->sq_header.svp_op);
      292 +
      293 +        /*
      294 +         * As of v1 -> v2, we really only need to restrict SVP_R_ROUTE_REQ
      295 +         * as v2-only.  Reflect that here.
      296 +         *
      297 +         * NOTE that if any message semantics change between future versions,
      298 +         * (e.g. "in v3 SVP_R_VL2_REQ takes on additional work"), we'll
      299 +         * need to more-deeply inspect the query.  It's possible that the
      300 +         * svp_op space is big enough to just continue op-only inspections.
      301 +         */
      302 +
      303 +        assert(version > 0 && version <= SVP_CURRENT_VERSION);
      304 +
      305 +        if (op != SVP_R_ROUTE_REQ || version >= SVP_VERSION_TWO) {
      306 +                sqp->sq_header.svp_ver = htons(version);
      307 +                return (B_TRUE);
      308 +        }
      309 +        return (B_FALSE);
      310 +}
      311 +
      312 +/*
      313 + * Walk the list of connections and find the first one that's available AND
      314 + * version-appropriate for the message, then move the matched connection to
      315 + * the back of the list so it's less likely to be used again.
      316 + */
      317 +static boolean_t
 286  318  svp_remote_conn_queue(svp_remote_t *srp, svp_query_t *sqp)
 287  319  {
 288  320          svp_conn_t *scp;
 289  321  
 290  322          assert(MUTEX_HELD(&srp->sr_lock));
 291  323          for (scp = list_head(&srp->sr_conns); scp != NULL;
 292  324              scp = list_next(&srp->sr_conns, scp)) {
 293  325                  mutex_enter(&scp->sc_lock);
 294      -                if (scp->sc_cstate != SVP_CS_ACTIVE) {
      326 +                if (scp->sc_cstate != SVP_CS_ACTIVE ||
      327 +                    !svp_outbound_version_check(scp->sc_version, sqp)) {
 295  328                          mutex_exit(&scp->sc_lock);
 296  329                          continue;
 297  330                  }
 298  331                  svp_conn_queue(scp, sqp);
 299  332                  mutex_exit(&scp->sc_lock);
 300  333                  list_remove(&srp->sr_conns, scp);
 301  334                  list_insert_tail(&srp->sr_conns, scp);
 302  335                  return (B_TRUE);
 303  336          }
 304  337  
↓ open down ↓ 19 lines elided ↑ open up ↑
 324  357      void *arg)
 325  358  {
 326  359          svp_remote_t *srp;
 327  360          svp_vl2_req_t *vl2r = &sqp->sq_rdun.sqd_vl2r;
 328  361  
 329  362          srp = svp->svp_remote;
 330  363          sqp->sq_func = svp_remote_vl2_lookup_cb;
 331  364          sqp->sq_arg = arg;
 332  365          sqp->sq_svp = svp;
 333  366          sqp->sq_state = SVP_QUERY_INIT;
 334      -        sqp->sq_header.svp_ver = htons(SVP_CURRENT_VERSION);
 335  367          sqp->sq_header.svp_op = htons(SVP_R_VL2_REQ);
 336  368          sqp->sq_header.svp_size = htonl(sizeof (svp_vl2_req_t));
 337  369          sqp->sq_header.svp_id = id_alloc(svp_idspace);
 338  370          if (sqp->sq_header.svp_id == (id_t)-1)
 339  371                  libvarpd_panic("failed to allcoate from svp_idspace: %d",
 340  372                      errno);
 341  373          sqp->sq_header.svp_crc32 = htonl(0);
 342  374          sqp->sq_rdata = vl2r;
 343  375          sqp->sq_rsize = sizeof (svp_vl2_req_t);
 344  376          sqp->sq_wdata = NULL;
↓ open down ↓ 31 lines elided ↑ open up ↑
 376  408      uint16_t vlan, void *arg)
 377  409  {
 378  410          svp_remote_t *srp;
 379  411          svp_route_req_t *srr = &sqp->sq_rdun.sqd_rr;
 380  412  
 381  413          srp = svp->svp_remote;
 382  414          sqp->sq_func = svp_remote_route_lookup_cb;
 383  415          sqp->sq_arg = arg;
 384  416          sqp->sq_svp = svp;
 385  417          sqp->sq_state = SVP_QUERY_INIT;
 386      -        sqp->sq_header.svp_ver = htons(SVP_CURRENT_VERSION);
 387  418          sqp->sq_header.svp_op = htons(SVP_R_ROUTE_REQ);
 388  419          sqp->sq_header.svp_size = htonl(sizeof (svp_route_req_t));
 389  420          sqp->sq_header.svp_id = id_alloc(svp_idspace);
 390  421          if (sqp->sq_header.svp_id == (id_t)-1)
 391  422                  libvarpd_panic("failed to allcoate from svp_idspace: %d",
 392  423                      errno);
 393  424          sqp->sq_header.svp_crc32 = htonl(0);
 394  425          sqp->sq_rdata = srr;
 395  426  
 396  427          bcopy(src, srr->srr_srcip, sizeof (struct in6_addr));
↓ open down ↓ 31 lines elided ↑ open up ↑
 428  459      const struct sockaddr *addr,  svp_query_f func, void *arg, uint32_t vid)
 429  460  {
 430  461          svp_vl3_req_t *vl3r = &sqp->sq_rdun.sdq_vl3r;
 431  462  
 432  463          if (addr->sa_family != AF_INET && addr->sa_family != AF_INET6)
 433  464                  libvarpd_panic("unexpected sa_family for the vl3 lookup");
 434  465  
 435  466          sqp->sq_func = func;
 436  467          sqp->sq_arg = arg;
 437  468          sqp->sq_state = SVP_QUERY_INIT;
 438      -        sqp->sq_header.svp_ver = htons(SVP_CURRENT_VERSION);
 439  469          sqp->sq_header.svp_op = htons(SVP_R_VL3_REQ);
 440  470          sqp->sq_header.svp_size = htonl(sizeof (svp_vl3_req_t));
 441  471          sqp->sq_header.svp_id = id_alloc(svp_idspace);
 442  472          if (sqp->sq_header.svp_id == (id_t)-1)
 443  473                  libvarpd_panic("failed to allcoate from svp_idspace: %d",
 444  474                      errno);
 445  475          sqp->sq_header.svp_crc32 = htonl(0);
 446  476          sqp->sq_rdata = vl3r;
 447  477          sqp->sq_rsize = sizeof (svp_vl3_req_t);
 448  478          sqp->sq_wdata = NULL;
↓ open down ↓ 61 lines elided ↑ open up ↑
 510  540  void
 511  541  svp_remote_log_request(svp_remote_t *srp, svp_query_t *sqp, void *buf,
 512  542      size_t buflen)
 513  543  {
 514  544          svp_log_req_t *logr = &sqp->sq_rdun.sdq_logr;
 515  545          boolean_t queued;
 516  546  
 517  547          sqp->sq_func = svp_remote_log_request_cb;
 518  548          sqp->sq_state = SVP_QUERY_INIT;
 519  549          sqp->sq_arg = srp;
 520      -        sqp->sq_header.svp_ver = htons(SVP_CURRENT_VERSION);
 521  550          sqp->sq_header.svp_op = htons(SVP_R_LOG_REQ);
 522  551          sqp->sq_header.svp_size = htonl(sizeof (svp_log_req_t));
 523  552          sqp->sq_header.svp_id = id_alloc(svp_idspace);
 524  553          if (sqp->sq_header.svp_id == (id_t)-1)
 525  554                  libvarpd_panic("failed to allcoate from svp_idspace: %d",
 526  555                      errno);
 527  556          sqp->sq_header.svp_crc32 = htonl(0);
 528  557          sqp->sq_rdata = logr;
 529  558          sqp->sq_rsize = sizeof (svp_log_req_t);
 530  559          sqp->sq_wdata = buf;
↓ open down ↓ 25 lines elided ↑ open up ↑
 556  585  void
 557  586  svp_remote_lrm_request(svp_remote_t *srp, svp_query_t *sqp, void *buf,
 558  587      size_t buflen)
 559  588  {
 560  589          boolean_t queued;
 561  590          svp_lrm_req_t *svrr = buf;
 562  591  
 563  592          sqp->sq_func = svp_remote_lrm_request_cb;
 564  593          sqp->sq_state = SVP_QUERY_INIT;
 565  594          sqp->sq_arg = srp;
 566      -        sqp->sq_header.svp_ver = htons(SVP_CURRENT_VERSION);
 567  595          sqp->sq_header.svp_op = htons(SVP_R_LOG_RM);
 568  596          sqp->sq_header.svp_size = htonl(buflen);
 569  597          sqp->sq_header.svp_id = id_alloc(svp_idspace);
 570  598          if (sqp->sq_header.svp_id == (id_t)-1)
 571  599                  libvarpd_panic("failed to allcoate from svp_idspace: %d",
 572  600                      errno);
 573  601          sqp->sq_header.svp_crc32 = htonl(0);
 574  602          sqp->sq_rdata = buf;
 575  603          sqp->sq_rsize = buflen;
 576  604          sqp->sq_wdata = NULL;
↓ open down ↓ 302 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX