[prev in list] [next in list] [prev in thread] [next in thread] 

List:       gnokii-users
Subject:    [PATCH] dynamic in/out buffers for PHONET
From:       "Alexey I. Froloff" <raorn () altlinux ! ru>
Date:       2006-02-24 20:24:46
Message-ID: 20060224202446.GA25517 () hell ! immo ! ru
[Download RAW message or body]

[Attachment #2 (multipart/signed)]

[Attachment #4 (multipart/mixed)]


I am getting "PHONET: Message buffer overun - resetting" mesage
while trying to --getringtonelist on my 6310i via bluetooth.
This happens because input buffer is too small (1010 bytes, and
my phose sends 1050-byte message).  Also, output buffer is fixed
and outgoing message is not checked to fit in it.  This patch
fixed both issues.

Another issue, I was getting "Getting ringtone NNN failed: Wrong
size of the object." because it contains more than 256 notes.
Increasing GN_RINGTONE_MAX_NOTES from 256 to 1024 helps.

--=20
Regards,
Sir Raorn.

["gnokii-0.6.11-alt-phonet-buf.patch" (text/plain)]

diff -urN gnokii-0.6.11-orig/common/links/fbus-phonet.c \
                gnokii-0.6.11/common/links/fbus-phonet.c
--- gnokii-0.6.11-orig/common/links/fbus-phonet.c	2006-02-16 01:49:56 +0300
+++ gnokii-0.6.11/common/links/fbus-phonet.c	2006-02-24 22:53:44 +0300
@@ -172,6 +172,15 @@
 		i->state = FBUS_RX_GetMessage;
 		i->buffer_count = 0;
 
+		if (i->message_buffer)
+			free(i->message_buffer);
+
+		if ((i->message_buffer = malloc(i->message_length)) == NULL) {
+			dprintf("PHONET: Not enough memory for message buffer\n");
+			i->state = FBUS_RX_Sync;
+			break;
+		}
+
 		break;
 
 	case FBUS_RX_GetMessage:
@@ -179,12 +188,6 @@
 		i->message_buffer[i->buffer_count] = rx_byte;
 		i->buffer_count++;
 
-		if (i->buffer_count > PHONET_FRAME_MAX_LENGTH) {
-			dprintf("PHONET: Message buffer overun - resetting\n");
-			i->state = FBUS_RX_Sync;
-			break;
-		}
-
 		/* Is that it? */
 
 		if (i->buffer_count == i->message_length) {
@@ -230,14 +233,15 @@
 static gn_error phonet_send_message(unsigned int messagesize, unsigned char \
messagetype, unsigned char *message, struct gn_statemachine *state)  {
 
-	u8 out_buffer[PHONET_TRANSMIT_MAX_LENGTH + 5];
+	u8 *out_buffer;
 	int current = 0;
 	int total, sent;
 
 	if (!state)
 		return GN_ERR_FAILED;
 
-	/* FIXME - we should check for the message length ... */
+	if ((out_buffer = malloc(messagesize + 6)) == NULL)
+		return GN_ERR_MEMORYFULL;
 
 	/* Now construct the message header. */
 
@@ -279,6 +283,8 @@
 		else current += sent;
 	} while (current < total);
 
+	free(out_buffer);
+
 	sm_incoming_acknowledge(state);
 
 	return GN_ERR_NONE;
diff -urN gnokii-0.6.11-orig/common/links/fbus-phonet.c.orig \
                gnokii-0.6.11/common/links/fbus-phonet.c.orig
--- gnokii-0.6.11-orig/common/links/fbus-phonet.c.orig	1970-01-01 03:00:00 +0300
+++ gnokii-0.6.11/common/links/fbus-phonet.c.orig	2006-02-16 01:49:56 +0300
@@ -0,0 +1,324 @@
+/*
+
+  $Id: fbus-phonet.c,v 1.40 2005/04/20 20:43:32 pkot Exp $
+
+  G N O K I I
+
+  A Linux/Unix toolset and driver for the mobile phones.
+
+  This file is part of gnokii.
+
+  Gnokii is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
+
+  Gnokii is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with gnokii; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+  Copyright (C) 1999-2000 Hugh Blemings & Pavel Janík ml.
+  Copyright (C) 2000-2001 Chris Kemp
+  Copyright (C) 2001-2004 Pawel Kot
+  Copyright (C) 2001      Manfred Jonsson, Martin Jancar
+  Copyright (C) 2002      Ladis Michl
+  Copyright (C) 2002-2003 BORBELY Zoltan
+
+  This file provides an API for accessing functions via fbus over irda.
+  See README for more details on supported mobile phones.
+
+  The various routines are called phonet_(whatever).
+
+*/
+
+
+/* System header files */
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+/* Various header file */
+#include "config.h"
+#include "compat.h"
+#include "misc.h"
+#include "gnokii.h"
+#include "device.h"
+#include "links/fbus-phonet.h"
+#include "links/fbus.h"
+#include "gnokii-internal.h"
+
+static void phonet_rx_statemachine(unsigned char rx_byte, struct gn_statemachine \
*state); +static gn_error phonet_send_message(unsigned int messagesize, unsigned char \
messagetype, unsigned char *message, struct gn_statemachine *state); +
+
+#define FBUSINST(s) (*((phonet_incoming_message **)(&(s)->link.link_instance)))
+
+#define FBUS_PHONET_BLUETOOTH_INITSEQ 0xd0, 0x00, 0x01
+
+/*--------------------------------------------*/
+
+static bool phonet_open(struct gn_statemachine *state)
+{
+	int result, i, n, total = 0;
+	unsigned char init_sequence[] = { FBUS_PHONET_BLUETOOTH_FRAME_ID,
+					  FBUS_DEVICE_PHONE,
+					  FBUS_PHONET_BLUETOOTH_DEVICE_PC,
+					  FBUS_PHONET_BLUETOOTH_INITSEQ,
+					  0x04};
+	unsigned char init_resp[7];
+	unsigned char init_pattern[7] = { FBUS_PHONET_BLUETOOTH_FRAME_ID,
+					 FBUS_PHONET_BLUETOOTH_DEVICE_PC,
+					 FBUS_DEVICE_PHONE,
+					 FBUS_PHONET_BLUETOOTH_INITSEQ,
+					 0x05};
+
+	if (!state)
+		return false;
+
+	memset(&init_resp, 0, 7);
+
+	/* Open device. */
+	result = device_open(state->config.port_device, false, false, false,
+			     state->config.connection_type, state);
+
+	if (!result) {
+		perror(_("Couldn't open PHONET device"));
+		return false;
+	}
+
+	if (state->config.connection_type == GN_CT_Bluetooth) {
+		device_write(&init_sequence, 7, state);
+		while (total < 7) {
+			n = device_read(&init_resp + total, 7 - total, state);
+			total += n;
+		}
+		for (i = 0; i < n; i++) {
+			if (init_resp[i] != init_pattern[i]) {
+				dprintf("Incorrect byte in the answer\n");
+				return false;
+			}
+		}
+	}
+
+	return true;
+}
+
+/* RX_State machine for receive handling.  Called once for each character
+   received from the phone. */
+static void phonet_rx_statemachine(unsigned char rx_byte, struct gn_statemachine \
*state) +{
+	phonet_incoming_message *i = FBUSINST(state);
+
+	/* FIXME: perhaps we should return something here */
+	if (!i)
+		return;
+
+	switch (i->state) {
+	case FBUS_RX_Sync:
+		if (rx_byte == FBUS_PHONET_FRAME_ID ||
+		    rx_byte == FBUS_PHONET_BLUETOOTH_FRAME_ID ||
+		    rx_byte == FBUS_PHONET_DKU2_FRAME_ID) {
+			i->state = FBUS_RX_GetDestination;
+		}
+		break;
+
+	case FBUS_RX_GetDestination:
+
+		i->message_destination = rx_byte;
+		i->state = FBUS_RX_GetSource;
+
+		if (rx_byte != FBUS_DEVICE_PC &&
+		    rx_byte != FBUS_PHONET_DKU2_DEVICE_PC &&
+		    rx_byte != FBUS_PHONET_BLUETOOTH_DEVICE_PC) {
+			i->state = FBUS_RX_Sync;
+			dprintf("The fbus stream is out of sync - expected 0x0c, got 0x%02x\n", rx_byte);
+		}
+		break;
+
+	case FBUS_RX_GetSource:
+
+		i->message_source = rx_byte;
+		i->state = FBUS_RX_GetType;
+
+		if (rx_byte != FBUS_DEVICE_PHONE) {
+			i->state = FBUS_RX_Sync;
+			dprintf("The fbus stream is out of sync - expected 0x00, got 0x%02x\n", rx_byte);
+		}
+
+		break;
+
+	case FBUS_RX_GetType:
+
+		i->message_type = rx_byte;
+		i->state = FBUS_RX_GetLength1;
+
+		break;
+
+	case FBUS_RX_GetLength1:
+
+		i->message_length = rx_byte << 8;
+		i->state = FBUS_RX_GetLength2;
+
+		break;
+
+	case FBUS_RX_GetLength2:
+
+		i->message_length = i->message_length + rx_byte;
+		i->state = FBUS_RX_GetMessage;
+		i->buffer_count = 0;
+
+		break;
+
+	case FBUS_RX_GetMessage:
+
+		i->message_buffer[i->buffer_count] = rx_byte;
+		i->buffer_count++;
+
+		if (i->buffer_count > PHONET_FRAME_MAX_LENGTH) {
+			dprintf("PHONET: Message buffer overun - resetting\n");
+			i->state = FBUS_RX_Sync;
+			break;
+		}
+
+		/* Is that it? */
+
+		if (i->buffer_count == i->message_length) {
+			sm_incoming_function(i->message_type, i->message_buffer, i->message_length, \
state); +			i->state = FBUS_RX_Sync;
+		}
+		break;
+	default:
+		i->state = FBUS_RX_Sync;
+		break;
+	}
+}
+
+
+/* This is the main loop function which must be called regularly */
+/* timeout can be used to make it 'busy' or not */
+
+static gn_error phonet_loop(struct timeval *timeout, struct gn_statemachine *state)
+{
+	gn_error	error = GN_ERR_INTERNALERROR;
+	unsigned char	buffer[255];
+	int		count, res;
+
+	res = device_select(timeout, state);
+
+	if (res > 0) {
+		res = device_read(buffer, 255, state);
+		for (count = 0; count < res; count++) {
+			phonet_rx_statemachine(buffer[count], state);
+		}
+		if (res > 0) {
+			error = GN_ERR_NONE;	/* This traps errors from device_read */
+		}
+	} else if (!res) {
+		error = GN_ERR_TIMEOUT;
+	}
+
+	return error;
+}
+
+/* Main function to send an fbus message */
+
+static gn_error phonet_send_message(unsigned int messagesize, unsigned char \
messagetype, unsigned char *message, struct gn_statemachine *state) +{
+
+	u8 out_buffer[PHONET_TRANSMIT_MAX_LENGTH + 5];
+	int current = 0;
+	int total, sent;
+
+	if (!state)
+		return GN_ERR_FAILED;
+
+	/* FIXME - we should check for the message length ... */
+
+	/* Now construct the message header. */
+
+	if (state->config.connection_type == GN_CT_Bluetooth) {
+		out_buffer[current++] = FBUS_PHONET_BLUETOOTH_FRAME_ID;
+		out_buffer[current++] = FBUS_DEVICE_PHONE;
+		out_buffer[current++] = FBUS_PHONET_BLUETOOTH_DEVICE_PC;
+	} else if (state->config.connection_type == GN_CT_DKU2) {
+		out_buffer[current++] = FBUS_PHONET_DKU2_FRAME_ID;
+		out_buffer[current++] = FBUS_DEVICE_PHONE;
+		out_buffer[current++] = FBUS_PHONET_DKU2_DEVICE_PC;
+	} else {
+		out_buffer[current++] = FBUS_PHONET_FRAME_ID;
+		out_buffer[current++] = FBUS_DEVICE_PHONE; /* Destination */
+		out_buffer[current++] = FBUS_DEVICE_PC;    /* Source */
+	}
+
+	out_buffer[current++] = messagetype; /* Type */
+
+	out_buffer[current++] = (messagesize & 0xff00) >> 8;
+	out_buffer[current++] = (messagesize & 0x00ff);
+
+	/* Copy in data if any. */
+
+	if (messagesize > 0) {
+		memcpy(out_buffer + current, message, messagesize);
+		current += messagesize;
+	}
+
+	/* Send it out... */
+
+	total = current;
+	current = 0;
+	sent = 0;
+
+	do {
+		sent = device_write(out_buffer + current, total - current, state);
+		if (sent < 0) return GN_ERR_FAILED;
+		else current += sent;
+	} while (current < total);
+
+	sm_incoming_acknowledge(state);
+
+	return GN_ERR_NONE;
+}
+
+/* Initialise variables and start the link */
+gn_error phonet_initialise(struct gn_statemachine *state)
+{
+	gn_error error = GN_ERR_FAILED;
+
+	if (!state)
+		return error;
+
+	/* Fill in the link functions */
+	state->link.loop = &phonet_loop;
+	state->link.send_message = &phonet_send_message;
+
+	if ((FBUSINST(state) = calloc(1, sizeof(phonet_incoming_message))) == NULL)
+		return GN_ERR_MEMORYFULL;
+
+	switch (state->config.connection_type) {
+	case GN_CT_Infrared:
+	case GN_CT_Irda:
+	case GN_CT_DKU2:
+	case GN_CT_Bluetooth:
+		if (phonet_open(state) == true)
+			error = GN_ERR_NONE;
+		break;
+	default:
+		break;
+	}
+	if (error != GN_ERR_NONE) {
+		free(FBUSINST(state));
+		FBUSINST(state) = NULL;
+		return error;
+	}
+
+	/* Init variables */
+	FBUSINST(state)->state = FBUS_RX_Sync;
+	FBUSINST(state)->buffer_count = 0;
+
+	return error;
+}
diff -urN gnokii-0.6.11-orig/include/links/fbus-phonet.h \
                gnokii-0.6.11/include/links/fbus-phonet.h
--- gnokii-0.6.11-orig/include/links/fbus-phonet.h	2006-02-16 01:49:56 +0300
+++ gnokii-0.6.11/include/links/fbus-phonet.h	2006-02-24 22:53:04 +0300
@@ -63,7 +63,7 @@
 	int message_destination;
 	int message_type;
 	int message_length;
-	char message_buffer[PHONET_FRAME_MAX_LENGTH];
+	char *message_buffer;
 } phonet_incoming_message;
 
 #endif   /* #ifndef _gnokii_links_fbus_phonet_h */


["gnokii-0.6.11-alt-ringtone.patch" (text/plain)]

diff -urN gnokii-0.6.11-orig/include/gnokii/ringtones.h gnokii-0.6.11/include/gnokii/ringtones.h
--- gnokii-0.6.11-orig/include/gnokii/ringtones.h	2006-02-16 01:49:56 +0300
+++ gnokii-0.6.11/include/gnokii/ringtones.h	2006-02-24 01:02:46 +0300
@@ -42,7 +42,7 @@
 /* ie. c#=1 and 5 and 13 are invalid */
 /* note=255 means a pause */
 
-#define GN_RINGTONE_MAX_NOTES 256
+#define GN_RINGTONE_MAX_NOTES 1024
 
 /* Structure to hold note of ringtone. */
 

["signature.asc" (application/pgp-signature)]

_______________________________________________
gnokii-users mailing list
gnokii-users@nongnu.org
http://lists.nongnu.org/mailman/listinfo/gnokii-users


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic