Print this page
Current snapshot of OpenSolaris port.
Checkpoint
Checkpoint
Merge from parent.
Merge with WIDE update.
Pull from WIDE.
Pull from WIDE.
Checkpoint
Re-update.
blah
WIDE update
Update from WIDE.

Split Close
Expand all
Collapse all
          --- old/iked/ike_pfkey.c
          +++ new/iked/ike_pfkey.c
↓ open down ↓ 61 lines elided ↑ open up ↑
  62   62  # include "oakley.h"
  63   63  # include "ikev1_impl.h"
  64   64  # include "ikev1/handler.h"
  65   65  #endif
  66   66  
  67   67  extern int debug_pfkey;
  68   68  static void dump_param(char *, struct rcpfk_msg *);
  69   69  
  70   70  static int sadb_getspi(struct rcpfk_msg *);
  71   71  static int sadb_acquire_error(struct rcpfk_msg *);
       72 +static int sadb_inverse_acquire(struct rcpfk_msg *);
  72   73  static int sadb_update(struct rcpfk_msg *);
  73   74  static int sadb_get(struct rcpfk_msg *);
  74   75  static int sadb_add(struct rcpfk_msg *);
  75   76  static int sadb_responder_error(struct rcpfk_msg *);
  76   77  static int sadb_delete(struct rcpfk_msg *);
  77   78  
  78   79  static int
  79   80  null_proc()
  80   81  {
  81   82          return 0;
  82   83  }
  83   84  
  84   85  /* sadb_initiator_request_method used in response to SADB_ACQUIRE */
  85   86  struct sadb_request_method sadb_initiator_request_method = {
  86   87          sadb_getspi,
  87   88          sadb_acquire_error,
  88   89          sadb_update,
  89   90          sadb_add,
  90   91          sadb_delete,
  91   92          sadb_get,
       93 +#ifdef sun
       94 +        null_proc,
       95 +#endif /* sun/OpenSolaris */
  92   96  };
  93   97  
  94   98  /* sadb_responder_request_method for use when receiving IKE_SA_INIT packet */
  95   99  struct sadb_request_method sadb_responder_request_method = {
  96  100          sadb_getspi,
  97  101          sadb_responder_error,
  98  102          sadb_update,
  99  103          sadb_add,
 100  104          sadb_delete,
 101  105          sadb_get,
      106 +#ifdef sun
      107 +        sadb_inverse_acquire,
      108 +#endif /* sun/OpenSolaris */
 102  109  };
 103  110  
 104  111  /* sadb_rekey_request_method for use when rekeying soft-expired IPsec SA */
 105  112  struct sadb_request_method sadb_rekey_request_method = {
 106  113          sadb_getspi,
 107  114          sadb_responder_error,
 108  115          sadb_update,
 109  116          sadb_add,
 110  117          sadb_delete,
 111  118          sadb_get,
 112  119  };
 113  120  
 114  121  /* sadb_null_method for informational exchange SA */
 115  122  struct sadb_request_method sadb_null_method = {
 116  123          null_proc, null_proc, null_proc, null_proc, null_proc, null_proc
      124 +#ifdef sun
      125 +        , null_proc
      126 +#endif /* sun/OpenSolaris */
 117  127  };
 118  128  
 119  129  /* sadb_force_initiate_method for use with isakmp_force_initiate() */
 120  130  struct sadb_request_method sadb_force_initiate_method = {
 121  131          sadb_getspi,
 122  132          sadb_responder_error,   /* to ignore error */
 123  133          sadb_update,
 124  134          sadb_add,
 125  135          sadb_delete,
 126  136          sadb_get,
      137 +#ifdef sun
      138 +        null_proc,
      139 +#endif /* sun/OpenSolaris */
 127  140  };
 128  141  
 129  142  static SADB_LIST_HEAD(sadb_request_list_head, sadb_request) sadb_request_list_head;
 130  143  
 131  144  static int pfkey_socket;
 132      -static uint32_t sadb_msg_seq;
      145 +static uint32_t my_sadb_seqnum;
 133  146  
 134  147  static int sadb_getspi_callback(struct rcpfk_msg *param);
 135  148  static int sadb_update_callback(struct rcpfk_msg *param);
 136  149  static int sadb_get_callback(struct rcpfk_msg *param);
 137  150  static int sadb_expire_callback(struct rcpfk_msg *param);
 138  151  static int sadb_acquire_callback(struct rcpfk_msg *param);
 139  152  static int sadb_delete_callback(struct rcpfk_msg *param);
 140  153  #ifdef SADB_X_MIGRATE
 141  154  static int sadb_x_migrate_callback(struct rcpfk_msg *param);
 142  155  #endif
↓ open down ↓ 16 lines elided ↑ open up ↑
 159  172  #ifdef SADB_X_MIGRATE
 160  173          sadb_x_migrate_callback,
 161  174  #endif
 162  175  };
 163  176  
 164  177  int
 165  178  sadb_init(void)
 166  179  {
 167  180          struct rcpfk_msg param;
 168  181  
      182 +        (void) memset(&param, 0, sizeof (param));
      183 +
 169  184          SADB_LIST_INIT(&sadb_request_list_head);
 170  185          if (debug_pfkey)
 171  186                  return 0;
 172  187  
 173  188          param.flags = 0;
 174  189  
 175  190          if (rcpfk_init(&param, &ike_rcpfk_callback) != 0)
 176  191                  return -1;
 177  192          pfkey_socket = param.so;
 178  193          TRACE((PLOGLOC, "pfkey_socket: %d\n", pfkey_socket));
↓ open down ↓ 21 lines elided ↑ open up ↑
 200  215  
 201  216  int
 202  217  sadb_socket(void)
 203  218  {
 204  219          return pfkey_socket;
 205  220  }
 206  221  
 207  222  uint32_t
 208  223  sadb_new_seq(void)
 209  224  {
 210      -        return ++sadb_msg_seq;
      225 +        return ++my_sadb_seqnum;
 211  226  }
 212  227  
 213  228  static void
 214  229  log_rcpfk_error(const char *msg, struct rcpfk_msg *param)
 215  230  {
 216  231          if (param->eno) {
 217  232                  isakmp_log(0, 0, 0, 0,
 218  233                             PLOG_INTERR, PLOGLOC,
 219  234                             "%s: %s\n", msg, param->estr);
 220  235          } else {
↓ open down ↓ 1 lines elided ↑ open up ↑
 222  237                             PLOG_INTERR, PLOGLOC,
 223  238                             "%s: unknown error\n", msg);
 224  239          }
 225  240  }
 226  241  
 227  242  void
 228  243  sadb_poll(void)
 229  244  {
 230  245          struct rcpfk_msg rcpfk_param;
 231  246  
      247 +        (void) memset(&rcpfk_param, 0, sizeof (rcpfk_param));
 232  248          rcpfk_param.so = pfkey_socket;
 233  249          rcpfk_param.flags = 0;
 234  250          if (rcpfk_handler(&rcpfk_param) != 0) {
 235  251                  log_rcpfk_error("sadb_poll", &rcpfk_param);
 236  252          }
 237  253  }
 238  254  
 239  255  void
 240  256  sadb_request_initialize(struct sadb_request *req,
 241  257                          struct sadb_request_method *m,
↓ open down ↓ 49 lines elided ↑ open up ↑
 291  307  
 292  308          /* param: so, satype, seq, eno */
 293  309          param->so = pfkey_socket;
 294  310          param->flags = 0;
 295  311          err = rcpfk_send_acquire(param);
 296  312          if (err)
 297  313                  log_rcpfk_error("sadb_acquire_error", param);
 298  314          return err;
 299  315  }
 300  316  
      317 +#ifdef sun
      318 +static int
      319 +sadb_inverse_acquire(struct rcpfk_msg *param)
      320 +{
      321 +        int err;
      322 +
      323 +        TRACE((PLOGLOC, "sadb_inverse_acquire: seq=%d\n", param->seq));
      324 +
      325 +        /* param: so, satype, seq, eno */
      326 +        param->so = pfkey_socket;
      327 +        param->flags = 0;
      328 +        err = rcpfk_send_inverse_acquire(param);
      329 +        if (err)
      330 +                log_rcpfk_error("sadb_inverse_acquire", param);
      331 +        return (err);
      332 +}
      333 +#endif /* sun/OpenSolaris */
      334 +
      335 +#define sa2str_chk(sa) (((sa) == NULL) ? "<none>" : rcs_sa2str(sa))
      336 +
 301  337  static void
 302  338  sadb_log_add(char *op, struct rcpfk_msg *param)
 303  339  {
 304  340          if (param->satype == RCT_SATYPE_ESP) {
 305  341                  INFO((PLOGLOC,
 306      -                      "%s ul_proto=%d src=%s dst=%s satype=%s samode=%s spi=0x%08x authtype=%s enctype=%s lifetime soft time=%"
      342 +                      "%s ul_proto=%d src=%s dst=%s "
      343 +#ifdef sun
      344 +                      "isrc=%s idst=%s nlc=%s nrm=%s"
      345 +#endif
      346 +                      "satype=%s samode=%s spi=0x%08x authtype=%s enctype=%s lifetime soft time=%"
 307  347                        PRIu64 " bytes=%" PRIu64 " hard time=%" PRIu64 " bytes=%" PRIu64 "\n",
 308  348                        op, param->ul_proto, rcs_sa2str(param->sa_src),
 309      -                      rcs_sa2str(param->sa_dst), rct2str(param->satype),
      349 +                      rcs_sa2str(param->sa_dst),
      350 +#ifdef sun
      351 +                      sa2str_chk(param->sa_isrc), sa2str_chk(param->sa_idst),
      352 +                      sa2str_chk(param->sa_natlocal),
      353 +                      sa2str_chk(param->sa_natremote),
      354 +#endif
      355 +                      rct2str(param->satype),
 310  356                        rct2str(param->samode), ntohl(param->spi),
 311  357                        rct2str(param->authtype), rct2str(param->enctype),
 312  358                        param->lft_soft_time, param->lft_soft_bytes,
 313  359                        param->lft_hard_time, param->lft_hard_bytes));
 314  360          } else {
 315  361                  INFO((PLOGLOC,
 316      -                      "%s ul_proto=%d src=%s dst=%s satype=%s samode=%s spi=0x%08x authtype=%s lifetime soft time=%"
      362 +                      "%s ul_proto=%d src=%s dst=%s "
      363 +#ifdef sun
      364 +                      "isrc=%s idst=%s nlc=%s nrm=%s"
      365 +#endif
      366 +                      "satype=%s samode=%s spi=0x%08x authtype=%s lifetime soft time=%"
 317  367                        PRIu64 " bytes=%" PRIu64 " hard time=%" PRIu64 " bytes=%" PRIu64 "\n",
 318  368                        op, param->ul_proto, rcs_sa2str(param->sa_src),
 319      -                      rcs_sa2str(param->sa_dst), rct2str(param->satype),
      369 +                      rcs_sa2str(param->sa_dst),
      370 +#ifdef sun
      371 +                      sa2str_chk(param->sa_isrc), sa2str_chk(param->sa_idst),
      372 +                      sa2str_chk(param->sa_natlocal),
      373 +                      sa2str_chk(param->sa_natremote),
      374 +#endif
      375 +                      rct2str(param->satype),
 320  376                        rct2str(param->samode), ntohl(param->spi),
 321  377                        rct2str(param->authtype), param->lft_soft_time,
 322  378                        param->lft_soft_bytes, param->lft_hard_time,
 323  379                        param->lft_hard_bytes));
 324  380          }
 325  381  }
 326  382  
 327  383  /* send SADB_UPDATE */
 328  384  static int
 329  385  sadb_update(struct rcpfk_msg *param)
↓ open down ↓ 275 lines elided ↑ open up ↑
 605  661          return 0;
 606  662  }
 607  663  
 608  664  
 609  665  /*
 610  666   * called when the kernel generates SADB_ACQUIRE message
 611  667   */
 612  668  static int
 613  669  sadb_acquire_callback(struct rcpfk_msg *param)
 614  670  {
      671 +        struct sadb_request *req;
      672 +        invacq_t *invacq;
 615  673          /* param: seq, satype, sa_src, sa_dst, samode, selid */
 616  674          /* address(P)??? pid?? identity??? proposal??? */
 617  675  
 618  676          TRACE((PLOGLOC,
 619  677                 "sadb_acquire_callback: seq=%d satype=%d sa_src=%s sa_dst=%s samode=%d selid=%d\n",
 620  678                 param->seq, param->satype, rcs_sa2str(param->sa_src),
 621  679                 rcs_sa2str(param->sa_dst), param->samode, param->slid));
 622  680  
 623      -        if (sadb_find_by_seq(param->seq)) {
 624      -                TRACE((PLOGLOC, "duplicate seq %u\n", param->seq));
 625      -                return 0;
      681 +        req = sadb_find_by_seq(param->seq);
      682 +        if (req != NULL) {
      683 +                /* Inverse-ACQUIRE. */
      684 +                invacq = (invacq_t *)req->sa;
      685 +                invacq->answer = param;
      686 +                return (invacq->receiver(invacq));
 626  687          }
 627  688  
 628      -        isakmp_initiate(&sadb_initiator_request_method,
 629      -                        param->slid,
 630      -                        param->seq, param->satype,
 631      -                        param->sa_src, param->sa_dst,
 632      -                        param->sa2_src);
      689 +        if (param->eno != 0) {
      690 +                /* inverse-ACQUIRE error with no outstanding request.  Drop. */
      691 +                return (-1);
      692 +        }
      693 +
      694 +        isakmp_initiate(&sadb_initiator_request_method, param);
 633  695          return 0;
 634  696  }
 635  697  
 636  698  /*
 637  699   * called when the kernel generates SADB_DELETE message
 638  700   */
 639  701  static int
 640  702  sadb_delete_callback(struct rcpfk_msg *param)
 641  703  {
 642  704          /* param: seq, satype, spi, sa_src, sa_dst, samode */
↓ open down ↓ 510 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX