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.

Split Close
Expand all
Collapse all
          --- old/usr/src/lib/varpd/svp/common/libvarpd_svp.c
          +++ new/usr/src/lib/varpd/svp/common/libvarpd_svp.c
↓ open down ↓ 353 lines elided ↑ open up ↑
 354  354  
 355  355  bunyan_logger_t *svp_bunyan;
 356  356  static int svp_defport = 1296;
 357  357  static int svp_defuport = 1339;
 358  358  static umem_cache_t *svp_lookup_cache;
 359  359  
 360  360  typedef enum svp_lookup_type {
 361  361          SVP_L_UNKNOWN   = 0x0,
 362  362          SVP_L_VL2       = 0x1,
 363  363          SVP_L_VL3       = 0x2,
 364      -        SVP_L_RVL3      = 0x3
      364 +        SVP_L_ROUTE     = 0x3
 365  365  } svp_lookup_type_t;
 366  366  
 367  367  typedef struct svp_lookup {
 368  368          int svl_type;
 369  369          union {
 370  370                  struct svl_lookup_vl2 {
 371  371                          varpd_query_handle_t    *svl_handle;
 372  372                          overlay_target_point_t  *svl_point;
 373  373                  } svl_vl2;
 374  374                  struct svl_lookup_vl3 {
 375  375                          varpd_arp_handle_t      *svl_vah;
 376  376                          uint8_t                 *svl_out;
 377  377                  } svl_vl3;
 378      -                struct svl_lookup_rvl3 {
      378 +                struct svl_lookup_route {
 379  379                          varpd_query_handle_t    *svl_handle;
 380  380                          overlay_target_point_t  *svl_point;
 381  381                          overlay_target_route_t  *svl_route;
 382      -                } svl_rvl3;
      382 +                } svl_route;
 383  383          } svl_u;
 384  384          svp_query_t                             svl_query;
 385  385  } svp_lookup_t;
 386  386  
 387  387  static const char *varpd_svp_props[] = {
 388  388          "svp/host",
 389  389          "svp/port",
 390  390          "svp/underlay_ip",
 391  391          "svp/underlay_port",
 392  392          "svp/dcid",
 393      -        "svp/router_mac"
      393 +        "svp/router_oui"
 394  394  };
 395  395  
 396  396  static const uint8_t svp_bcast[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
 397  397  
 398  398  int
 399  399  svp_comparator(const void *l, const void *r)
 400  400  {
 401  401          const svp_t *ls = l;
 402  402          const svp_t *rs = r;
 403  403  
↓ open down ↓ 26 lines elided ↑ open up ↑
 430  430          otp->otp_port = uport;
 431  431          libvarpd_plugin_query_reply(svl->svl_u.svl_vl2.svl_handle,
 432  432              VARPD_LOOKUP_OK);
 433  433          umem_cache_free(svp_lookup_cache, svl);
 434  434  }
 435  435  
 436  436  static void
 437  437  svp_vl3_lookup_cb(svp_t *svp, svp_status_t status, const uint8_t *vl2mac,
 438  438      const struct in6_addr *uip, const uint16_t uport, void *arg)
 439  439  {
 440      -        overlay_target_point_t point;
      440 +        /* Initialize address-holders to 0 for comparisons-to-zeroes later. */
      441 +        overlay_target_point_t point = { 0 };
 441  442          svp_lookup_t *svl = arg;
      443 +        uint8_t nexthop_mac[6] = { 0, 0, 0, 0, 0, 0 };
 442  444  
 443  445          assert(svp != NULL);
 444  446          assert(svl != NULL);
 445  447  
 446  448          if (status != SVP_S_OK) {
 447  449                  libvarpd_plugin_arp_reply(svl->svl_u.svl_vl3.svl_vah,
 448  450                      VARPD_LOOKUP_DROP);
 449  451                  umem_cache_free(svp_lookup_cache, svl);
 450  452                  return;
 451  453          }
 452  454  
 453  455          /* Inject the L2 mapping before the L3 */
 454      -        bcopy(uip, &point.otp_ip, sizeof (struct in6_addr));
 455      -        point.otp_port = uport;
 456      -        libvarpd_inject_varp(svp->svp_hdl, vl2mac, &point);
      456 +        if (uport != 0 &&
      457 +            bcmp(uip, &point.otp_ip, sizeof (struct in6_addr)) != 0) {
      458 +                /* Normal L3 lookup result... */
      459 +                bcopy(uip, &point.otp_ip, sizeof (struct in6_addr));
      460 +                point.otp_port = uport;
      461 +                libvarpd_inject_varp(svp->svp_hdl, vl2mac, &point);
      462 +        } else {
      463 +                /*
      464 +                 * Oh my, we have a next-hop router IP.
      465 +                 * Set the MAC to the ouid+vid concatenated
      466 +                 * special-router-MAC. Overlay down below will know
      467 +                 * that uport == 0 means the MAC is a special one.
      468 +                 */
      469 +                if (bcmp(svp->svp_router_oui, nexthop_mac, ETHERADDRL) == 0) {
      470 +                        /*
      471 +                         * We don't have a router_oui, so we can't support
      472 +                         * special-router-MAC.  Drop it.
      473 +                         */
      474 +                        libvarpd_plugin_arp_reply(svl->svl_u.svl_vl3.svl_vah,
      475 +                            VARPD_LOOKUP_DROP);
      476 +                        umem_cache_free(svp_lookup_cache, svl);
      477 +                        return;
      478 +                }
      479 +                bcopy(svp->svp_router_oui, nexthop_mac, 3);
      480 +                nexthop_mac[3] = (svp->svp_vid >> 16) & 0xff;
      481 +                nexthop_mac[4] = (svp->svp_vid >> 8) & 0xff;
      482 +                nexthop_mac[5] = svp->svp_vid & 0xff;
      483 +                vl2mac = nexthop_mac;
      484 +        }
 457  485  
 458  486          bcopy(vl2mac, svl->svl_u.svl_vl3.svl_out, ETHERADDRL);
 459  487          libvarpd_plugin_arp_reply(svl->svl_u.svl_vl3.svl_vah,
 460  488              VARPD_LOOKUP_OK);
 461  489          umem_cache_free(svp_lookup_cache, svl);
 462  490  }
 463  491  
 464  492  static void
 465  493  svp_vl2_invalidate_cb(svp_t *svp, const uint8_t *vl2mac)
 466  494  {
↓ open down ↓ 20 lines elided ↑ open up ↑
 487  515                  libvarpd_inject_arp(svp->svp_hdl, vlan, vl2mac, &v4, targmac);
 488  516          }
 489  517  }
 490  518  
 491  519  /* ARGSUSED */
 492  520  static void
 493  521  svp_shootdown_cb(svp_t *svp, const uint8_t *vl2mac, const struct in6_addr *uip,
 494  522      const uint16_t uport)
 495  523  {
 496  524          /*
 497      -         * We should probably do a conditional invlaidation here.
      525 +         * We should probably do a conditional invalidation here.
 498  526           */
 499  527          libvarpd_inject_varp(svp->svp_hdl, vl2mac, NULL);
 500  528  }
 501  529  
 502  530  static void
 503      -svp_rvl3_lookup_cb(svp_t *svp, svp_status_t status, /* XXX KEBE SAYS MORE */
      531 +svp_route_lookup_cb(svp_t *svp, svp_status_t status, uint32_t dcid,
      532 +    uint32_t vnetid, uint16_t vlan, uint8_t *srcmac, uint8_t *dstmac,
      533 +    uint16_t ul3_port, uint8_t *ul3_addr, uint8_t srcpfx, uint8_t dstpfx,
 504  534      void *arg)
 505  535  {
 506  536          svp_lookup_t *svl = arg;
 507  537          overlay_target_point_t *otp;
 508  538          overlay_target_route_t *otr;
 509  539  
 510  540          if (status != SVP_S_OK) {
 511      -                libvarpd_plugin_query_reply(svl->svl_u.svl_rvl3.svl_handle,
      541 +                libvarpd_plugin_query_reply(svl->svl_u.svl_route.svl_handle,
 512  542                      VARPD_LOOKUP_DROP);
 513  543                  umem_cache_free(svp_lookup_cache, svl);
 514  544                  return;
 515  545          }
 516  546  
 517      -        otp = svl->svl_u.svl_rvl3.svl_point;
 518      -        otr = svl->svl_u.svl_rvl3.svl_route;
 519      -        /* XXX KEBE SAYS FILL ME IN! */
      547 +        otp = svl->svl_u.svl_route.svl_point;
      548 +        bcopy(dstmac, otp->otp_mac, ETHERADDRL);
      549 +        bcopy(ul3_addr, &otp->otp_ip, sizeof (struct in6_addr));
      550 +        otp->otp_port = ul3_port;
 520  551  
 521      -        libvarpd_plugin_query_reply(svl->svl_u.svl_rvl3.svl_handle,
      552 +        otr = svl->svl_u.svl_route.svl_route;
      553 +        otr->otr_vnet = vnetid;
      554 +        otr->otr_vlan = vlan;
      555 +        bcopy(srcmac, otr->otr_srcmac, ETHERADDRL);
      556 +        otr->otr_dcid = dcid;
      557 +        otr->otr_src_prefixlen = srcpfx;
      558 +        otr->otr_dst_prefixlen = dstpfx;
      559 +
      560 +        libvarpd_plugin_query_reply(svl->svl_u.svl_route.svl_handle,
 522  561              VARPD_LOOKUP_OK);
 523  562          umem_cache_free(svp_lookup_cache, svl);
 524  563  }
 525  564  
 526  565  static svp_cb_t svp_defops = {
 527  566          svp_vl2_lookup_cb,
 528  567          svp_vl3_lookup_cb,
 529  568          svp_vl2_invalidate_cb,
 530  569          svp_vl3_inject_cb,
 531  570          svp_shootdown_cb,
 532      -        svp_rvl3_lookup_cb,
      571 +        svp_route_lookup_cb,
 533  572  };
 534  573  
 535  574  static boolean_t
 536  575  varpd_svp_valid_dest(overlay_plugin_dest_t dest)
 537  576  {
 538  577          if (dest != (OVERLAY_PLUGIN_D_IP | OVERLAY_PLUGIN_D_PORT))
 539  578                  return (B_FALSE);
 540  579  
 541  580          return (B_TRUE);
 542  581  }
↓ open down ↓ 87 lines elided ↑ open up ↑
 630  669              *dst = &otl->otl_addru.otlu_l3.otl3_dstip;
 631  670  
 632  671          /*
 633  672           * otl is an L3 request, so we have src/dst IPs for the inner packet.
 634  673           * We also have the vlan.
 635  674           *
 636  675           * Assume kernel's overlay module is caching well, so we are directly
 637  676           * going to query (i.e. no caching up here of actual destinations).
 638  677           *
 639  678           * Our existing remote sever (svp_remote), but with the new message
 640      -         * SVP_R_REMOTE_VL3_REQ.  Our naming of these functions already has
 641      -         * "remote" in it, but we'll use "rvl3" instead of "vl3".
      679 +         * SVP_R_ROUTE_REQ.
 642  680           */
 643  681  
 644  682          /* XXX KEBE SAYS DO SOME otl verification too... */
 645  683          if (IN6_IS_ADDR_V4MAPPED(src)) {
 646  684                  if (!IN6_IS_ADDR_V4MAPPED(dst)) {
 647  685                          libvarpd_plugin_query_reply(vqh, VARPD_LOOKUP_DROP);
 648  686                          return;
 649  687                  }
 650  688                  type = SVP_VL3_IP;
 651  689          } else {
↓ open down ↓ 3 lines elided ↑ open up ↑
 655  693                  }
 656  694                  type = SVP_VL3_IPV6;
 657  695          }
 658  696  
 659  697          slp = umem_cache_alloc(svp_lookup_cache, UMEM_DEFAULT);
 660  698          if (slp == NULL) {
 661  699                  libvarpd_plugin_query_reply(vqh, VARPD_LOOKUP_DROP);
 662  700                  return;
 663  701          }
 664  702  
 665      -        slp->svl_type = SVP_L_RVL3;
 666      -        slp->svl_u.svl_rvl3.svl_handle = vqh;
 667      -        slp->svl_u.svl_rvl3.svl_point = otp;
 668      -        slp->svl_u.svl_rvl3.svl_route = otr;
      703 +        slp->svl_type = SVP_L_ROUTE;
      704 +        slp->svl_u.svl_route.svl_handle = vqh;
      705 +        slp->svl_u.svl_route.svl_point = otp;
      706 +        slp->svl_u.svl_route.svl_route = otr;
 669  707  
 670      -        /* XXX KEBE SAYS FILL IN ARGS PROPERLY... */
 671      -        svp_remote_rvl3_lookup(svp, &slp->svl_query, src, dst, type,
      708 +        svp_remote_route_lookup(svp, &slp->svl_query, src, dst,
 672  709              otl->otl_vnetid, (uint16_t)otl->otl_vlan, slp);
 673  710  }
 674  711  
 675  712  static void
 676  713  varpd_svp_lookup(void *arg, varpd_query_handle_t *vqh,
 677  714      const overlay_targ_lookup_t *otl, overlay_target_point_t *otp,
 678  715      overlay_target_route_t *otr)
 679  716  {
 680  717          svp_lookup_t *slp;
 681  718          svp_t *svp = arg;
↓ open down ↓ 111 lines elided ↑ open up ↑
 793  830          case 4:
 794  831                  /* svp/dcid */
 795  832                  libvarpd_prop_set_name(vph, varpd_svp_props[4]);
 796  833                  libvarpd_prop_set_prot(vph, OVERLAY_PROP_PERM_RRW);
 797  834                  libvarpd_prop_set_type(vph, OVERLAY_PROP_T_UINT);
 798  835                  libvarpd_prop_set_nodefault(vph);
 799  836                  /* XXX KEBE ASKS should I just set high to UINT32_MAX? */
 800  837                  libvarpd_prop_set_range_uint32(vph, 1, UINT32_MAX - 1);
 801  838                  break;
 802  839          case 5:
 803      -                /* svp/router_mac */
      840 +                /* svp/router_oui */
 804  841                  libvarpd_prop_set_name(vph, varpd_svp_props[5]);
 805  842                  libvarpd_prop_set_prot(vph, OVERLAY_PROP_PERM_RRW);
 806  843                  libvarpd_prop_set_type(vph, OVERLAY_PROP_T_ETHER);
 807  844                  libvarpd_prop_set_nodefault(vph);
 808  845                  break;
 809  846          default:
 810  847                  return (EINVAL);
 811  848          }
 812  849          return (0);
 813  850  }
↓ open down ↓ 90 lines elided ↑ open up ↑
 904  941                  } else {
 905  942                          val = svp->svp_dcid;
 906  943                          bcopy(&val, buf, sizeof (uint64_t));
 907  944                          *sizep = sizeof (uint64_t);
 908  945                  }
 909  946  
 910  947                  mutex_exit(&svp->svp_lock);
 911  948                  return (0);
 912  949          }
 913  950  
 914      -        /* svp/router_mac */
      951 +        /* svp/router_oui */
 915  952          if (strcmp(pname, varpd_svp_props[5]) == 0) {
 916  953                  if (*sizep < ETHERADDRL)
 917  954                          return (EOVERFLOW);
 918  955                  mutex_enter(&svp->svp_lock);
 919  956  
 920      -                if (ether_is_zero(&svp->svp_router_mac)) {
      957 +                if (ether_is_zero(&svp->svp_router_oui)) {
 921  958                          *sizep = 0;
 922  959                  } else {
 923      -                        bcopy(&svp->svp_router_mac, buf, ETHERADDRL);
      960 +                        bcopy(&svp->svp_router_oui, buf, ETHERADDRL);
 924  961                          *sizep = ETHERADDRL;
 925  962                  }
 926  963  
 927  964                  mutex_exit(&svp->svp_lock);
 928  965                  return (0);
 929  966          }
 930  967          return (EINVAL);
 931  968  }
 932  969  
 933  970  static int
↓ open down ↓ 88 lines elided ↑ open up ↑
1022 1059                  if (*valp == 0 || *valp > UINT32_MAX - 1)
1023 1060                          return (EINVAL);
1024 1061  
1025 1062                  mutex_enter(&svp->svp_lock);
1026 1063                  svp->svp_dcid = (uint32_t)*valp;
1027 1064                  mutex_exit(&svp->svp_lock);
1028 1065  
1029 1066                  return (0);
1030 1067          }
1031 1068  
1032      -        /* svp/router_mac */
     1069 +        /* svp/router_oui */
1033 1070          if (strcmp(pname, varpd_svp_props[5]) == 0) {
1034 1071                  if (size < ETHERADDRL)
1035 1072                          return (EOVERFLOW);
1036 1073                  mutex_enter(&svp->svp_lock);
1037      -                bcopy(buf, &svp->svp_router_mac, ETHERADDRL);
     1074 +                bcopy(buf, &svp->svp_router_oui, ETHERADDRL);
     1075 +                /* Zero-out the low three bytes. */
     1076 +                svp->svp_router_oui[3] = 0;
     1077 +                svp->svp_router_oui[4] = 0;
     1078 +                svp->svp_router_oui[5] = 0;
1038 1079                  mutex_exit(&svp->svp_lock);
1039 1080                  return (0);
1040 1081          }
1041 1082  
1042 1083          return (EINVAL);
1043 1084  }
1044 1085  
1045 1086  static int
1046 1087  varpd_svp_save(void *arg, nvlist_t *nvp)
1047 1088  {
↓ open down ↓ 46 lines elided ↑ open up ↑
1094 1135  
1095 1136          /* svp/dcid */
1096 1137          if (svp->svp_dcid != 0) {
1097 1138                  if ((ret = nvlist_add_uint32(nvp, varpd_svp_props[4],
1098 1139                      svp->svp_dcid)) != 0) {
1099 1140                          mutex_exit(&svp->svp_lock);
1100 1141                          return (ret);
1101 1142                  }
1102 1143          }
1103 1144  
1104      -        /* svp/router_mac */
1105      -        if (!ether_is_zero(&svp->svp_router_mac)) {
     1145 +        /* svp/router_oui */
     1146 +        if (!ether_is_zero(&svp->svp_router_oui)) {
1106 1147                  char buf[ETHERADDRSTRL];
1107 1148  
1108 1149                  /* XXX KEBE SAYS See underlay_ip... */
1109      -                if (ether_ntoa_r(&svp->svp_router_mac, buf) == NULL) {
     1150 +                if (ether_ntoa_r((struct ether_addr *)&svp->svp_router_oui,
     1151 +                    buf) == NULL) {
1110 1152                          libvarpd_panic("unexpected ether_ntoa_r failure: %d",
1111 1153                              errno);
1112 1154                  }
1113 1155  
1114 1156                  if ((ret = nvlist_add_string(nvp, varpd_svp_props[5],
1115 1157                      buf)) != 0) {
1116 1158                          mutex_exit(&svp->svp_lock);
1117 1159                          return (ret);
1118 1160                  }
1119 1161          }
↓ open down ↓ 76 lines elided ↑ open up ↑
1196 1238          /* svp/dcid */
1197 1239          if ((ret = nvlist_lookup_uint32(nvp, varpd_svp_props[4],
1198 1240              &svp->svp_dcid)) != 0) {
1199 1241                  if (ret != ENOENT) {
1200 1242                          varpd_svp_destroy(svp);
1201 1243                          return (ret);
1202 1244                  }
1203 1245                  svp->svp_dcid = 0;
1204 1246          }
1205 1247  
1206      -        /* svp/router_mac */
     1248 +        /* svp/router_oui */
1207 1249          if ((ret = nvlist_lookup_string(nvp, varpd_svp_props[5],
1208 1250              &etherstr)) != 0) {
1209 1251                  if (ret != ENOENT) {
1210 1252                          varpd_svp_destroy(svp);
1211 1253                          return (ret);
1212 1254                  }
1213      -                bzero(&svp->svp_router_mac, ETHERADDRL);
1214      -        } else if (ether_aton_r(etherstr, &svp->svp_router_mac) == NULL) {
     1255 +                bzero(&svp->svp_router_oui, ETHERADDRL);
     1256 +        } else if (ether_aton_r(etherstr,
     1257 +            (struct ether_addr *)&svp->svp_router_oui) == NULL) {
1215 1258                  libvarpd_panic("unexpected ether_aton_r failure: %d", errno);
1216 1259          }
1217 1260  
1218 1261          svp->svp_hdl = hdl;
1219 1262          *outp = svp;
1220 1263          return (0);
1221 1264  }
1222 1265  
1223 1266  static void
1224 1267  varpd_svp_arp(void *arg, varpd_arp_handle_t *vah, int type,
↓ open down ↓ 152 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX