вторник, 20 января 2015 г.

Драйверы и модули ядра Linux (очередной цикл обновлений)

Предыдущий цикл обновлений рукописи "Драйверы и модули ядра Linux" завершён 10 июля 2014 года, одновременно с завершением цикла лекций по этому материалу для разработчиков компании  Global Logic, а также преподавателей и аспирантов некскольких киевских университетов.
Я предполагал некоторое время ... пожить спокойно, не возвращаться к этому тексту и архиву примеров кодов к нему. Если бы не...
... в версии ядра 3.17 разработчики радикально поменяли прототипы ключевых макросов ... по-крайней мере, то что мне сразу удалось отследить - в подсистеме сетевого стека ("удалось отследить" - это то, что сразу перестали компилироваться как драйвер, например, WiFi чипа Broadcom Corporation BCM43228, так и полтора десятка примеров модулей в архиве этой рукописи).
Какие изменения (те, что я заметил):

1. В <linux/netdevice.h> - создание сетевого интерфейса: 

- было:
#define alloc_netdev( sizeof_priv, name, setup )

- стало:
#define alloc_netdev( sizeof_priv, name, name_assign_type, setup )

Как легко видеть, теперь вместо 3-х параметров 4, 3-й из которых — константа, определяющая порядок нумерации создаваемых интерфейсов, описанная в том же файле определений:
/* interface name assignment types (sysfs name_assign_type attribute) */
#define NET_NAME_UNKNOWN     0 /* unknown origin (not exposed to userspace) */
#define NET_NAME_ENUM        1 /* enumerated by kernel */
#define NET_NAME_PREDICTABLE 2 /* predictably named by the kernel */
#define NET_NAME_USER        3 /* provided by user-space */
#define NET_NAME_RENAMED     4 /* renamed by user-space */


2. Во всём, что касается стандартов WiFi (файл <net/cfg802211.h>) ... в тексте и примерах это никак не нашло отражения, но всё же : начиная с 3.14 ядра изменилось число параметров и стало:
/*
 * cfg80211_ibss_joined - notify cfg80211 that device joined an IBSS
 * @dev: network device
 * @bssid: the BSSID of the IBSS joined
 * @channel: the channel of the IBSS joined
 * @gfp: allocation flags
 *
 * This function notifies cfg80211 that the device joined an IBSS or
 * switched to a different BSSID. Before this function can be called,
 * either a beacon has to have been received from the IBSS, or one of
 * the cfg80211_inform_bss{,_frame} functions must have been called
 * with the locally generated beacon -- this guarantees that there is
 * always a scan result for this IBSS. cfg80211 will handle the rest.
 */
void cfg80211_ibss_joined( struct net_device *dev, const u8 *bssid,
                           struct ieee80211_channel *channel, gfp_t gfp );


Здесь новый 3-й параметр имеет определение (в том же <net/cfg802211.h>):
/*
 * struct ieee80211_channel - channel definition
 *
 * This structure describes a single channel for use
 * with cfg80211.
 *
 * @center_freq: center frequency in MHz
 * @hw_value: hardware-specific value for the channel
 * @flags: channel flags from &enum ieee80211_channel_flags.
 * @orig_flags: channel flags at registration time, used by regulatory
 * code to support devices with additional restrictions
 * @band: band this channel belongs to.
 * @max_antenna_gain: maximum antenna gain in dBi
 * @max_power: maximum transmission power (in dBm)
 * @max_reg_power: maximum regulatory transmission power (in dBm)
 * @beacon_found: helper to regulatory code to indicate when a beacon
 * has been found on this channel. Use regulatory_hint_found_beacon()
 * to enable this, this is useful only on 5 GHz band.
 * @orig_mag: internal use
 * @orig_mpwr: internal use
 * @dfs_state: current state of this channel. Only relevant if radar is required
 * on this channel.
 * @dfs_state_entered: timestamp (jiffies) when the dfs state was entered.
 * @dfs_cac_ms: DFS CAC time in milliseconds, this is valid for DFS channels.
 */
struct ieee80211_channel {
   enum ieee80211_band band;
   u16 center_freq;
   u16 hw_value;
   u32 flags;
   int max_antenna_gain;
   int max_power;
   int max_reg_power;
   bool beacon_found;
   u32 orig_flags;
   int orig_mag, orig_mpwr;
   enum nl80211_dfs_state dfs_state;
   unsigned long dfs_state_entered;
   unsigned int dfs_cac_ms;
};

Как это обычно бывает, в старых кодах драйверов, вместо этого 3-го параметра в вызовах cfg80211_ibss_joined(), можно поставить просто NULL (проверено - работает для BCM43228).

В итоге - пришлось сесть за пересмотр текста и примеров раньше, чем это планировалось.

Желающие смогут свободно обновить свой экземпляр текста и примеров кода.
Как и раньше, всё это предоставляется под лицензией Creative Commons Attribution ShareAlike (http://legalfoto.ru/licenzii/), о которой, если кому неизвестно, читайте подробнее в более ранних сообщениях.

Номер последней редакции: 223
Объём (страниц): 425
Размер файла текста: 1478880
Размер архива кодов:  893557
Дата размещения: 20 января 2015

Скачать эту редакцию текст и архив примеров к нему можно:
Googleтекст и архив 
Yandex: текст и архив