Print this page
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 ↓ 382 lines elided ↑ open up ↑
 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 ↓ 28 lines elided ↑ open up ↑
 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  440          overlay_target_point_t point;
 441  441          svp_lookup_t *svl = arg;
      442 +        uint8_t nexthop_mac[6] = { 0, 0, 0, 0, 0, 0 };
 442  443  
 443  444          assert(svp != NULL);
 444  445          assert(svl != NULL);
 445  446  
 446  447          if (status != SVP_S_OK) {
 447  448                  libvarpd_plugin_arp_reply(svl->svl_u.svl_vl3.svl_vah,
 448  449                      VARPD_LOOKUP_DROP);
 449  450                  umem_cache_free(svp_lookup_cache, svl);
 450  451                  return;
 451  452          }
 452  453  
 453  454          /* Inject the L2 mapping before the L3 */
 454  455          bcopy(uip, &point.otp_ip, sizeof (struct in6_addr));
 455  456          point.otp_port = uport;
 456      -        libvarpd_inject_varp(svp->svp_hdl, vl2mac, &point);
      457 +        if (uport != 0) {
      458 +                /* Normal L3 lookup result... */
      459 +                libvarpd_inject_varp(svp->svp_hdl, vl2mac, &point);
      460 +        } else {
      461 +                /*
      462 +                 * Oh my, we have a next-hop router IP.
      463 +                 * Set the MAC to the ouid+vid concatenated
      464 +                 * special-router-MAC. Overlay down below will know
      465 +                 * that uport == 0 means the MAC is a special one.
      466 +                 */
      467 +                if (bcmp(svp->svp_router_oui, nexthop_mac, ETHERADDRL) == 0) {
      468 +                        /*
      469 +                         * We don't have a router_oui, so we can't support
      470 +                         * special-router-MAC.  Drop it.
      471 +                         */
      472 +                        libvarpd_plugin_arp_reply(svl->svl_u.svl_vl3.svl_vah,
      473 +                            VARPD_LOOKUP_DROP);
      474 +                        umem_cache_free(svp_lookup_cache, svl);
      475 +                        return;
      476 +                }
      477 +                vl2mac = nexthop_mac;
      478 +                bcopy(svp->svp_router_oui, vl2mac, 3);
      479 +                vl2mac[3] = (svp->svp_vid >> 16) & 0xff;
      480 +                vl2mac[4] = (svp->svp_vid >> 8) & 0xff;
      481 +                vl2mac[5] = svp->svp_vid & 0xff;
      482 +        }
 457  483  
 458  484          bcopy(vl2mac, svl->svl_u.svl_vl3.svl_out, ETHERADDRL);
 459  485          libvarpd_plugin_arp_reply(svl->svl_u.svl_vl3.svl_vah,
 460  486              VARPD_LOOKUP_OK);
 461  487          umem_cache_free(svp_lookup_cache, svl);
 462  488  }
 463  489  
 464  490  static void
 465  491  svp_vl2_invalidate_cb(svp_t *svp, const uint8_t *vl2mac)
 466  492  {
↓ open down ↓ 335 lines elided ↑ open up ↑
 802  828          case 4:
 803  829                  /* svp/dcid */
 804  830                  libvarpd_prop_set_name(vph, varpd_svp_props[4]);
 805  831                  libvarpd_prop_set_prot(vph, OVERLAY_PROP_PERM_RRW);
 806  832                  libvarpd_prop_set_type(vph, OVERLAY_PROP_T_UINT);
 807  833                  libvarpd_prop_set_nodefault(vph);
 808  834                  /* XXX KEBE ASKS should I just set high to UINT32_MAX? */
 809  835                  libvarpd_prop_set_range_uint32(vph, 1, UINT32_MAX - 1);
 810  836                  break;
 811  837          case 5:
 812      -                /* svp/router_mac */
      838 +                /* svp/router_oui */
 813  839                  libvarpd_prop_set_name(vph, varpd_svp_props[5]);
 814  840                  libvarpd_prop_set_prot(vph, OVERLAY_PROP_PERM_RRW);
 815  841                  libvarpd_prop_set_type(vph, OVERLAY_PROP_T_ETHER);
 816  842                  libvarpd_prop_set_nodefault(vph);
 817  843                  break;
 818  844          default:
 819  845                  return (EINVAL);
 820  846          }
 821  847          return (0);
 822  848  }
↓ open down ↓ 90 lines elided ↑ open up ↑
 913  939                  } else {
 914  940                          val = svp->svp_dcid;
 915  941                          bcopy(&val, buf, sizeof (uint64_t));
 916  942                          *sizep = sizeof (uint64_t);
 917  943                  }
 918  944  
 919  945                  mutex_exit(&svp->svp_lock);
 920  946                  return (0);
 921  947          }
 922  948  
 923      -        /* svp/router_mac */
      949 +        /* svp/router_oui */
 924  950          if (strcmp(pname, varpd_svp_props[5]) == 0) {
 925  951                  if (*sizep < ETHERADDRL)
 926  952                          return (EOVERFLOW);
 927  953                  mutex_enter(&svp->svp_lock);
 928  954  
 929      -                if (ether_is_zero(&svp->svp_router_mac)) {
      955 +                if (ether_is_zero(&svp->svp_router_oui)) {
 930  956                          *sizep = 0;
 931  957                  } else {
 932      -                        bcopy(&svp->svp_router_mac, buf, ETHERADDRL);
      958 +                        bcopy(&svp->svp_router_oui, buf, ETHERADDRL);
 933  959                          *sizep = ETHERADDRL;
 934  960                  }
 935  961  
 936  962                  mutex_exit(&svp->svp_lock);
 937  963                  return (0);
 938  964          }
 939  965          return (EINVAL);
 940  966  }
 941  967  
 942  968  static int
↓ open down ↓ 88 lines elided ↑ open up ↑
1031 1057                  if (*valp == 0 || *valp > UINT32_MAX - 1)
1032 1058                          return (EINVAL);
1033 1059  
1034 1060                  mutex_enter(&svp->svp_lock);
1035 1061                  svp->svp_dcid = (uint32_t)*valp;
1036 1062                  mutex_exit(&svp->svp_lock);
1037 1063  
1038 1064                  return (0);
1039 1065          }
1040 1066  
1041      -        /* svp/router_mac */
     1067 +        /* svp/router_oui */
1042 1068          if (strcmp(pname, varpd_svp_props[5]) == 0) {
1043 1069                  if (size < ETHERADDRL)
1044 1070                          return (EOVERFLOW);
1045 1071                  mutex_enter(&svp->svp_lock);
1046      -                bcopy(buf, &svp->svp_router_mac, ETHERADDRL);
     1072 +                bcopy(buf, &svp->svp_router_oui, ETHERADDRL);
     1073 +                /* Zero-out the low three bytes. */
     1074 +                svp->svp_router_oui[3] = 0;
     1075 +                svp->svp_router_oui[4] = 0;
     1076 +                svp->svp_router_oui[5] = 0;
1047 1077                  mutex_exit(&svp->svp_lock);
1048 1078                  return (0);
1049 1079          }
1050 1080  
1051 1081          return (EINVAL);
1052 1082  }
1053 1083  
1054 1084  static int
1055 1085  varpd_svp_save(void *arg, nvlist_t *nvp)
1056 1086  {
↓ open down ↓ 46 lines elided ↑ open up ↑
1103 1133  
1104 1134          /* svp/dcid */
1105 1135          if (svp->svp_dcid != 0) {
1106 1136                  if ((ret = nvlist_add_uint32(nvp, varpd_svp_props[4],
1107 1137                      svp->svp_dcid)) != 0) {
1108 1138                          mutex_exit(&svp->svp_lock);
1109 1139                          return (ret);
1110 1140                  }
1111 1141          }
1112 1142  
1113      -        /* svp/router_mac */
1114      -        if (!ether_is_zero(&svp->svp_router_mac)) {
     1143 +        /* svp/router_oui */
     1144 +        if (!ether_is_zero(&svp->svp_router_oui)) {
1115 1145                  char buf[ETHERADDRSTRL];
1116 1146  
1117 1147                  /* XXX KEBE SAYS See underlay_ip... */
1118      -                if (ether_ntoa_r(&svp->svp_router_mac, buf) == NULL) {
     1148 +                if (ether_ntoa_r(&svp->svp_router_oui, buf) == NULL) {
1119 1149                          libvarpd_panic("unexpected ether_ntoa_r failure: %d",
1120 1150                              errno);
1121 1151                  }
1122 1152  
1123 1153                  if ((ret = nvlist_add_string(nvp, varpd_svp_props[5],
1124 1154                      buf)) != 0) {
1125 1155                          mutex_exit(&svp->svp_lock);
1126 1156                          return (ret);
1127 1157                  }
1128 1158          }
↓ open down ↓ 76 lines elided ↑ open up ↑
1205 1235          /* svp/dcid */
1206 1236          if ((ret = nvlist_lookup_uint32(nvp, varpd_svp_props[4],
1207 1237              &svp->svp_dcid)) != 0) {
1208 1238                  if (ret != ENOENT) {
1209 1239                          varpd_svp_destroy(svp);
1210 1240                          return (ret);
1211 1241                  }
1212 1242                  svp->svp_dcid = 0;
1213 1243          }
1214 1244  
1215      -        /* svp/router_mac */
     1245 +        /* svp/router_oui */
1216 1246          if ((ret = nvlist_lookup_string(nvp, varpd_svp_props[5],
1217 1247              &etherstr)) != 0) {
1218 1248                  if (ret != ENOENT) {
1219 1249                          varpd_svp_destroy(svp);
1220 1250                          return (ret);
1221 1251                  }
1222      -                bzero(&svp->svp_router_mac, ETHERADDRL);
1223      -        } else if (ether_aton_r(etherstr, &svp->svp_router_mac) == NULL) {
     1252 +                bzero(&svp->svp_router_oui, ETHERADDRL);
     1253 +        } else if (ether_aton_r(etherstr, &svp->svp_router_oui) == NULL) {
1224 1254                  libvarpd_panic("unexpected ether_aton_r failure: %d", errno);
1225 1255          }
1226 1256  
1227 1257          svp->svp_hdl = hdl;
1228 1258          *outp = svp;
1229 1259          return (0);
1230 1260  }
1231 1261  
1232 1262  static void
1233 1263  varpd_svp_arp(void *arg, varpd_arp_handle_t *vah, int type,
↓ open down ↓ 152 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX