Print this page
8927 sadb_x_kmc_t's KM cookie should be 64-bits
Reviewed by: Jason King <jason.king@joyent.com>
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Yuri Pankov <yuripv@gmx.com>

@@ -21,10 +21,11 @@
  */
 /*
  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  * Copyright 2012 Milan Juri. All rights reserved.
+ * Copyright 2017 Joyent, Inc.
  */
 
 #include <unistd.h>
 #include <stdio.h>
 #include <stdlib.h>

@@ -1150,10 +1151,13 @@
  * Lookup the given cookie and return its corresponding label.  Return
  * a pointer to the label on success, NULL on error (or if the label is
  * not found).  Note that the returned label pointer points to a static
  * string, so the label will be overwritten by a subsequent call to the
  * function; the function is also not thread-safe as a result.
+ *
+ * Because this is possibly publically exported, do not change its name,
+ * but this is for all intents and purposes an IKEv1/in.iked function.
  */
 char *
 kmc_lookup_by_cookie(int cookie)
 {
         FILE            *map;

@@ -2589,17 +2593,36 @@
 void
 print_kmc(FILE *file, char *prefix, struct sadb_x_kmc *kmc)
 {
         char *cookie_label;
 
-        if ((cookie_label = kmc_lookup_by_cookie(kmc->sadb_x_kmc_cookie)) ==
-            NULL)
-                cookie_label = dgettext(TEXT_DOMAIN, "<Label not found.>");
-
+        switch (kmc->sadb_x_kmc_proto) {
+        case SADB_X_KMP_IKE:
+                cookie_label = kmc_lookup_by_cookie(kmc->sadb_x_kmc_cookie);
+                if (cookie_label == NULL)
+                        cookie_label =
+                            dgettext(TEXT_DOMAIN, "<Label not found.>");
         (void) fprintf(file, dgettext(TEXT_DOMAIN,
             "%sProtocol %u, cookie=\"%s\" (%u)\n"), prefix,
-            kmc->sadb_x_kmc_proto, cookie_label, kmc->sadb_x_kmc_cookie);
+                    kmc->sadb_x_kmc_proto, cookie_label,
+                    kmc->sadb_x_kmc_cookie);
+                return;
+        case SADB_X_KMP_MANUAL:
+                cookie_label = dgettext(TEXT_DOMAIN, "Manual SA with cookie");
+                break;
+        /* case SADB_X_KMP_IKEV2: */
+        default:
+                cookie_label =
+                    dgettext(TEXT_DOMAIN, "<unknown KM protocol>");
+                break;
+        }
+
+        /* XXX KEBE ASKS... htonll() on generic kmc_cookie? */
+        (void) fprintf(file, dgettext(TEXT_DOMAIN,
+            "%sProtocol %u, cookie=\"%s\" (0x%"PRIx64"/%"PRIu64")\n"),
+            prefix, kmc->sadb_x_kmc_proto, cookie_label,
+            kmc->sadb_x_kmc_cookie64, kmc->sadb_x_kmc_cookie64);
 }
 
 /*
  * Print an SADB_X_EXT_REPLAY_CTR extension.
  */