Example #1
0
/* FIXME: This function is currently not used anywhere */
int dccp_insert_option_elapsed_time(struct sk_buff *skb, u32 elapsed_time)
{
    const int elapsed_time_len = dccp_elapsed_time_len(elapsed_time);
    const int len = 2 + elapsed_time_len;
    unsigned char *to;

    if (elapsed_time_len == 0)
        return 0;

    if (DCCP_SKB_CB(skb)->dccpd_opt_len + len > DCCP_MAX_OPT_LEN)
        return -1;

    DCCP_SKB_CB(skb)->dccpd_opt_len += len;

    to    = skb_push(skb, len);
    *to++ = DCCPO_ELAPSED_TIME;
    *to++ = len;

    if (elapsed_time_len == 2) {
        const __be16 var16 = htons((u16)elapsed_time);
        memcpy(to, &var16, 2);
    } else {
        const __be32 var32 = htonl(elapsed_time);
        memcpy(to, &var32, 4);
    }

    return 0;
}
Example #2
0
static void dccp_insert_option_timestamp_echo(struct sock *sk,
					      struct sk_buff *skb)
{
	struct dccp_sock *dp = dccp_sk(sk);
#ifdef CONFIG_IP_DCCP_DEBUG
	const char *debug_prefix = dp->dccps_role == DCCP_ROLE_CLIENT ?
					"CLIENT TX opt: " : "server TX opt: ";
#endif
	struct timeval now;
	u32 tstamp_echo;
	u32 elapsed_time;
	int len, elapsed_time_len;
	unsigned char *to;

	dccp_timestamp(sk, &now);
	elapsed_time = timeval_delta(&now, &dp->dccps_timestamp_time) / 10;
	elapsed_time_len = dccp_elapsed_time_len(elapsed_time);
	len = 6 + elapsed_time_len;

	if (DCCP_SKB_CB(skb)->dccpd_opt_len + len > DCCP_MAX_OPT_LEN) {
		LIMIT_NETDEBUG(KERN_INFO "DCCP: packet too small to insert "
					 "timestamp echo!\n");
		return;
	}

	DCCP_SKB_CB(skb)->dccpd_opt_len += len;

	to    = skb_push(skb, len);
	*to++ = DCCPO_TIMESTAMP_ECHO;
	*to++ = len;

	tstamp_echo = htonl(dp->dccps_timestamp_echo);
	memcpy(to, &tstamp_echo, 4);
	to += 4;
	
	if (elapsed_time_len == 2) {
		const u16 var16 = htons((u16)elapsed_time);
		memcpy(to, &var16, 2);
	} else if (elapsed_time_len == 4) {
		const u32 var32 = htonl(elapsed_time);
		memcpy(to, &var32, 4);
	}

	dccp_pr_debug("%sTIMESTAMP_ECHO=%u, len=%d, seqno=%llu\n",
		      debug_prefix, dp->dccps_timestamp_echo,
		      len,
		      (unsigned long long) DCCP_SKB_CB(skb)->dccpd_seq);

	dp->dccps_timestamp_echo = 0;
	dp->dccps_timestamp_time.tv_sec = 0;
	dp->dccps_timestamp_time.tv_usec = 0;
}
Example #3
0
static int dccp_insert_option_timestamp_echo(struct dccp_sock *dp,
        struct dccp_request_sock *dreq,
        struct sk_buff *skb)
{
    __be32 tstamp_echo;
    unsigned char *to;
    u32 elapsed_time, elapsed_time_len, len;

    if (dreq != NULL) {
        elapsed_time = dccp_timestamp() - dreq->dreq_timestamp_time;
        tstamp_echo  = htonl(dreq->dreq_timestamp_echo);
        dreq->dreq_timestamp_echo = 0;
    } else {
        elapsed_time = dccp_timestamp() - dp->dccps_timestamp_time;
        tstamp_echo  = htonl(dp->dccps_timestamp_echo);
        dp->dccps_timestamp_echo = 0;
    }

    elapsed_time_len = dccp_elapsed_time_len(elapsed_time);
    len = 6 + elapsed_time_len;

    if (DCCP_SKB_CB(skb)->dccpd_opt_len + len > DCCP_MAX_OPT_LEN)
        return -1;

    DCCP_SKB_CB(skb)->dccpd_opt_len += len;

    to    = skb_push(skb, len);
    *to++ = DCCPO_TIMESTAMP_ECHO;
    *to++ = len;

    memcpy(to, &tstamp_echo, 4);
    to += 4;

    if (elapsed_time_len == 2) {
        const __be16 var16 = htons((u16)elapsed_time);
        memcpy(to, &var16, 2);
    } else if (elapsed_time_len == 4) {
        const __be32 var32 = htonl(elapsed_time);
        memcpy(to, &var32, 4);
    }

    return 0;
}
Example #4
0
void dccp_insert_option_elapsed_time(struct sock *sk,
				     struct sk_buff *skb,
				     u32 elapsed_time)
{
#ifdef CONFIG_IP_DCCP_DEBUG
	struct dccp_sock *dp = dccp_sk(sk);
	const char *debug_prefix = dp->dccps_role == DCCP_ROLE_CLIENT ?
					"CLIENT TX opt: " : "server TX opt: ";
#endif
	const int elapsed_time_len = dccp_elapsed_time_len(elapsed_time);
	const int len = 2 + elapsed_time_len;
	unsigned char *to;

	if (elapsed_time_len == 0)
		return;

	if (DCCP_SKB_CB(skb)->dccpd_opt_len + len > DCCP_MAX_OPT_LEN) {
		LIMIT_NETDEBUG(KERN_INFO "DCCP: packet too small to "
					 "insert elapsed time!\n");
		return;
	}

	DCCP_SKB_CB(skb)->dccpd_opt_len += len;

	to    = skb_push(skb, len);
	*to++ = DCCPO_ELAPSED_TIME;
	*to++ = len;

	if (elapsed_time_len == 2) {
		const u16 var16 = htons((u16)elapsed_time);
		memcpy(to, &var16, 2);
	} else {
		const u32 var32 = htonl(elapsed_time);
		memcpy(to, &var32, 4);
	}

	dccp_pr_debug("%sELAPSED_TIME=%u, len=%d, seqno=%llu\n",
		      debug_prefix, elapsed_time,
		      len,
		      (unsigned long long) DCCP_SKB_CB(skb)->dccpd_seq);
}