SIOCSVIPA または SIOCSVIPA6 ioctl コマンドの使用

ioctl コマンド SIOCSVIPA または SIOCSVIPA6 をアプリケーションで使用すると、そのアプリケーションが実行されているスタック上に動的 VIPA を作成したり、そこから動的 VIPA を削除したりすることができます。アプリケーションは、ランタイム XL C/C++ または UNIX システム・サービス呼び出し可能サービス BPX1IOC API を使用して、 IOCTL 呼び出しを発行できます。 SIOCSVIPA または SIOCSVIPA6 ioctl コマンドを発行するアプリケーションは、APF 許可である必要があります。セキュリティー製品がない場合、あるいはセキュリティー製品が MODDVIPA のプロファイルが定義されていないことを示している場合は、スーパーユーザー権限を持つユーザー ID を使用してアプリケーションを実行する必要があります。MODDVIPA プログラムのプロファイルが定義されている場合は、ID にスーパーユーザー権限がある場合でも、そのユーザー ID はプロファイルの READ アクセスを許可されます。一部のセキュリティー製品は、プロファイルが定義されていない場合、使用可能なアクセスはないことを示します。RACF® を使用していない場合は、これらの ioctl コマンドを使用するために、プロファイルの定義が必要な場合があります。 詳しくは、SIOCSVIPA、 SIOCSVIPA6、 MODDVIPA のためのセキュリティー・プロファイルの定義を参照してください。

新規の動的 VIPA を作成するには、このスタックの PROFILE.TCPIP データ・セット内で VIPARANGE 構成ステートメントによって 既に指定されているサブネット内に、要求された IP アドレスがなければなりません。 SIOCSVIPA または SIOCSVIPA6 ioctl コマンドを使用すると、 分散 DVIPA を除き、スタック上の既存のすべての動的 VIPA を削除することができます。動的 VIPA は、DVR_DEFINE オプションまたは DVR_DEFINE_AFFINITY オプションを使用して作成できます。DVR_DEFINE_AFFINITY オプションは、 それを作成したアドレス・スペースへのアフィニティーを持つ DVIPA を作成します。アフィニティーとともに作成された DVIPA に対する接続要求は、DVIPA を作成したアプリケーション・インスタンスが bind() 呼び出しを発行した場合に、TCP リスナーに 送信されます。マッチング・リスナーが見つからない場合は、 通常の shareport ロード・バランシングを使用して TCP リスナーが選択されます。

以下の例は、IPv4 アドレスを使用するアプリケーション に SIOCSVIPA ioctl コマンドをセットアップする方法を示しています。
#include "ezbzdvpc.h"               /* header that contains 
                                      the structure for
                                      SIOCSVIPA ioctl
                                       and needed constants*/     
struct dvreq dv;                      /* the structure passed
                                         on the ioctl command*/  
dv.dvr_version = DVR_VER1;             /*version               */
dv.dvr_length = sizeof(struct dvreq);  /* structure length     */  
dv.dvr_option = DVR_DEFINE;            /* to define a new   
                                          dynamic VIPA.  Use 
                                          DVR_DELETE to delete
                                          a dynamic VIPA        */
dv.dvr_addr.s_addr = inet_addr(my_ipaddr);  /* where my_ipaddr is
                                                a character string
                                                in standard  
                                                dotted-decimal
                                                notation */ 
                                     

この場合、ioctl コマンドは以下のように呼び出されます。

rc = ioctl(s, SIOCSVIPA, &dv);

以下の例は、IPv6 アドレスをサポートする入力パラメーター・リストを使用して SIOCSVIPA6 ioctl コマンドをセットアップする方法を示しています。

#include "ezbzdvpc.h"           /* header that contains
                                    the structure for
                                    SIOCSVIPA6 ioctl
                                    and needed constants */
 struct dvreq6 dv6;              /* the structure passed on
                                    the ioctl command */
 dv6.dvr6_version = DVR_VER2;   /* version */
 dv6.dvr6_length = sizeof(struct dvreq6); /* structure length */
 dv6.dvr6_option = DVR_DEFINE;  /* to define a new dynamic
                                    VIPA.  Use DVR_DELETE to
                                    delete a dynamic VIPA. */
inet_pton(AF_INET6, my_ipv6addr, dv6.dvr6_addr6.s6_addr);
                                 /* where my_ipv6addr
                                    is a character string in 
                                    standard IPv6 address
                                    notation, representing a
                                    fully qualified IPv6 
                                    address */

この場合、ioctl コマンドは以下のように呼び出されます。

rc = ioctl(s, SIOCSVIPA6, &dv6);

SIOCSVIPA または SIOCSVIPA6 ioctl コマンドは、 非ゼロの errno および errnojr 値を設定してエラー条件を示します。 戻される errnojr 値の説明は、「z/OS Communications Server: IP and SNA Codes」を参照してください。