Friday, June 26, 2009

Notify в PostgreSQL

Весьма часто, несмотря на некий экспириенс в той или иной области, обнаруживаются вещи, сродни анекдоту про тетрис, с "а фигуры-то можно переворачивать".
Вот и теперь - думал, что notify в postgresql организованы как message queue, т.е. сколько раз потриггерили, столько раз получили и пытался этому всячески сопротивляться, делая execute .. for each statement .. вместо for each row и тому подобное. Оказалось, что оно работает как сигналы в unix-like ОС:

"NOTIFY
behaves like Unix signals in one important respect: if the same notification name is signaled multiple times in quick succession, recipients might get only one notification event for several executions of NOTIFY"

что упрощает жизнь, по крайней мере на моих текущих задачах

Wednesday, June 24, 2009

QinQ в FreeBSD

На irc поднялся вопрос, как у нас нынче с поддержкой qinq в любимой системе. Выяснилось, что путь в лоб - создание влана через ifconfig vlan create с указанием vlandev другого влана - не подходит. С другой стороны, выход есть в ng_vlan(4), которых можно цеплять сколь угодно много и теоретически сделать qinqinqinqinqinq.. :). Однако, есть нюанс. В 802.1ad пункте 9.5 написано следующее:
Читать далее...

A distinct Ethertype has been allocated (Table 9-1) for use in the TPID field (9.4) of each tag type so they can be distinguished from each other, and from other protocols.

Далее следует табличка, где рассказывается, что TPID/Ethertype 0x8100 - это customer vlan tag, а тег для правильных пацанов^W^Wservice VLAN tag - 0x88A8.

То, что в списке IANA ethertype 0x88a8 пустует, поначалу удивило. После чтения комментариев и rfc 5342 стало ясно, что актуальный список и функции по регистрации новых ethertype перекочевали к IEEE.

С TPID получилось как обычно - все заимплементили стандарт по-разному и получилось примерно следующее:
Cisco: By default Cisco 7600 series router supports Ethertype 0x8100 for .1Q and Q-in-Q outer tag., при этом есть dot1q tunnelling ethertype <0x88a8>
Juniper: в разных софтах по-разному, 0x8100 и 0x9100, опять же с крутилкой svlan ethertype
Huaway: 0x8100
Extreme Networks: 0x88a8

В FreeBSD жестко забито ethertype = ETHERTYPE_VLAN (0x8100) в соотв. местах (ng_vlan, ether_input, if_vlan). Во многих сетевых драйверах типа em(4) такой же ethertype жестко вбивается как минимум при отправке пакета. Поэтому написание какого-нибудь netgraph message для крутилки будет мало, надо еще и как-то передавать информацию о том, что пакет qinq (например, через mbuf_tags(9)) и рисовать какие-то ioctl для драйверов, чтобы те сохраняли TPID для интерфейса.

Тем не менее, в дефолтном виде (0x8100 везде) с ng_vlan оно заработает, а подкрутить TPID можно и на железке, куда оно воткнуто