pfkeyv2_expire(tdb, SADB_EXT_LIFETIME_HARD);
handle_expirations(void *arg){    struct expiration *exp;    struct tdb *tdb;        if (explist == (struct expiration *) NULL)      return;        while (1)    {	exp = explist;	if (exp == (struct expiration *) NULL)	  return;	else	  if (exp->exp_timeout > time.tv_sec)	    break;		/* Advance pointer */	explist = explist->exp_next;	if (explist)	  explist->exp_prev = NULL;		tdb = gettdb(exp->exp_spi, &exp->exp_dst, exp->exp_sproto);	free(exp, M_TDB);	if (tdb == (struct tdb *) NULL)	  continue;			/* TDB is gone, ignore this */		/* Hard expirations first */	if ((tdb->tdb_flags & TDBF_TIMER) &&	    (tdb->tdb_exp_timeout <= time.tv_sec))	{/* XXX	      encap_sendnotify(NOTIFY_HARD_EXPIRE, tdb, NULL);*/	    tdb_delete(tdb, 0);	    continue;	}	else	  if ((tdb->tdb_flags & TDBF_FIRSTUSE) &&	      (tdb->tdb_first_use + tdb->tdb_exp_first_use <= time.tv_sec))	  {/* XXX   encap_sendnotify(NOTIFY_HARD_EXPIRE, tdb, NULL);*/	      tdb_delete(tdb, 0);	      continue;	  }	/* Soft expirations */	if ((tdb->tdb_flags & TDBF_SOFT_TIMER) &&	    (tdb->tdb_soft_timeout <= time.tv_sec))	{/* XXX   encap_sendnotify(NOTIFY_SOFT_EXPIRE, tdb, NULL);*/	    tdb->tdb_flags &= ~TDBF_SOFT_TIMER;	}	else	  if ((tdb->tdb_flags & TDBF_SOFT_FIRSTUSE) &&	      (tdb->tdb_first_use + tdb->tdb_soft_first_use <=	       time.tv_sec))	  {/* XXX   encap_sendnotify(NOTIFY_SOFT_EXPIRE, tdb, NULL);*/	      tdb->tdb_flags &= ~TDBF_SOFT_FIRSTUSE;	  }    }    if (explist)      timeout(handle_expirations, (void *) NULL, 	      hz * (explist->exp_timeout - time.tv_sec));}