Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 30f6ebf6 authored by Xin Long's avatar Xin Long Committed by David S. Miller
Browse files

sctp: add SCTP_AUTH_NO_AUTH type for AUTHENTICATION_EVENT



This patch is to add SCTP_AUTH_NO_AUTH type for AUTHENTICATION_EVENT,
as described in section 6.1.8 of RFC6458.

      SCTP_AUTH_NO_AUTH:  This report indicates that the peer does not
         support SCTP authentication as defined in [RFC4895].

Note that the implementation is quite similar as that of
SCTP_ADAPTATION_INDICATION.

Signed-off-by: default avatarXin Long <lucien.xin@gmail.com>
Acked-by: default avatarMarcelo Ricardo Leitner <marcelo.leitner@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ec2e506c
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -100,6 +100,7 @@ enum sctp_verb {
	SCTP_CMD_SET_SK_ERR,	 /* Set sk_err */
	SCTP_CMD_SET_SK_ERR,	 /* Set sk_err */
	SCTP_CMD_ASSOC_CHANGE,	 /* generate and send assoc_change event */
	SCTP_CMD_ASSOC_CHANGE,	 /* generate and send assoc_change event */
	SCTP_CMD_ADAPTATION_IND, /* generate and send adaptation event */
	SCTP_CMD_ADAPTATION_IND, /* generate and send adaptation event */
	SCTP_CMD_PEER_NO_AUTH,   /* generate and send authentication event */
	SCTP_CMD_ASSOC_SHKEY,    /* generate the association shared keys */
	SCTP_CMD_ASSOC_SHKEY,    /* generate the association shared keys */
	SCTP_CMD_T1_RETRAN,	 /* Mark for retransmission after T1 timeout  */
	SCTP_CMD_T1_RETRAN,	 /* Mark for retransmission after T1 timeout  */
	SCTP_CMD_UPDATE_INITTAG, /* Update peer inittag */
	SCTP_CMD_UPDATE_INITTAG, /* Update peer inittag */
+1 −0
Original line number Original line Diff line number Diff line
@@ -522,6 +522,7 @@ enum {
	SCTP_AUTH_NEW_KEY,
	SCTP_AUTH_NEW_KEY,
#define	SCTP_AUTH_NEWKEY	SCTP_AUTH_NEW_KEY /* compatible with before */
#define	SCTP_AUTH_NEWKEY	SCTP_AUTH_NEW_KEY /* compatible with before */
	SCTP_AUTH_FREE_KEY,
	SCTP_AUTH_FREE_KEY,
	SCTP_AUTH_NO_AUTH,
};
};


/*
/*
+13 −0
Original line number Original line Diff line number Diff line
@@ -1049,6 +1049,16 @@ static void sctp_cmd_assoc_change(struct sctp_cmd_seq *commands,
		asoc->stream.si->enqueue_event(&asoc->ulpq, ev);
		asoc->stream.si->enqueue_event(&asoc->ulpq, ev);
}
}


static void sctp_cmd_peer_no_auth(struct sctp_cmd_seq *commands,
				  struct sctp_association *asoc)
{
	struct sctp_ulpevent *ev;

	ev = sctp_ulpevent_make_authkey(asoc, 0, SCTP_AUTH_NO_AUTH, GFP_ATOMIC);
	if (ev)
		asoc->stream.si->enqueue_event(&asoc->ulpq, ev);
}

/* Helper function to generate an adaptation indication event */
/* Helper function to generate an adaptation indication event */
static void sctp_cmd_adaptation_ind(struct sctp_cmd_seq *commands,
static void sctp_cmd_adaptation_ind(struct sctp_cmd_seq *commands,
				    struct sctp_association *asoc)
				    struct sctp_association *asoc)
@@ -1755,6 +1765,9 @@ static int sctp_cmd_interpreter(enum sctp_event event_type,
		case SCTP_CMD_ADAPTATION_IND:
		case SCTP_CMD_ADAPTATION_IND:
			sctp_cmd_adaptation_ind(commands, asoc);
			sctp_cmd_adaptation_ind(commands, asoc);
			break;
			break;
		case SCTP_CMD_PEER_NO_AUTH:
			sctp_cmd_peer_no_auth(commands, asoc);
			break;


		case SCTP_CMD_ASSOC_SHKEY:
		case SCTP_CMD_ASSOC_SHKEY:
			error = sctp_auth_asoc_init_active_key(asoc,
			error = sctp_auth_asoc_init_active_key(asoc,
+41 −2
Original line number Original line Diff line number Diff line
@@ -659,7 +659,7 @@ enum sctp_disposition sctp_sf_do_5_1D_ce(struct net *net,
					 void *arg,
					 void *arg,
					 struct sctp_cmd_seq *commands)
					 struct sctp_cmd_seq *commands)
{
{
	struct sctp_ulpevent *ev, *ai_ev = NULL;
	struct sctp_ulpevent *ev, *ai_ev = NULL, *auth_ev = NULL;
	struct sctp_association *new_asoc;
	struct sctp_association *new_asoc;
	struct sctp_init_chunk *peer_init;
	struct sctp_init_chunk *peer_init;
	struct sctp_chunk *chunk = arg;
	struct sctp_chunk *chunk = arg;
@@ -820,6 +820,14 @@ enum sctp_disposition sctp_sf_do_5_1D_ce(struct net *net,
			goto nomem_aiev;
			goto nomem_aiev;
	}
	}


	if (!new_asoc->peer.auth_capable) {
		auth_ev = sctp_ulpevent_make_authkey(new_asoc, 0,
						     SCTP_AUTH_NO_AUTH,
						     GFP_ATOMIC);
		if (!auth_ev)
			goto nomem_authev;
	}

	/* Add all the state machine commands now since we've created
	/* Add all the state machine commands now since we've created
	 * everything.  This way we don't introduce memory corruptions
	 * everything.  This way we don't introduce memory corruptions
	 * during side-effect processing and correclty count established
	 * during side-effect processing and correclty count established
@@ -847,8 +855,14 @@ enum sctp_disposition sctp_sf_do_5_1D_ce(struct net *net,
		sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP,
		sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP,
				SCTP_ULPEVENT(ai_ev));
				SCTP_ULPEVENT(ai_ev));


	if (auth_ev)
		sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP,
				SCTP_ULPEVENT(auth_ev));

	return SCTP_DISPOSITION_CONSUME;
	return SCTP_DISPOSITION_CONSUME;


nomem_authev:
	sctp_ulpevent_free(ai_ev);
nomem_aiev:
nomem_aiev:
	sctp_ulpevent_free(ev);
	sctp_ulpevent_free(ev);
nomem_ev:
nomem_ev:
@@ -953,6 +967,15 @@ enum sctp_disposition sctp_sf_do_5_1E_ca(struct net *net,
				SCTP_ULPEVENT(ev));
				SCTP_ULPEVENT(ev));
	}
	}


	if (!asoc->peer.auth_capable) {
		ev = sctp_ulpevent_make_authkey(asoc, 0, SCTP_AUTH_NO_AUTH,
						GFP_ATOMIC);
		if (!ev)
			goto nomem;
		sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP,
				SCTP_ULPEVENT(ev));
	}

	return SCTP_DISPOSITION_CONSUME;
	return SCTP_DISPOSITION_CONSUME;
nomem:
nomem:
	return SCTP_DISPOSITION_NOMEM;
	return SCTP_DISPOSITION_NOMEM;
@@ -1908,6 +1931,9 @@ static enum sctp_disposition sctp_sf_do_dupcook_b(
	if (asoc->peer.adaptation_ind)
	if (asoc->peer.adaptation_ind)
		sctp_add_cmd_sf(commands, SCTP_CMD_ADAPTATION_IND, SCTP_NULL());
		sctp_add_cmd_sf(commands, SCTP_CMD_ADAPTATION_IND, SCTP_NULL());


	if (!asoc->peer.auth_capable)
		sctp_add_cmd_sf(commands, SCTP_CMD_PEER_NO_AUTH, SCTP_NULL());

	return SCTP_DISPOSITION_CONSUME;
	return SCTP_DISPOSITION_CONSUME;


nomem:
nomem:
@@ -1954,7 +1980,7 @@ static enum sctp_disposition sctp_sf_do_dupcook_d(
					struct sctp_cmd_seq *commands,
					struct sctp_cmd_seq *commands,
					struct sctp_association *new_asoc)
					struct sctp_association *new_asoc)
{
{
	struct sctp_ulpevent *ev = NULL, *ai_ev = NULL;
	struct sctp_ulpevent *ev = NULL, *ai_ev = NULL, *auth_ev = NULL;
	struct sctp_chunk *repl;
	struct sctp_chunk *repl;


	/* Clarification from Implementor's Guide:
	/* Clarification from Implementor's Guide:
@@ -2001,6 +2027,14 @@ static enum sctp_disposition sctp_sf_do_dupcook_d(
				goto nomem;
				goto nomem;


		}
		}

		if (!asoc->peer.auth_capable) {
			auth_ev = sctp_ulpevent_make_authkey(asoc, 0,
							     SCTP_AUTH_NO_AUTH,
							     GFP_ATOMIC);
			if (!auth_ev)
				goto nomem;
		}
	}
	}


	repl = sctp_make_cookie_ack(new_asoc, chunk);
	repl = sctp_make_cookie_ack(new_asoc, chunk);
@@ -2015,10 +2049,15 @@ static enum sctp_disposition sctp_sf_do_dupcook_d(
	if (ai_ev)
	if (ai_ev)
		sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP,
		sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP,
					SCTP_ULPEVENT(ai_ev));
					SCTP_ULPEVENT(ai_ev));
	if (auth_ev)
		sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP,
				SCTP_ULPEVENT(auth_ev));


	return SCTP_DISPOSITION_CONSUME;
	return SCTP_DISPOSITION_CONSUME;


nomem:
nomem:
	if (auth_ev)
		sctp_ulpevent_free(auth_ev);
	if (ai_ev)
	if (ai_ev)
		sctp_ulpevent_free(ai_ev);
		sctp_ulpevent_free(ai_ev);
	if (ev)
	if (ev)