Freebox ADSL

Se connecter
Mot de passe perdu? Pour s'inscrire sur Freeplayer.org cliquez ICI

du projet:

Ce projet correspond aux bugs détectés ou aux demandes d'évolutions pour la Freebox ADSL / V5 (la petite soeur de la freebox HD)

Merci de vérifier qu'un bug n'existe pas déjà avant d'en rajouter un. N'indiquez ici que les bugs ou les demandes d'évolutions concernant la freebox ADSL (Téléphonie, réseau...)

Pour les remarques concernant la freebox HD, vous pouvez le faire ICI

FS#3315 — Header HOST aux messages UPnP du IGD

Concerne le projet— Freebox ADSL
Ouverte par ArsZen (ArsZen) - mardi 9 juin, 2009 14:03:19
Dernière édition par Maxime Bizon (mbizon) - mardi 9 juin, 2009 14:17:04
Anomalie
Routeur
FERME
Personne
Tous
Haute
Normale
1.2.4
Non décidé
Non décidé
100%
Les message de NOTIFY que la Frebox ADSL envoie toutes les minutes pour signaler que son IGD est toujours présent n'ont pas de header HOST ; certains control points UPnP ne voient plus le IGD 4 minutes après la réponse au message M-SEARCH initial ; tous les programmes Java qui utilisent le UPnP CyberLink sont dans ce cas (le plus utilisé).

NOTIFY * HTTP/1.0
SERVER: UPnP/1.0 fbxigdd/1.0
LOCATION: http://192.168.0.254:5678/desc/root
CACHE-CONTROL: max-age=180
NT: upnp:rootdevice
NTS: ssdp:alive
USN: uuid:73616d61-3a65-7374-650a-0006cbb69d40::upnp:rootdevice


Ce header est required dans la "UPnP™ Device Architecture version 1.0" (http://www.upnp.org/specs/arch/UPnP-arch-DeviceArchitecture-v1.0.pdf, page 15) pour avoir des messages compatibles HTTPMU, HTTP over multicast UDP.

Solution :
ajouter une ligne "HOST: 239.255.255.250:1900" aux messages SSDP, pour qu'ils soient conformes à la spécification UPnP.
Cette tâche dépend de

Cette tâche bloque la fermeture de
Fermée par  Maxime Bizon (mbizon)
Date:  jeudi 2 juillet, 2009 18:31:47
Raison de clôture:  Bug corrigé
Commentaire de ArsZen (ArsZen) - mardi 9 juin, 2009 14:05:19

Ce petit programme Java permet de vérifier ce bug, pour ceux qui ont un JDK 5 ou plus :

--------
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetSocketAddress;
import java.net.MulticastSocket;
import java.net.SocketAddress;
import java.net.SocketTimeoutException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;

public class QuietControlPoint implements Runnable {

private static final Logger LOGGER = Logger.getLogger(QuietControlPoint.class.getName());
private static final String CHARSET_NAME = "UTF-8";
private static final String SSDP_IP = "239.255.255.250";
private static final int SSDP_PORT = 1900;
private static final SocketAddress SSDP_ADDRESS = new InetSocketAddress(SSDP_IP, SSDP_PORT);
private static final int BUF_SIZE = 16 * 1024;
private static final int PACKET_LENGTH = 2 * 1024;
private static final int SO_TIMEOUT = 250;
private final ExecutorService queue = Executors.newSingleThreadExecutor();
private MulticastSocket socket;
private byte[] buffer = new byte[BUF_SIZE];
private int offset = 0;
private DatagramPacket input = new DatagramPacket(buffer, offset, PACKET_LENGTH);

public void run() {
try {
try {
init();
while (System.in.available() == 0) {
try {
receive();
} catch (final SocketTimeoutException ignore) {
continue;
}
}
} finally {
try {
close();
} catch (final IOException ignore) {
LOGGER.log(Level.SEVERE, "", ignore);
}
}
} catch (final Throwable ignore) {
LOGGER.log(Level.SEVERE, "", ignore);
}
}

private void init() throws IOException {
socket = new MulticastSocket(new InetSocketAddress(SSDP_PORT));
socket.setSoTimeout(SO_TIMEOUT);
socket.setLoopbackMode(false);
socket.joinGroup(SSDP_ADDRESS, null);
}

protected void receive() throws IOException {
socket.receive(input);
queue.submit(new Parser(input));

offset = input.getOffset() + input.getLength();
if ((BUF_SIZE - PACKET_LENGTH) < offset) {
buffer = new byte[BUF_SIZE];
offset = 0;
}
input = new DatagramPacket(buffer, offset, PACKET_LENGTH);
}

private void close() throws IOException {
socket.leaveGroup(SSDP_ADDRESS, null);
socket.close();
socket = null;
queue.shutdown();
}

private static class Parser implements Runnable {

private final long now = System.currentTimeMillis();
private final DatagramPacket packet;

private Parser(final DatagramPacket packet) {
this.packet = packet;
}

public void run() {
try {
final String string = new String(packet.getData(), packet.getOffset(), packet.getLength(),
CHARSET_NAME);
final StringBuilder builder = new StringBuilder();
builder.append(packet.getSocketAddress()).append("\n").append(string);
final LogRecord record = new LogRecord(Level.INFO, builder.toString());
record.setMillis(now);
LOGGER.log(record);
} catch (final Throwable ignore) {
LOGGER.log(Level.SEVERE, "", ignore);
}
}
}

public static void main(final String[] args) {
final Thread thread = new Thread(new QuietControlPoint());
thread.setName(QuietControlPoint.class.getSimpleName());
thread.start();
}
}
--------


Commentaire de Maxime Bizon (mbizon) - mardi 9 juin, 2009 14:16:53


Effectivement, merci pour le bug report, ca sera corrigé dans la prochaine version du firmware.


Commentaire de ArsZen (ArsZen) - mardi 9 juin, 2009 14:19:42

Oh, rapide ! :)
J'aime ! :)

Merci bien.


Commentaire de ArsZen (ArsZen) - mardi 9 juin, 2009 14:39:40

Le plus long a été de trouver où signaler ce bug.


Commentaire de Maxime Bizon (mbizon) - jeudi 2 juillet, 2009 17:45:58


Bonjour,

Ca devrait être bon avec la version 1.5.5, vous confirmez ?


Commentaire de ArsZen (ArsZen) - jeudi 2 juillet, 2009 18:28:02

Oui, maintenant, depuis la 1.5.5 c'est impeccable : le IGD est reconnu en permanence.

Merci ! :)