All of lore.kernel.org
 help / color / mirror / Atom feed
From: Wei Yongjun <yjwei@cn.fujitsu.com>
To: linux-sctp@vger.kernel.org
Subject: [PATCH 1/3] sctp_darn: add inter command heartbeat for user initiated
Date: Fri, 26 Feb 2010 03:15:31 +0000	[thread overview]
Message-ID: <4B873CD3.7050307@cn.fujitsu.com> (raw)

Add inter command heartbeat to sctp_darn, which is used for
request a user initiated heartbeat to be made immediately.

Signed-off-by: Wei Yongjun <yjwei@cn.fujitsu.com>
---
 src/apps/sctp_darn.c |   59 +++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 58 insertions(+), 1 deletions(-)

diff --git a/src/apps/sctp_darn.c b/src/apps/sctp_darn.c
index 3d76730..625e541 100644
--- a/src/apps/sctp_darn.c
+++ b/src/apps/sctp_darn.c
@@ -142,7 +142,8 @@ enum inter_cmd_num {
 	INTER_SHUTDOWN,
 	INTER_ABORT,
 	INTER_NODELAY,
-	INTER_MAXSEG
+	INTER_MAXSEG,
+	INTER_HEARTBEAT
 };
 
 enum shutdown_type {
@@ -168,6 +169,7 @@ struct inter_entry inter_commands[] = {
 	{"abort", INTER_ABORT},
 	{"nodelay", INTER_NODELAY},
 	{"maxseg", INTER_MAXSEG},
+	{"heartbeat", INTER_HEARTBEAT},
 	{NULL, -1},
 };
 
@@ -189,6 +191,7 @@ static int bindx_func(char *, int, struct sockaddr *, int, int, int);
 static int connectx_func(char *, int, struct sockaddr *, int);
 static void  primary_func(char *, int, char *, int);
 static void  peer_primary_func(char *, int, char *, int);
+static void  spp_hb_demand_func(char *, int, char *, int);
 static int nodelay_func(char *, int, int val, int set);
 static int maxseg_func(char *, int, int val, int set);
 static int shutdown_func(char *argv0, int *skp, int shutdown_type);
@@ -1520,6 +1523,7 @@ parse_inter_commands(char *argv0, char *input, int snd_only)
 		printf("sndbuf=<int>     - Get/Set send buffer size.\n");
 		printf("primary=<addr>   - Get/Set association's primary\n");
 		printf("peer_primary­dr- Set association's peer_primary\n");
+		printf("heartbeat=<addr> - Request a user initiated heartbeat\n");
 		printf("maxseg=<int>     - Get/Set Maximum fragment size.\n");
 		printf("nodelay=<0|1>    - Get/Set NODELAY option.\n");
 		printf("shutdown         - Shutdown the association.\n");
@@ -1600,6 +1604,9 @@ parse_inter_commands(char *argv0, char *input, int snd_only)
 			case INTER_SET_PEER_PRIM:
 				peer_primary_func(argv0, inter_sk, p, set);
 				break;
+			case INTER_HEARTBEAT:
+				spp_hb_demand_func(argv0, inter_sk, p, set);
+				break;
 			case INTER_SHUTDOWN:
 				shutdown_func(argv0, &inter_sk, SHUTDOWN_SHUTDOWN);
 				break;
@@ -1990,6 +1997,56 @@ err:
 	        (set)?"setting":"getting", strerror(errno));
 }
 
+static void
+spp_hb_demand_func(char *argv0, int sk, char *cp, int set)
+{
+	struct sctp_paddrparams params;
+	struct sockaddr_in *in_addr;
+	struct sockaddr_in6 *in6_addr;
+	int ret;
+	char *p = cp;
+
+	memset(&params, 0, sizeof(struct sctp_paddrparams));
+	params.spp_assoc_id = associd;
+	params.spp_flags = SPP_HB_DEMAND;
+
+	if (set) {
+		/* Set the buffer for address parsing.  */
+		while ('\n' != *p)
+			p++;
+		*p = '\0';
+
+		if (strchr(cp, '.')) {
+			in_addr = (struct sockaddr_in *)&params.spp_address;
+			in_addr->sin_port = htons(remote_port);
+			in_addr->sin_family = AF_INET;
+			ret = inet_pton(AF_INET, cp, &in_addr->sin_addr);
+			if (ret <= 0)
+				goto err;
+		} else if (strchr(cp, ':')) {
+			in6_addr = (struct sockaddr_in6 *)&params.spp_address;
+			in6_addr->sin6_port = htons(remote_port);
+			in6_addr->sin6_family = AF_INET6;
+			ret = inet_pton(AF_INET6, cp, &in6_addr->sin6_addr);
+			if (ret <= 0)
+				goto err;
+		} else
+			goto err;
+	}
+
+	ret = setsockopt(sk, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS,
+			    &params, sizeof(struct sctp_paddrparams));
+	if (ret < 0)
+		goto err;
+
+	return;
+err:
+	if (!errno)
+		errno = EINVAL;
+	fprintf(stderr, "%s: error %s peer_addr_params: %s.\n", argv0,
+	        (set)?"setting":"getting", strerror(errno));
+}
+
 static int
 nodelay_func(char *argv0, int sk, int val, int set)
 {
-- 
1.6.5.2



                 reply	other threads:[~2010-02-26  3:15 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4B873CD3.7050307@cn.fujitsu.com \
    --to=yjwei@cn.fujitsu.com \
    --cc=linux-sctp@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.