Freebox V5 ADSL

  • État Fermée
  • Pourcentage achevé
    100%
  • Type Anomalie
  • Catégorie Routeur
  • Assignée à Personne
  • Système d'exploitation Tous
  • Sévérité Haute
  • Priorité Très Basse
  • Basée sur la version 1.2.4
  • Due pour la version Non décidée
  • Échéance Non décidée
  • Votes
  • Privée
Concerne le projet: Freebox V5 ADSL
Ouverte par ArsZen - 09/06/2009
Dernière modification par mbizon - 09/06/2009

FS#3315 - Header HOST aux messages UPnP du IGD

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.
Fermée par  mbizon
02.07.2009 16:31
Raison de la fermeture :  Résolu
ArsZen a commenté le 09.06.2009 12:05

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();
  }

}


Admin
mbizon a commenté le 09.06.2009 12:16

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

ArsZen a commenté le 09.06.2009 12:19

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

Merci bien.

ArsZen a commenté le 09.06.2009 12:39

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

Admin
mbizon a commenté le 02.07.2009 15:45

Bonjour,

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

ArsZen a commenté le 02.07.2009 16:28

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

Merci ! :)

Chargement...

Activer les raccourcis clavier

Liste des tâches

Détails de la tâche

Édition de la tâche