Архив за Февраль 2009

Повышение надежности неуправляемых коммутаторов

Одной из основных проблем недорогих неуправляемых коммутаторов, является их зависание при перепадах напряжения. Замена блоков питания на импульсные улучшает ситуацию, т.к. расширяется диапазон входных рабочих напряжений, но не решает полностью.

Решением, является доработка цепей сброса чипа коммутатора. Для сброса используется супервизор питания фирмы Microchip MCP100-315-01TO на напряжение 3.15В.

Для примера приведены фото переделки свичей (на чипах Realtek):

Smart-switch PS2216 Compex

img_0694img_0651

Слева — после, справа — до переделки. Удаляются 2 детали- диод и электролит. На их место впаивается супервизор.

Switch CN-DO8P Canyon

img_0701img_0699

Слева — после, справа — до переделки. Перерезается дорожка от диода к питанию +1.9В и зачищаются площадки под землю и питание +3.3В. К площадкам припаивается супервизор.

Таким образом может быть переделан любой свич имеющий питание на 3.3В. В некоторых модификациях других фирм этого питания нет. Решается это с помощью стабилитрона на 3.9В (КС139А/КС439А) и резистора 820 ом. Питание берется нестабилизированное +12В. +3.9В подается на среднюю ножку супервизора.

По указанной технологии переделано больше 100 свичей.

P.S. В свичах фирмы D-Link уже стоит какая-то фигня по сбросу и у них проблем с зависанием нет. Зато у них другая проблема — плохая работа на длинных линиях.

Теги: , , , , , , , , ,

Увеличение числа групп в mpcs

В mpcs для объединения аккаунтов и ридеров используется понятие группы. Число групп — это битовое поле и ограничено 32 битным значением. Эту величину можно достаточно безболезненно увеличить до 64.

Для этого накладывается следующий патч.

Теги: , ,

Продолжение: НТВ+, mpcs и Кинорейс

После модификации исходников mpcs осталась проблема с каналами Кинорейс для протокола newcamd.

Проанализировав исходники и отрассировав в режиме отладки mpcs оказалось, что длины буферов под ecm все равно не хвататает. Вот два изменения:

--- module-newcamd.c.orig       2008-12-12 20:17:14.000000000 +0200
+++ module-newcamd.c    2009-02-03 14:30:31.000000000 +0200
@@ -1,6 +1,6 @@
 #include "globals.h"
 
-#define CWS_NETMSGSIZE 256
+#define CWS_NETMSGSIZE 256+3
 
 typedef unsigned char uint8;
 typedef unsigned short uint16;
 
--- des.c.orig  2008-11-26 21:09:50.000000000 +0200
+++ des.c       2009-02-03 14:29:09.000000000 +0200
@@ -516,7 +516,7 @@
   }
 }
 
-#define CWS_NETMSGSIZE 256
+#define CWS_NETMSGSIZE 256+3
 
 int des_encrypt(byte *buffer, int len, byte *deskey)
 {

На будущее для любителей трассировки в режиме отладки еще один патч (есть вероятность, что длину еще могут изменить):

--- module-newcamd.c.orig       2008-12-12 20:17:14.000000000 +0200
+++ module-newcamd.c    2009-02-03 14:30:31.000000000 +0200
@@ -96,7 +98,9 @@
   if (!buffer || handle < 0)
     return -1;
   len = recv(handle, netbuf, 2, 0);
-  cs_debug("nmr(): len=%d, errno=%d", len, (len==-1)?errno:0);
+  cs_debug("nmr(): len=%d, errno=%d, netbuf=(%X|%X)->(%X), %d > %d",
+    len, (len==-1)?errno:0,netbuf[0],netbuf[1],(netbuf[0] << 8 ),
+    ((netbuf[0] << 8 ) | netbuf[1]),(CWS_NETMSGSIZE - 2));
   if (!len) {
     cs_debug("nmr: 1 return 0");
     network_tcp_connection_close(handle);
@@ -107,8 +111,9 @@
     network_tcp_connection_close(handle);
     return -1;
   }
-  if (((netbuf[0] << 8 ) | netbuf[1]) > CWS_NETMSGSIZE - 2) {
-    cs_debug("nmr: 1 return -1");
+  if (((netbuf[0] << 8 ) | netbuf[1]) > CWS_NETMSGSIZE - 2
+       /*&& (netbuf[0] << 8 )<=256*/ ) {
+    cs_debug("nmr: 1 return -1, (%X | %X)",(netbuf[0] << 8 ) ,netbuf[1]);
     return -1;
   }
 
@@ -117,8 +122,9 @@
     cs_debug("nmr: 2 return 0");
     return 0;
   }
+  cs_debug("nmr(): 2 len=%d", len);
   if (len != ((netbuf[0] << 8 ) | netbuf[1])) {
-    cs_debug("nmr: 2 return -1");
+    cs_debug("nmr: 2 return -1, (%X | %X)",(netbuf[0] << 8 ) ,netbuf[1]);
     return -1;
   }
   len += 2;

Локальная копия mpcs, патчи module-newcamd.c и des.c

Теги: , , , , , ,